Changeset 7158 for trunk/oscam-garbage.c
- Timestamp:
- 07/10/12 06:36:29 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/oscam-garbage.c
r7157 r7158 25 25 if (!data) 26 26 return; 27 27 28 28 if (!garbage_collector_active || garbage_debug == 1) { 29 29 free(data); 30 30 return; 31 31 } 32 32 33 33 int32_t bucket = (uintptr_t)data/16 % HASH_BUCKETS; 34 34 cs_writelock(&garbage_lock[bucket]); 35 35 36 36 #ifdef WITH_DEBUG 37 37 if(garbage_debug == 2){ … … 41 41 cs_log("Found a try to add garbage twice. Not adding the element to garbage list..."); 42 42 cs_log("Current garbage addition: %s, line %d.", file, line); 43 cs_log("Original garbage addition: %s, line %d.", garbagecheck->file, garbagecheck->line); 43 cs_log("Original garbage addition: %s, line %d.", garbagecheck->file, garbagecheck->line); 44 44 cs_writeunlock(&garbage_lock[bucket]); 45 45 return; … … 49 49 } 50 50 #endif 51 51 52 52 struct cs_garbage *garbage; 53 if (!cs_malloc(&garbage, sizeof(struct cs_garbage), -1)) return; 53 if (!cs_malloc(&garbage, sizeof(struct cs_garbage), -1)) 54 { 55 free(data); 56 cs_writeunlock(&garbage_lock[bucket]); 57 return; 58 } 54 59 garbage->time = time(NULL); 55 60 garbage->data = data; … … 60 65 #endif 61 66 garbage_first[bucket] = garbage; 62 67 63 68 cs_writeunlock(&garbage_lock[bucket]); 64 69 } … … 68 73 int8_t i; 69 74 struct cs_garbage *garbage, *next, *prev; 70 75 71 76 while (garbage_collector_active) { 72 77 73 78 for(i = 0; i < HASH_BUCKETS; ++i){ 74 79 cs_writelock(&garbage_lock[i]); 75 80 now = time(NULL); 76 81 77 82 prev = NULL; 78 garbage = garbage_first[i]; 83 garbage = garbage_first[i]; 79 84 while (garbage) { 80 85 next = garbage->next; 81 86 if (now > (time_t)(garbage->time+cfg.ctimeout/1000+1)) { //clienttimeout +1 second 82 87 free(garbage->data); 83 88 84 89 if (prev) 85 90 prev->next = next; … … 128 133 if (garbage_collector_active) { 129 134 int8_t i; 130 135 131 136 garbage_collector_active = 0; 132 137 for(i = 0; i < HASH_BUCKETS; ++i) 133 138 cs_writelock(&garbage_lock[i]); 134 139 135 140 pthread_cancel(garbage_thread); 136 141 cs_sleepms(100); 137 142 138 143 for(i = 0; i < HASH_BUCKETS; ++i){ 139 144 while (garbage_first[i]) {
Note:
See TracChangeset
for help on using the changeset viewer.