Changeset 4442
- Timestamp:
- 01/13/11 16:02:14 (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-cccam.c
r4421 r4442 1614 1614 int nprov, nassign = 0, nreject = 0, offset = 21; 1615 1615 1616 card->providers = ll_create ();1617 card->badsids = ll_create ();1618 card->goodsids = ll_create ();1619 card->remote_nodes = ll_create ();1616 card->providers = ll_create_nolock(); 1617 card->badsids = ll_create_nolock(); 1618 card->goodsids = ll_create_nolock(); 1619 card->remote_nodes = ll_create_nolock(); 1620 1620 card->id = b2i(4, buf); 1621 1621 card->remote_id = b2i(4, buf + 4); … … 2730 2730 else 2731 2731 memset(card2, 0, sizeof(struct cc_card)); 2732 card2->providers = ll_create ();2733 card2->badsids = ll_create ();2734 card2->goodsids = ll_create ();2735 card2->remote_nodes = ll_create ();2732 card2->providers = ll_create_nolock(); 2733 card2->badsids = ll_create_nolock(); 2734 card2->goodsids = ll_create_nolock(); 2735 card2->remote_nodes = ll_create_nolock(); 2736 2736 2737 2737 if (card) { … … 2912 2912 usr_reshare = cl->account->cccreshare; 2913 2913 2914 LLIST *server_cards = ll_create ();2914 LLIST *server_cards = ll_create_nolock(); 2915 2915 if (!cc->reported_carddatas) 2916 cc->reported_carddatas = ll_create ();2917 LLIST *new_reported_carddatas = ll_create ();2916 cc->reported_carddatas = ll_create_nolock(); 2917 LLIST *new_reported_carddatas = ll_create_nolock(); 2918 2918 2919 2919 cc->card_added_count = 0; … … 3221 3221 uint8 buf[CC_MAXMSGSIZE]; 3222 3222 uint8 data[16]; 3223 char usr[21], pwd[ 21];3223 char usr[21], pwd[65]; 3224 3224 struct s_auth *account; 3225 3225 struct cc_data *cc = cl->cc; … … 3240 3240 cl->cc = cc; 3241 3241 memset(cl->cc, 0, sizeof(struct cc_data)); 3242 cc->extended_ecm_idx = ll_create ();3242 cc->extended_ecm_idx = ll_create_nolock(); 3243 3243 3244 3244 cc_init_cc(cc); … … 3310 3310 if (strncmp(usr, account->usr, 20) == 0) { 3311 3311 memset(pwd, 0, sizeof(pwd)); 3312 strncpy(pwd, account->pwd, 20);3312 strncpy(pwd, account->pwd, sizeof(pwd)); 3313 3313 found=1; 3314 3314 break; … … 3554 3554 } 3555 3555 memset(cc, 0, sizeof(struct cc_data)); 3556 cc->cards = ll_create ();3556 cc->cards = ll_create_nolock(); 3557 3557 cl->cc = cc; 3558 cc->pending_emms = ll_create ();3559 cc->extended_ecm_idx = ll_create ();3560 cc->current_cards = ll_create ();3558 cc->pending_emms = ll_create_nolock(); 3559 cc->extended_ecm_idx = ll_create_nolock(); 3560 cc->current_cards = ll_create_nolock(); 3561 3561 cc_init_cc(cc); 3562 3562 } else { -
trunk/module-datastruct-llist.c
r4440 r4442 10 10 { 11 11 if (!l) return; 12 pthread_mutex_unlock(&l->lock); 13 pthread_mutex_destroy(&l->lock); 14 15 NULLFREE(l); 12 13 if (l->lock) { 14 pthread_mutex_unlock(l->lock); 15 pthread_mutex_destroy(l->lock); 16 add_garbage(l->lock); 17 } 18 19 add_garbage(l); 16 20 } 17 21 … … 20 24 LLIST *l = calloc(1, sizeof(LLIST)); 21 25 22 pthread_mutex_init(&l->lock, NULL); 23 26 l->lock = malloc(sizeof(pthread_mutex_t)); 27 pthread_mutex_init(l->lock, NULL); 28 29 return l; 30 } 31 32 LLIST *ll_create_nolock() 33 { 34 LLIST *l = calloc(1, sizeof(LLIST)); 35 24 36 return l; 25 37 } … … 86 98 { 87 99 if (l && obj) { 88 pthread_mutex_lock(&l->lock); 100 if (l->lock) 101 pthread_mutex_lock(l->lock); 89 102 ll_append_nolock(l, obj); 90 pthread_mutex_unlock(&l->lock); 103 if (l->lock) 104 pthread_mutex_unlock(l->lock); 91 105 } 92 106 } … … 98 112 it->l = l; 99 113 if (l) { 100 pthread_mutex_lock(&l->lock); 101 it->cur = l->initial; 114 if (l->lock) 115 pthread_mutex_lock(l->lock); 116 it->cur = l->initial; 102 117 } 103 118 else … … 109 124 void ll_iter_release(LL_ITER *it) 110 125 { 111 if(it->l )112 pthread_mutex_unlock( &it->l->lock);113 114 NULLFREE(it);126 if(it->l && it->l->lock) 127 pthread_mutex_unlock(it->l->lock); 128 129 add_garbage(it); 115 130 } 116 131 … … 190 205 191 206 it->l->count--; 192 NULLFREE(n);207 add_garbage(n); 193 208 return obj; 194 209 } … … 201 216 { 202 217 void *obj = ll_iter_remove(it); 203 NULLFREE(obj);218 add_garbage(obj); 204 219 } 205 220 … … 242 257 return; 243 258 244 pthread_mutex_lock(&l->lock); 259 if (l->lock) 260 pthread_mutex_lock(l->lock); 245 261 ll_insert_at_nolock(l, obj, pos); 246 pthread_mutex_unlock(&l->lock); 262 if (l->lock) 263 pthread_mutex_unlock(l->lock); 247 264 } 248 265 -
trunk/module-datastruct-llist.h
r4421 r4442 17 17 void *obj; 18 18 LL_NODE *initial; 19 pthread_mutex_t lock;19 pthread_mutex_t *lock; 20 20 int count; 21 21 }; … … 28 28 29 29 LLIST *ll_create(); // create llist, return ptr to llist 30 LLIST *ll_create_nolock(); // create llist, return ptr to llist (disable locking) 30 31 void ll_destroy(LLIST *l); // same as ll_clear_abstract() but frees up LLIST mem as well 31 32 void ll_destroy_data(LLIST *l); // same as ll_clear_data() but frees up obj allocations as well -
trunk/oscam-garbage.c
r4421 r4442 1 #include <pthread.h> 2 1 3 #include "globals.h" 2 4 #include "module-datastruct-llist.h" 3 4 LLIST *garbage_list;5 5 6 6 struct cs_garbage { 7 7 time_t time; 8 8 void * data; 9 struct cs_garbage *next; 9 10 }; 11 12 struct cs_garbage *garbage_first; 13 pthread_mutex_t garbage_lock; 10 14 11 15 void add_garbage(void *data) { … … 13 17 return; 14 18 19 pthread_mutex_lock(&garbage_lock); 20 15 21 struct cs_garbage *garbage = malloc(sizeof(struct cs_garbage)); 16 22 garbage->time = time(NULL); 17 23 garbage->data = data; 18 ll_append(garbage_list, garbage); 24 garbage->next = garbage_first; 25 garbage_first = garbage; 26 27 pthread_mutex_unlock(&garbage_lock); 19 28 } 20 29 21 30 void garbage_collector() { 22 LL_ITER *it;23 31 time_t now; 24 struct cs_garbage *garbage; 32 struct cs_garbage *garbage, *next, *prev = NULL; 33 25 34 while (1) { 26 35 cs_sleepms(1000); 27 36 28 now = time(NULL); 29 it = ll_iter_create(garbage_list); 30 while ((garbage = ll_iter_next(it))) { 37 pthread_mutex_lock(&garbage_lock); 38 39 garbage = garbage_first; 40 while (garbage) { 41 next = garbage->next; 31 42 if (now > garbage->time+5) { //5 seconds! 32 43 free(garbage->data); 33 ll_iter_remove_data(it); 44 45 if (prev) 46 prev->next = next; 47 else 48 garbage_first = next; 49 free(garbage); 34 50 } 51 else 52 prev = garbage; 53 garbage = next; 35 54 } 36 ll_iter_release(it);55 pthread_mutex_unlock(&garbage_lock); 37 56 } 38 57 } … … 40 59 void start_garbage_collector() { 41 60 42 garbage_list = ll_create(); 61 pthread_mutex_init(&garbage_lock, NULL); 62 63 garbage_first = NULL; 43 64 pthread_t temp; 44 65 pthread_attr_t attr;
Note:
See TracChangeset
for help on using the changeset viewer.