Changeset 8064
- Timestamp:
- 01/05/13 14:58:38 (11 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/oscam-garbage.c
r8018 r8064 18 18 19 19 struct cs_garbage *garbage_first[HASH_BUCKETS]; 20 struct cs_garbage *garbage_last[HASH_BUCKETS]; 20 21 CS_MUTEX_LOCK garbage_lock[HASH_BUCKETS]; 21 22 pthread_t garbage_thread; … … 69 70 #endif 70 71 71 garbage->next = garbage_first[bucket]; 72 garbage_first[bucket] = garbage; 72 if(garbage_last[bucket]) garbage_last[bucket]->next = garbage; 73 else garbage_first[bucket] = garbage; 74 garbage_last[bucket] = garbage; 73 75 cs_writeunlock(&garbage_lock[bucket]); 74 76 } … … 76 78 void garbage_collector(void) { 77 79 int8_t i; 78 struct cs_garbage *garbage, *next, *prev ;80 struct cs_garbage *garbage, *next, *prev, *first; 79 81 80 82 while (garbage_collector_active) { … … 82 84 for(i = 0; i < HASH_BUCKETS; ++i){ 83 85 cs_writelock(&garbage_lock[i]); 86 first = garbage_first[i]; 84 87 time_t deltime = time((time_t)0) - (2*cfg.ctimeout/1000 + 1); //clienttimeout +1 second 85 for(garbage = garbage_first[i], prev = NULL; garbage; prev = garbage, garbage = garbage->next) { 86 if (deltime < garbage->time) { 87 continue; 88 for(garbage = first, prev = NULL; garbage; prev = garbage, garbage = garbage->next) { 89 if (deltime < garbage->time) { // all following elements are too new 90 if(prev){ 91 garbage_first[i] = garbage; 92 prev->next = NULL; 93 } 94 break; 88 95 } 89 if (prev) {90 prev->next = NULL;91 } else {92 garbage_first[i] = NULL;93 }94 break;95 //all follow older and we can leave lock96 96 } 97 if(!garbage && garbage_first[i]){ // end of list reached and everything is to be cleaned 98 garbage = first; 99 garbage_first[i] = NULL; 100 garbage_last[i] = NULL; 101 } else if(prev) garbage = first; // set back to beginning to cleanup all 102 else garbage = NULL; // garbage not old enough yet => nothing to clean 97 103 cs_writeunlock(&garbage_lock[i]); 104 105 // list has been taken out before so we don't need a lock here anymore! 98 106 while(garbage){ 99 107 next = garbage->next; -
trunk/utils/list_smargo.c
r8058 r8064 31 31 #endif 32 32 33 static int32_t smartreader_check_endpoint(libusb_device *usb_dev)33 static void smartreader_check_endpoint(libusb_device *usb_dev, libusb_device_handle *handle) 34 34 { 35 struct libusb_device_descriptor usbdesc; 36 struct libusb_config_descriptor *configDesc; 37 int32_t ret; 38 int32_t j,k,l; 39 uint32_t m; 40 uint8_t tmpEndpointAddress; 41 int32_t nb_endpoint_ok; 42 int32_t result = -1; 43 44 nb_endpoint_ok=0; 45 46 ret = libusb_get_device_descriptor(usb_dev, &usbdesc); 47 if (ret < 0) { 48 printf("Smartreader : couldn't read device descriptor, assuming this is not a smartreader"); 49 return 0; 50 } 51 if (usbdesc.bNumConfigurations) { 52 ret=libusb_get_active_config_descriptor(usb_dev,&configDesc); 53 if(ret) { 54 printf("Smartreader : couldn't read config descriptor , assuming this is not a smartreader"); 55 return 0; 56 } 57 58 for(j=0; j<configDesc->bNumInterfaces; j++) { 59 for(k=0; k<configDesc->interface[j].num_altsetting; k++) { 60 for(l=0; l<configDesc->interface[j].altsetting[k].bNumEndpoints; l++) { 61 tmpEndpointAddress=configDesc->interface[j].altsetting[k].endpoint[l].bEndpointAddress; 62 for(m = 0; m < sizeof(reader_types)/sizeof(struct s_reader_types); ++m){ 35 struct libusb_device_descriptor usbdesc; 36 struct libusb_config_descriptor *configDesc; 37 int32_t ret; 38 int32_t j,k,l; 39 uint32_t m; 40 uint8_t tmpEndpointAddress; 41 int32_t nb_endpoint_ok; 42 int32_t busid, devid; 43 unsigned char iserialbuffer[128], iproductbuffer[128]; 44 char *productptr = (char *)iproductbuffer; 45 46 nb_endpoint_ok=0; 47 48 ret = libusb_get_device_descriptor(usb_dev, &usbdesc); 49 if (ret < 0) { 50 printf("Smartreader : couldn't read device descriptor, assuming this is not a smartreader"); 51 return; 52 } 53 if (usbdesc.bNumConfigurations) { 54 ret=libusb_get_active_config_descriptor(usb_dev,&configDesc); 55 if(ret) { 56 printf("Smartreader : couldn't read config descriptor , assuming this is not a smartreader"); 57 return; 58 } 59 for(m = 0; m < sizeof(reader_types)/sizeof(struct s_reader_types); ++m){ 60 nb_endpoint_ok = 0; 61 for(j=0; j<configDesc->bNumInterfaces; j++) { 62 for(k=0; k<configDesc->interface[j].num_altsetting; k++) { 63 for(l=0; l<configDesc->interface[j].altsetting[k].bNumEndpoints; l++) { 64 tmpEndpointAddress=configDesc->interface[j].altsetting[k].endpoint[l].bEndpointAddress; 63 65 if((tmpEndpointAddress == reader_types[m].in_ep || tmpEndpointAddress == reader_types[m].out_ep)){ 64 66 nb_endpoint_ok++; 65 result = m;66 break;67 67 } 68 68 } 69 } 69 } 70 } 71 if(nb_endpoint_ok == 2){ 72 busid=libusb_get_bus_number(usb_dev); 73 devid=libusb_get_device_address(usb_dev); 74 memset(iserialbuffer, 0, sizeof(iserialbuffer)); 75 memset(iproductbuffer, 0, sizeof(iproductbuffer)); 76 libusb_get_string_descriptor_ascii(handle,usbdesc.iSerialNumber,iserialbuffer,sizeof(iserialbuffer)); 77 libusb_get_string_descriptor_ascii(handle,usbdesc.iProduct,iproductbuffer,sizeof(iproductbuffer)); 78 printf("bus %03d, device %03d : %04x:%04x %s (type=%s, in_ep=%02x, out_ep=%02x; insert in oscam.server 'device = %s%sSerial:%s')\n", 79 busid, devid, 80 usbdesc.idVendor, usbdesc.idProduct, strlen(productptr)>0?productptr:"Smartreader", 81 reader_types[m].name, reader_types[m].in_ep, reader_types[m].out_ep, 82 strcmp(reader_types[m].name, "SR")?reader_types[m].name:"",strcmp(reader_types[m].name, "SR")?";":"", iserialbuffer 83 ); 70 84 } 71 } 72 } 73 74 if(nb_endpoint_ok!=2) 75 return -1; 76 return result; 85 } 86 } 77 87 } 78 88 … … 83 93 int32_t i = 0; 84 94 int32_t ret; 85 int32_t busid, devid;86 unsigned char iserialbuffer[128], iproductbuffer[128];87 char *productptr = (char *)iproductbuffer;88 95 89 96 while ((dev = devs[i++]) != NULL) { … … 101 108 } 102 109 // check for smargo endpoints. 103 if((ret=smartreader_check_endpoint(dev)) != -1) { 104 busid=libusb_get_bus_number(dev); 105 devid=libusb_get_device_address(dev); 106 memset(iserialbuffer, 0, sizeof(iserialbuffer)); 107 memset(iproductbuffer, 0, sizeof(iproductbuffer)); 108 libusb_get_string_descriptor_ascii(handle,usbdesc.iSerialNumber,iserialbuffer,sizeof(iserialbuffer)); 109 libusb_get_string_descriptor_ascii(handle,usbdesc.iProduct,iproductbuffer,sizeof(iproductbuffer)); 110 printf("bus %03d, device %03d : %04x:%04x %s (type=%s, in_ep=%02x, out_ep=%02x; insert in oscam.server 'device = %s%sSerial:%s')\n", 111 busid, devid, 112 usbdesc.idVendor, usbdesc.idProduct, strlen(productptr)>0?productptr:"Smartreader", 113 reader_types[ret].name, reader_types[ret].in_ep, reader_types[ret].out_ep, 114 strcmp(reader_types[ret].name, "SR")?reader_types[ret].name:"",strcmp(reader_types[ret].name, "SR")?";":"", iserialbuffer 115 ); 116 } 110 smartreader_check_endpoint(dev, handle); 117 111 118 112 libusb_close(handle);
Note:
See TracChangeset
for help on using the changeset viewer.