Changeset 14:14cf6daf716d in freeDiameter for freeDiameter/peers.c
- Timestamp:
- Oct 1, 2009, 6:24:07 PM (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
freeDiameter/peers.c
r13 r14 36 36 #include "fD.h" 37 37 38 const char *peer_state_str[] = { "<error>" 39 , "STATE_DISABLED" 40 , "STATE_OPEN" 41 , "STATE_CLOSED" 42 , "STATE_CLOSING" 43 , "STATE_WAITCNXACK" 44 , "STATE_WAITCNXACK_ELEC" 45 , "STATE_WAITCEA" 46 , "STATE_SUSPECT" 47 , "STATE_REOPEN" 48 }; 49 50 struct fd_list fd_g_peers; 51 pthread_rwlock_t fd_g_peers_rw; 52 53 /* Initialize the peers list */ 54 int fd_peer_init() 55 { 56 TRACE_ENTRY(); 57 58 fd_list_init(&fd_g_peers, NULL); 59 CHECK_POSIX( pthread_rwlock_init(&fd_g_peers_rw, NULL) ); 60 61 CHECK_FCT(fd_p_expi_init()); 62 63 return 0; 64 } 38 struct fd_list fd_g_peers = FD_LIST_INITIALIZER(fd_g_peers); 39 pthread_rwlock_t fd_g_peers_rw = PTHREAD_RWLOCK_INITIALIZER; 65 40 66 41 /* Terminate peer module (destroy all peers) */ 67 42 int fd_peer_fini() 68 43 { 44 struct fd_list * li; 69 45 TRACE_ENTRY(); 70 46 71 47 CHECK_FCT_DO(fd_p_expi_fini(), /* continue */); 72 48 73 TODO("Complete this function") 49 TRACE_DEBUG(INFO, "Sending signal to terminate to all peer connections"); 50 51 CHECK_FCT_DO( pthread_rwlock_rdlock(&fd_g_peers_rw), /* continue */ ); 52 /* For each peer in the list, ... */ 53 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { 54 struct fd_peer * np = (struct fd_peer *)li; 55 CHECK_FCT_DO( fd_psm_terminate(np), /* continue */ ); 56 } 57 CHECK_FCT_DO( pthread_rwlock_unlock(&fd_g_peers_rw), /* continue */ ); 58 59 TODO("Give some time to all PSM, then destroy remaining threads"); 60 /* fd_psm_abord(struct fd_peer * peer ) */ 74 61 75 62 return 0; … … 125 112 126 113 fd_list_init(&p->p_hdr.info.pi_endpoints, NULL); 127 p->p_hdr.info.pi_state = STATE_DISABLED;128 114 fd_list_init(&p->p_hdr.info.pi_apps, NULL); 129 115 130 116 p->p_eyec = EYEC_PEER; 131 CHECK_POSIX( pthread_mutex_init(&p->p_mtx, NULL) );132 117 fd_list_init(&p->p_expiry, p); 133 118 fd_list_init(&p->p_actives, p); … … 166 151 CHECK_PARAMS(p); 167 152 168 CHECK_PARAMS( (p->p_refcount == 0) &&FD_IS_LIST_EMPTY(&p->p_hdr.chain) );153 CHECK_PARAMS( FD_IS_LIST_EMPTY(&p->p_hdr.chain) ); 169 154 170 155 free_null(p->p_hdr.info.pi_diamid); … … 176 161 177 162 free_null(p->p_dbgorig); 178 CHECK_POSIX( pthread_mutex_destroy(&p->p_mtx) );179 163 ASSERT(FD_IS_LIST_EMPTY(&p->p_expiry)); 180 164 ASSERT(FD_IS_LIST_EMPTY(&p->p_actives)); … … 214 198 } 215 199 216 TRACE_DEBUG(NONE, "TODO: destroy p->p_cnxctx here"); 200 if (p->p_cnxctx) { 201 TODO("destroy p->p_cnxctx"); 202 } 217 203 218 204 if (p->p_cb) … … 224 210 } 225 211 226 /* Decrement refcount, delete if 0 */227 int fd_peer_rc_decr(struct fd_peer **ptr, int locked)228 {229 int count;230 struct fd_peer *p;231 TRACE_ENTRY("%p %d", p, locked);232 233 CHECK_PARAMS(ptr && CHECK_PEER( *ptr ));234 p = *ptr;235 236 if (!locked) {237 CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) );238 CHECK_POSIX( pthread_mutex_lock( &p->p_mtx ) );239 CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );240 }241 242 count = --(p->p_refcount);243 244 if (!locked) {245 CHECK_POSIX( pthread_mutex_unlock( &p->p_mtx ) );246 }247 248 if (count <= 0) {249 /* All links have already been removed, we can destroy */250 CHECK_FCT( fd_sp_destroy(ptr) );251 }252 return 0;253 }254 212 255 213 /* Add a new peer entry */ … … 284 242 285 243 /* Move the items from one list to the other */ 286 while (!FD_IS_LIST_EMPTY( &info->pi_endpoints ) ) { 287 li = info->pi_endpoints.next; 288 fd_list_unlink(li); 289 fd_list_insert_before(&p->p_hdr.info.pi_endpoints, li); 290 } 244 if (info->pi_endpoints.next) 245 while (!FD_IS_LIST_EMPTY( &info->pi_endpoints ) ) { 246 li = info->pi_endpoints.next; 247 fd_list_unlink(li); 248 fd_list_insert_before(&p->p_hdr.info.pi_endpoints, li); 249 } 291 250 292 251 p->p_hdr.info.pi_sec_module = info->pi_sec_module; … … 304 263 /* Ok, now check if we don't already have an entry with the same Diameter Id, and insert this one */ 305 264 CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_peers_rw) ); 306 CHECK_POSIX( pthread_mutex_lock( &p->p_mtx ) );307 265 308 266 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { … … 319 277 if (! ret) { 320 278 /* Update expiry list */ 321 CHECK_FCT_DO( ret = fd_p_expi_update( p , 1), goto out );279 CHECK_FCT_DO( ret = fd_p_expi_update( p ), goto out ); 322 280 323 281 /* Insert the new element in the list */ 324 282 fd_list_insert_before( li, &p->p_hdr.chain ); 325 p->p_refcount++;326 283 } 327 284 328 285 out: 329 CHECK_POSIX( pthread_mutex_unlock( &p->p_mtx ) );330 286 CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) ); 331 287 if (ret) { 332 288 CHECK_FCT( fd_sp_destroy(&p) ); 333 289 } else { 334 CHECK_FCT( fd_psm_ start(p) );290 CHECK_FCT( fd_psm_begin(p) ); 335 291 } 336 292 return ret;
Note: See TracChangeset
for help on using the changeset viewer.