Changeset 1259:82280e745a89 in freeDiameter for extensions/rt_redirect/redir_entries.c
- Timestamp:
- Mar 24, 2014, 9:13:38 PM (10 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/rt_redirect/redir_entries.c
r740 r1259 43 43 { 44 44 int i; 45 45 46 46 TRACE_ENTRY(""); 47 47 48 48 /* redirects_usages */ 49 49 memset(&redirects_usages, 0, sizeof(redirects_usages)); 50 50 51 51 for (i = 0; i <= H_U_MAX; i++) { 52 52 CHECK_POSIX( pthread_rwlock_init( &redirects_usages[i].lock, NULL) ); 53 53 fd_list_init( &redirects_usages[i].sentinel, &redirects_usages[i] ); 54 54 } 55 55 56 56 /* initialize the scores */ 57 57 redirects_usages[ DONT_CACHE ].score = FD_SCORE_REDIR_ONCE; … … 73 73 os0_t s; 74 74 size_t l; 75 75 76 76 TRACE_ENTRY("%p %p %d %p %p %zd %p %zd", e, targets, rhu, qry, nh, nhlen, oh, ohlen) 77 77 ASSERT(e && targets && (rhu <= H_U_MAX) && qry && nh && nhlen && oh && ohlen); 78 78 79 79 CHECK_MALLOC( entry = malloc(sizeof(struct redir_entry)) ); 80 80 memset(entry, 0, sizeof(struct redir_entry)); 81 81 82 82 entry->eyec = REDIR_ENTRY_EYEC; 83 83 84 84 CHECK_MALLOC( entry->from.s = os0dup(nh, nhlen) ); 85 85 entry->from.l = nhlen; 86 86 87 87 fd_list_init(&entry->target_peers_list, entry); 88 88 fd_list_move_end(&entry->target_peers_list, targets); 89 89 90 90 fd_list_init(&entry->exp_list, entry); 91 91 92 92 entry->type = rhu; 93 93 fd_list_init(&entry->redir_list, entry); … … 97 97 entry->data.message.msg = qry; 98 98 break; 99 99 100 100 case ALL_SESSION: 101 101 { … … 114 114 } 115 115 break; 116 116 117 117 case ALL_REALM: 118 118 { … … 132 132 } 133 133 break; 134 134 135 135 case REALM_AND_APPLICATION: 136 136 { … … 156 156 } 157 157 break; 158 158 159 159 case ALL_APPLICATION: 160 160 { … … 164 164 } 165 165 break; 166 166 167 167 case ALL_HOST: 168 168 CHECK_MALLOC( entry->data.host.s = os0dup(oh, ohlen) ); 169 169 entry->data.host.l = ohlen; 170 170 break; 171 171 172 172 case ALL_USER: 173 173 { … … 187 187 } 188 188 break; 189 189 190 190 default: 191 191 ASSERT(0); 192 192 return EINVAL; 193 193 } 194 194 195 195 /* We're done */ 196 196 *e = entry; … … 203 203 unsigned long v1 = (unsigned long) d1->message.msg; 204 204 unsigned long v2 = (unsigned long) d2->message.msg; 205 if (v1 > v2) 205 if (v1 > v2) 206 206 return 1; 207 207 if (v1 < v2) … … 211 211 /* Compare two applications (REALM_AND_APPLICATION and ALL_APPLICATION) */ 212 212 static int compare_entries_appl(union matchdata * d1, union matchdata * d2) { 213 if (d1->app.a > d2->app.a) 213 if (d1->app.a > d2->app.a) 214 214 return 1; 215 if (d1->app.a < d2->app.a) 215 if (d1->app.a < d2->app.a) 216 216 return -1; 217 217 return 0; … … 238 238 { 239 239 struct fd_list * li; 240 240 241 241 TRACE_ENTRY("%p", e); 242 242 CHECK_PARAMS(e && (e->eyec == REDIR_ENTRY_EYEC)); 243 243 244 244 /* Write-Lock the line */ 245 245 CHECK_POSIX( pthread_rwlock_wrlock( RWLOCK_REDIR(e) ) ); 246 246 247 247 for (li = redirects_usages[e->type].sentinel.next; li != &redirects_usages[e->type].sentinel; li = li->next) { 248 248 struct redir_entry * n = li->o; … … 251 251 break; 252 252 } 253 253 254 254 fd_list_insert_before(li, &e->redir_list); 255 255 256 256 /* unLock the line */ 257 257 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) ); … … 265 265 TRACE_ENTRY("%p", e); 266 266 CHECK_PARAMS(e && (e->eyec == REDIR_ENTRY_EYEC)); 267 267 268 268 /* If the entry is linked, lock the rwlock also */ 269 269 if (!FD_IS_LIST_EMPTY(&e->redir_list)) { … … 272 272 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) ); 273 273 } 274 274 275 275 /* Now unlink from other list */ 276 276 fd_list_unlink(&e->exp_list); 277 277 278 278 /* Empty the targets list */ 279 279 while (!FD_IS_LIST_EMPTY(&e->target_peers_list)) { 280 280 struct redir_host * h = (struct redir_host *)e->target_peers_list.next->o; 281 281 282 282 fd_list_unlink(&h->chain); 283 283 free(h->id); 284 284 free(h); 285 285 } 286 286 287 287 /* Now we can destroy the data safely */ 288 288 switch (e->type) { … … 312 312 return EINVAL; 313 313 } 314 314 315 315 free(e->from.s); 316 316 317 317 free(e); 318 318 return 0;
Note: See TracChangeset
for help on using the changeset viewer.