Changeset 4908 for trunk/module-datastruct-llist.c
- Timestamp:
- 04/04/11 09:12:54 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-datastruct-llist.c
r4839 r4908 7 7 #include "module-datastruct-llist.h" 8 8 9 /* 10 Locking rules: 11 12 mutex lock is needed when... 13 1. l->initial is modified/accessed 14 2. LL_NODE nxt modified/accessed 15 16 17 */ 9 18 static void _destroy(LLIST *l) 10 19 { … … 59 68 } 60 69 61 LL_NODE* ll_append (LLIST *l, void *obj)70 LL_NODE* ll_append_nolock(LLIST *l, void *obj) 62 71 { 63 72 if (l && obj) { 64 73 LL_NODE *new = calloc(1, sizeof(LL_NODE)); 65 pthread_mutex_lock(&l->lock);66 74 LL_NODE *n = l->initial; 67 75 … … 75 83 76 84 l->count++; 85 return new; 86 } 87 88 return NULL; 89 } 90 91 LL_NODE* ll_append(LLIST *l, void *obj) 92 { 93 if (l && obj) { 94 pthread_mutex_lock(&l->lock); 95 LL_NODE *n = ll_append_nolock(l, obj); 77 96 pthread_mutex_unlock(&l->lock); 78 79 return new; 80 } 81 97 return n; 98 } 82 99 return NULL; 83 100 } … … 125 142 } 126 143 127 void *ll_iter_next (LL_ITER *it)128 { 129 if (it ) {144 void *ll_iter_next_nolock(LL_ITER *it) 145 { 146 if (it && it->l) { 130 147 if (it->cur) { 131 148 it->prv = it->cur; … … 141 158 } 142 159 160 void *ll_iter_next(LL_ITER *it) 161 { 162 if (it && it->l) { 163 pthread_mutex_lock(&it->l->lock); 164 void *res = ll_iter_next_nolock(it); 165 pthread_mutex_unlock(&it->l->lock); 166 return res; 167 } 168 return NULL; 169 } 170 143 171 void *ll_iter_peek(LL_ITER *it, int offset) 144 172 { 145 LL_NODE *n = it->cur; 146 int i; 147 148 for (i = 0; i < offset; i++) 149 if (n) 150 n = n->nxt; 151 else 152 return NULL; 153 154 if (!n) 155 return NULL; 156 157 return n->obj; 173 if (it && it->l) { 174 pthread_mutex_lock(&it->l->lock); 175 LL_NODE *n = it->cur; 176 int i; 177 178 for (i = 0; i < offset; i++) { 179 if (n) 180 n = n->nxt; 181 else 182 break; 183 } 184 pthread_mutex_unlock(&it->l->lock); 185 186 if (!n) 187 return NULL; 188 return n->obj; 189 } 190 return NULL; 158 191 } 159 192 … … 169 202 { 170 203 if (it && obj) { 204 pthread_mutex_lock(&it->l->lock); 171 205 if (!it->cur || !it->cur->nxt) 172 ll_append (it->l, obj);206 ll_append_nolock(it->l, obj); 173 207 else { 174 pthread_mutex_lock(&it->l->lock);175 208 LL_NODE *n = calloc(1, sizeof(LL_NODE)); 176 209 … … 180 213 181 214 it->l->count++; 182 pthread_mutex_unlock(&it->l->lock);183 215 } 216 pthread_mutex_unlock(&it->l->lock); 184 217 } 185 218 } … … 202 235 203 236 ll_iter_reset(it); 204 while (prv && ll_iter_next (it))237 while (prv && ll_iter_next_nolock(it)) 205 238 if (it->cur == prv) 206 239 break;
Note:
See TracChangeset
for help on using the changeset viewer.