Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00032 #include "hslot.h"
00033
00035 int ul_locks_no=4;
00037 gen_lock_set_t* ul_locks=0;
00038
00039
00044 int ul_init_locks(void)
00045 {
00046 int i;
00047 i = ul_locks_no;
00048 do {
00049 if ((( ul_locks=lock_set_alloc(i))!=0)&&
00050 (lock_set_init(ul_locks)!=0))
00051 {
00052 ul_locks_no = i;
00053 LM_INFO("locks array size %d\n", ul_locks_no);
00054 return 0;
00055
00056 }
00057 if (ul_locks){
00058 lock_set_dealloc(ul_locks);
00059 ul_locks=0;
00060 }
00061 i--;
00062 if(i==0)
00063 {
00064 LM_ERR("failed to allocate locks\n");
00065 return -1;
00066 }
00067 } while (1);
00068 }
00069
00070
00074 void ul_unlock_locks(void)
00075 {
00076 unsigned int i;
00077
00078 if (ul_locks==0)
00079 return;
00080
00081 for (i=0;i<ul_locks_no;i++) {
00082 #ifdef GEN_LOCK_T_PREFERED
00083 lock_release(&ul_locks->locks[i]);
00084 #else
00085 ul_release_idx(i);
00086 #endif
00087 };
00088 }
00089
00090
00094 void ul_destroy_locks(void)
00095 {
00096 if (ul_locks !=0){
00097 lock_set_destroy(ul_locks);
00098 lock_set_dealloc(ul_locks);
00099 };
00100 }
00101
00102 #ifndef GEN_LOCK_T_PREFERED
00103
00107 void ul_lock_idx(int idx)
00108 {
00109 lock_set_get(ul_locks, idx);
00110 }
00111
00112
00117 void ul_release_idx(int idx)
00118 {
00119 lock_set_release(ul_locks, idx);
00120 }
00121 #endif
00122
00129 void init_slot(struct udomain* _d, hslot_t* _s, int n)
00130 {
00131 _s->n = 0;
00132 _s->first = 0;
00133 _s->last = 0;
00134 _s->d = _d;
00135
00136 #ifdef GEN_LOCK_T_PREFERED
00137 _s->lock = &ul_locks->locks[n%ul_locks_no];
00138 #else
00139 _s->lockidx = n%ul_locks_no;
00140 #endif
00141 }
00142
00143
00148 void deinit_slot(hslot_t* _s)
00149 {
00150 struct urecord* ptr;
00151
00152
00153 while(_s->first) {
00154 ptr = _s->first;
00155 _s->first = _s->first->next;
00156 free_urecord(ptr);
00157 }
00158
00159 _s->n = 0;
00160 _s->last = 0;
00161 _s->d = 0;
00162 }
00163
00164
00170 void slot_add(hslot_t* _s, struct urecord* _r)
00171 {
00172 if (_s->n == 0) {
00173 _s->first = _s->last = _r;
00174 } else {
00175 _r->prev = _s->last;
00176 _s->last->next = _r;
00177 _s->last = _r;
00178 }
00179 _s->n++;
00180 _r->slot = _s;
00181 }
00182
00183
00189 void slot_rem(hslot_t* _s, struct urecord* _r)
00190 {
00191 if (_r->prev) {
00192 _r->prev->next = _r->next;
00193 } else {
00194 _s->first = _r->next;
00195 }
00196
00197 if (_r->next) {
00198 _r->next->prev = _r->prev;
00199 } else {
00200 _s->last = _r->prev;
00201 }
00202
00203 _r->prev = _r->next = 0;
00204 _r->slot = 0;
00205 _s->n--;
00206 }