Changeset 4006


Ignore:
Timestamp:
11/27/10 12:20:48 (10 years ago)
Author:
_network
Message:

add mutex lock for cwcache and add more debug messages for cache problem

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/oscam.c

    r4005 r4006  
    2727char  cs_tmpdir[200]={0x00};
    2828pthread_mutex_t gethostbyname_lock;
     29pthread_mutex_t cwcache_lock;
    2930pthread_key_t getclient;
    3031
     
    401402    NULLFREE (cl);
    402403
    403   //decrease cwcache
     404    //decrease cwcache
     405    pthread_mutex_lock(&cwcache_lock);
    404406    struct s_ecm *ecmc;
    405407    if (cwcache->next != NULL) { //keep it at least on one entry big
    406408        for (ecmc=cwcache; ecmc->next->next ; ecmc=ecmc->next) ; //find last element
    407409        if (cwidx==ecmc->next)
    408           cwidx = cwcache;
     410            cwidx = cwcache;
    409411        NULLFREE(ecmc->next); //free last element
    410412    }
     413    pthread_mutex_unlock(&cwcache_lock);
    411414  //decrease ecmache
    412415    if (ecmcache->next != NULL) { //keep it at least on one entry big
     
    616619        cl->login=cl->last=time((time_t *)0);
    617620        //increase cwcache
     621        pthread_mutex_lock(&cwcache_lock);
    618622        struct s_ecm *ecmc;
    619623        for (ecmc=cwcache; ecmc->next ; ecmc=ecmc->next); //ends on last cwcache entry
     
    621625        if (ecmc->next)
    622626            memset(ecmc, 0, sizeof(struct s_ecm));
     627        pthread_mutex_unlock(&cwcache_lock);
     628
    623629        //increase ecmcache
    624630        for (ecmc=ecmcache; ecmc->next ; ecmc=ecmc->next); //ends on last ecmcache entry
     
    675681  cache=idx=malloc(sizeof(struct s_ecm));
    676682  memset(idx, 0, sizeof(struct s_ecm));
    677   for(i=0;i<5;i++) {
     683  for(i=0;i<10;i++) {
    678684    idx->next=malloc(sizeof(struct s_ecm));
    679685    idx=idx->next;
     
    716722
    717723  pthread_mutex_init(&gethostbyname_lock, NULL);
     724  pthread_mutex_init(&cwcache_lock, NULL);
    718725  pthread_mutex_init(&ecmcache_lock, NULL);
    719726
     
    12261233    //cs_log("cache1 CHECK: grp=%lX", grp);
    12271234    struct s_ecm *ecmc;
    1228     for (ecmc=cwcache; ecmc ; ecmc=ecmc->next)
    1229         if ((grp & ecmc->grp) &&
    1230              ecmc->caid==er->caid &&
    1231              (!memcmp(ecmc->ecmd5, er->ecmd5, CS_ECMSTORESIZE)))
    1232         {
    1233             //cs_log("cache1 found: grp=%lX cgrp=%lX", grp, ecmc->grp);
    1234             memcpy(er->cw, ecmc->cw, 16);
    1235             er->selected_reader = ecmc->reader;
    1236             return(1);
    1237         }
    1238     return(0);
     1235    int count=0;
     1236
     1237    ushort lc=0, *lp;
     1238    if (cs_dblevel) {
     1239        for (lp=(ushort *)er->ecm+(er->l>>2), lc=0; lp>=(ushort *)er->ecm; lp--)
     1240            lc^=*lp;
     1241    }
     1242
     1243    pthread_mutex_lock(&cwcache_lock);
     1244    for (ecmc=cwcache; ecmc ; ecmc=ecmc->next, count++) {
     1245        if (memcmp(ecmc->ecmd5, er->ecmd5, CS_ECMSTORESIZE))
     1246            continue;
     1247
     1248        cs_debug_mask(D_TRACE, "cache: ecm %04X found: caid=%04X grp=%lld cgrp=%lld", lc, ecmc->caid, grp, ecmc->grp);
     1249
     1250        if (!(grp & ecmc->grp))
     1251            continue;
     1252   
     1253        if (ecmc->caid != er->caid)
     1254            continue;
     1255       
     1256        cs_debug_mask(D_TRACE, "cache: found count=%d", count);
     1257        memcpy(er->cw, ecmc->cw, 16);
     1258        er->selected_reader = ecmc->reader;
     1259        pthread_mutex_unlock(&cwcache_lock);
     1260        return 1;
     1261    }
     1262    pthread_mutex_unlock(&cwcache_lock);
     1263    cs_debug_mask(D_TRACE, "cache: %04X not found count=%d", lc, count);
     1264    return 0;
    12391265}
    12401266
     
    12581284        return;
    12591285#endif
     1286    pthread_mutex_lock(&cwcache_lock);
    12601287    if (cwidx->next)
    12611288        cwidx=cwidx->next;
     
    12641291    //cs_log("store ecm from reader %d", er->selected_reader);
    12651292    memcpy(cwidx->ecmd5, er->ecmd5, CS_ECMSTORESIZE);
    1266         memcpy(cwidx->cw, er->cw, 16);
     1293    memcpy(cwidx->cw, er->cw, 16);
    12671294    cwidx->caid = er->caid;
    12681295    cwidx->grp = grp;
    12691296    cwidx->reader = er->selected_reader;
     1297
     1298    if (cs_dblevel) {
     1299        ushort lc, *lp;
     1300        for (lp=(ushort *)er->ecm+(er->l>>2), lc=0; lp>=(ushort *)er->ecm; lp--)
     1301            lc^=*lp;
     1302        cs_debug_mask(D_TRACE, "store_cw: ecm=%04X grp=%lld", lc, grp);
     1303    }
    12701304    //cs_ddump(cwcache[*cwidx].ecmd5, CS_ECMSTORESIZE, "ECM stored (idx=%d)", *cwidx);
     1305    pthread_mutex_unlock(&cwcache_lock);
    12711306}
    12721307
     
    20172052void request_cw(ECM_REQUEST *er, int flag, int reader_types)
    20182053{
    2019   int i;
    2020   if ((reader_types == 0) || (reader_types == 2))
    2021     er->level=flag;
    2022   flag=(flag)?3:1;    // flag specifies with/without fallback-readers
     2054    int i;
     2055    if ((reader_types == 0) || (reader_types == 2))
     2056        er->level=flag;
     2057    flag=(flag)?3:1;    // flag specifies with/without fallback-readers
    20232058    struct s_reader *rdr;
     2059
     2060    ushort lc=0, *lp;
     2061    if (cs_dblevel) {
     2062        for (lp=(ushort *)er->ecm+(er->l>>2), lc=0; lp>=(ushort *)er->ecm; lp--)
     2063            lc^=*lp;
     2064    }
     2065
    20242066    for (i=0,rdr=first_reader; rdr ; rdr=rdr->next, i++) {
    2025       int status = 0;
    2026       switch (reader_types)
    2027       {
     2067        int status = 0;
     2068        switch (reader_types)
     2069        {
    20282070          // network and local cards
    20292071          default:
    20302072          case 0:
    20312073              if (er->matching_rdr[i]&flag){
    2032                   cs_debug_mask(D_TRACE, "request_cw1 to reader %s ridx=%d fd=%d", rdr->label, i, rdr->fd);
     2074                  cs_debug_mask(D_TRACE, "request_cw1 to reader %s ridx=%d fd=%d ecm=%04X", rdr->label, i, rdr->fd, lc);
    20332075                  status = write_ecm_request(rdr->fd, er);
    20342076              }
     
    20382080              if (!(rdr->typ & R_IS_NETWORK))
    20392081                  if (er->matching_rdr[i]&flag) {
    2040                       cs_debug_mask(D_TRACE, "request_cw2 to reader %s ridx=%d fd=%d", rdr->label, i, rdr->fd);
     2082                      cs_debug_mask(D_TRACE, "request_cw2 to reader %s ridx=%d fd=%d ecm=%04X", rdr->label, i, rdr->fd, lc);
    20412083                    status = write_ecm_request(rdr->fd, er);
    20422084                  }
     
    20472089              if ((rdr->typ & R_IS_NETWORK))
    20482090                  if (er->matching_rdr[i]&flag) {
    2049                       cs_debug_mask(D_TRACE, "request_cw3 to reader %s ridx=%d fd=%d", rdr->label, i, rdr->fd);
     2091                      cs_debug_mask(D_TRACE, "request_cw3 to reader %s ridx=%d fd=%d ecm=%04X", rdr->label, i, rdr->fd, lc);
    20502092                    status = write_ecm_request(rdr->fd, er);
    20512093                  }
Note: See TracChangeset for help on using the changeset viewer.