Changeset 4360 for pjproject/trunk/pjnath/src/pjnath/turn_sock.c
- Timestamp:
- Feb 21, 2013 11:26:35 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath/turn_sock.c
r4343 r4360 47 47 void *user_data; 48 48 49 pj_lock_t *lock; 49 pj_bool_t is_destroying; 50 pj_grp_lock_t *grp_lock; 50 51 51 52 pj_turn_alloc_param alloc_param; … … 53 54 pj_turn_sock_cfg setting; 54 55 55 pj_bool_t destroy_request;56 56 pj_timer_entry timer; 57 57 … … 94 94 95 95 96 static void turn_sock_on_destroy(void *comp); 96 97 static void destroy(pj_turn_sock *turn_sock); 97 98 static void timer_cb(pj_timer_heap_t *th, pj_timer_entry *e); … … 169 170 } 170 171 171 /* Create lock */ 172 status = pj_lock_create_recursive_mutex(pool, turn_sock->obj_name, 173 &turn_sock->lock); 174 if (status != PJ_SUCCESS) { 175 destroy(turn_sock); 176 return status; 177 } 172 /* Session lock */ 173 if (setting && setting->grp_lock) { 174 turn_sock->grp_lock = setting->grp_lock; 175 } else { 176 status = pj_grp_lock_create(pool, NULL, &turn_sock->grp_lock); 177 if (status != PJ_SUCCESS) { 178 pj_pool_release(pool); 179 return status; 180 } 181 } 182 183 pj_grp_lock_add_ref(turn_sock->grp_lock); 184 pj_grp_lock_add_handler(turn_sock->grp_lock, pool, turn_sock, 185 &turn_sock_on_destroy); 178 186 179 187 /* Init timer */ … … 187 195 sess_cb.on_state = &turn_on_state; 188 196 status = pj_turn_session_create(cfg, pool->obj_name, af, conn_type, 189 &sess_cb, 0, turn_sock, &turn_sock->sess); 197 turn_sock->grp_lock, &sess_cb, 0, 198 turn_sock, &turn_sock->sess); 190 199 if (status != PJ_SUCCESS) { 191 200 destroy(turn_sock); … … 204 213 * Destroy. 205 214 */ 206 static void destroy(pj_turn_sock *turn_sock) 207 { 208 if (turn_sock->lock) { 209 pj_lock_acquire(turn_sock->lock); 210 } 211 212 if (turn_sock->sess) { 213 pj_turn_session_set_user_data(turn_sock->sess, NULL); 214 pj_turn_session_shutdown(turn_sock->sess); 215 turn_sock->sess = NULL; 216 } 217 218 if (turn_sock->active_sock) { 219 pj_activesock_set_user_data(turn_sock->active_sock, NULL); 220 pj_activesock_close(turn_sock->active_sock); 221 turn_sock->active_sock = NULL; 222 } 223 224 if (turn_sock->lock) { 225 pj_lock_release(turn_sock->lock); 226 pj_lock_destroy(turn_sock->lock); 227 turn_sock->lock = NULL; 228 } 215 static void turn_sock_on_destroy(void *comp) 216 { 217 pj_turn_sock *turn_sock = (pj_turn_sock*) comp; 229 218 230 219 if (turn_sock->pool) { 231 220 pj_pool_t *pool = turn_sock->pool; 221 PJ_LOG(4,(turn_sock->obj_name, "TURN socket destroyed")); 232 222 turn_sock->pool = NULL; 233 223 pj_pool_release(pool); … … 235 225 } 236 226 227 static void destroy(pj_turn_sock *turn_sock) 228 { 229 PJ_LOG(4,(turn_sock->obj_name, "TURN socket destroy request, ref_cnt=%d", 230 pj_grp_lock_get_ref(turn_sock->grp_lock))); 231 232 pj_grp_lock_acquire(turn_sock->grp_lock); 233 if (turn_sock->is_destroying) { 234 pj_grp_lock_release(turn_sock->grp_lock); 235 return; 236 } 237 238 turn_sock->is_destroying = PJ_TRUE; 239 if (turn_sock->sess) 240 pj_turn_session_shutdown(turn_sock->sess); 241 if (turn_sock->active_sock) 242 pj_activesock_close(turn_sock->active_sock); 243 pj_grp_lock_dec_ref(turn_sock->grp_lock); 244 pj_grp_lock_release(turn_sock->grp_lock); 245 } 237 246 238 247 PJ_DEF(void) pj_turn_sock_destroy(pj_turn_sock *turn_sock) 239 248 { 240 pj_lock_acquire(turn_sock->lock); 241 turn_sock->destroy_request = PJ_TRUE; 249 pj_grp_lock_acquire(turn_sock->grp_lock); 250 if (turn_sock->is_destroying) { 251 pj_grp_lock_release(turn_sock->grp_lock); 252 return; 253 } 242 254 243 255 if (turn_sock->sess) { … … 247 259 * destroy ourselves. 248 260 */ 249 pj_lock_release(turn_sock->lock);250 261 } else { 251 pj_lock_release(turn_sock->lock);252 262 destroy(turn_sock); 253 263 } 254 264 265 pj_grp_lock_release(turn_sock->grp_lock); 255 266 } 256 267 … … 268 279 switch (eid) { 269 280 case TIMER_DESTROY: 270 PJ_LOG(5,(turn_sock->obj_name, "Destroying TURN"));271 281 destroy(turn_sock); 272 282 break; … … 338 348 PJ_DEF(pj_status_t) pj_turn_sock_lock(pj_turn_sock *turn_sock) 339 349 { 340 return pj_ lock_acquire(turn_sock->lock);350 return pj_grp_lock_acquire(turn_sock->grp_lock); 341 351 } 342 352 … … 346 356 PJ_DEF(pj_status_t) pj_turn_sock_unlock(pj_turn_sock *turn_sock) 347 357 { 348 return pj_ lock_release(turn_sock->lock);358 return pj_grp_lock_release(turn_sock->grp_lock); 349 359 } 350 360 … … 381 391 PJ_ASSERT_RETURN(turn_sock && domain, PJ_EINVAL); 382 392 PJ_ASSERT_RETURN(turn_sock->sess, PJ_EINVALIDOP); 393 394 pj_grp_lock_acquire(turn_sock->grp_lock); 383 395 384 396 /* Copy alloc param. We will call session_alloc() only after the … … 396 408 if (status != PJ_SUCCESS) { 397 409 sess_fail(turn_sock, "Error setting credential", status); 410 pj_grp_lock_release(turn_sock->grp_lock); 398 411 return status; 399 412 } … … 405 418 if (status != PJ_SUCCESS) { 406 419 sess_fail(turn_sock, "Error setting TURN server", status); 420 pj_grp_lock_release(turn_sock->grp_lock); 407 421 return status; 408 422 } … … 411 425 * to RESOLVED state. 412 426 */ 413 427 pj_grp_lock_release(turn_sock->grp_lock); 414 428 return PJ_SUCCESS; 415 429 } … … 473 487 return PJ_FALSE; 474 488 489 pj_grp_lock_acquire(turn_sock->grp_lock); 490 475 491 /* TURN session may have already been destroyed here. 476 492 * See ticket #1557 (http://trac.pjsip.org/repos/ticket/1557). … … 478 494 if (!turn_sock->sess) { 479 495 sess_fail(turn_sock, "TURN session already destroyed", status); 496 pj_grp_lock_release(turn_sock->grp_lock); 480 497 return PJ_FALSE; 481 498 } … … 483 500 if (status != PJ_SUCCESS) { 484 501 sess_fail(turn_sock, "TCP connect() error", status); 502 pj_grp_lock_release(turn_sock->grp_lock); 485 503 return PJ_FALSE; 486 504 } … … 501 519 if (status != PJ_SUCCESS) { 502 520 sess_fail(turn_sock, "Error sending ALLOCATE", status); 521 pj_grp_lock_release(turn_sock->grp_lock); 503 522 return PJ_FALSE; 504 523 } 505 524 525 pj_grp_lock_release(turn_sock->grp_lock); 506 526 return PJ_TRUE; 507 527 } … … 563 583 564 584 turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock); 565 pj_ lock_acquire(turn_sock->lock);566 567 if (status == PJ_SUCCESS && turn_sock->sess ) {585 pj_grp_lock_acquire(turn_sock->grp_lock); 586 587 if (status == PJ_SUCCESS && turn_sock->sess && !turn_sock->is_destroying) { 568 588 /* Report incoming packet to TURN session, repeat while we have 569 589 * "packet" in the buffer (required for stream-oriented transports) … … 615 635 616 636 on_return: 617 pj_ lock_release(turn_sock->lock);637 pj_grp_lock_release(turn_sock->grp_lock); 618 638 619 639 return ret; … … 635 655 pj_status_t status; 636 656 637 if (turn_sock == NULL ) {657 if (turn_sock == NULL || turn_sock->is_destroying) { 638 658 /* We've been destroyed */ 639 659 // https://trac.pjsip.org/repos/ticket/1316 … … 681 701 pj_turn_sock *turn_sock = (pj_turn_sock*) 682 702 pj_turn_session_get_user_data(sess); 683 if (turn_sock == NULL ) {703 if (turn_sock == NULL || turn_sock->is_destroying) { 684 704 /* We've been destroyed */ 685 705 return; … … 730 750 int sock_type; 731 751 pj_sock_t sock; 752 pj_activesock_cfg asock_cfg; 732 753 pj_activesock_cb asock_cb; 733 754 pj_sockaddr bound_addr, *cfg_bind_addr; … … 791 812 792 813 /* Create active socket */ 814 pj_activesock_cfg_default(&asock_cfg); 815 asock_cfg.grp_lock = turn_sock->grp_lock; 816 793 817 pj_bzero(&asock_cb, sizeof(asock_cb)); 794 818 asock_cb.on_data_read = &on_data_read; 795 819 asock_cb.on_connect_complete = &on_connect_complete; 796 820 status = pj_activesock_create(turn_sock->pool, sock, 797 sock_type, NULL,821 sock_type, &asock_cfg, 798 822 turn_sock->cfg.ioqueue, &asock_cb, 799 823 turn_sock, … … 836 860 pj_turn_session_set_user_data(sess, NULL); 837 861 838 if (turn_sock->timer.id) { 839 pj_timer_heap_cancel(turn_sock->cfg.timer_heap, &turn_sock->timer); 840 turn_sock->timer.id = 0; 841 } 842 843 turn_sock->timer.id = TIMER_DESTROY; 844 pj_timer_heap_schedule(turn_sock->cfg.timer_heap, &turn_sock->timer, 845 &delay); 846 } 847 } 848 849 862 pj_timer_heap_cancel_if_active(turn_sock->cfg.timer_heap, 863 &turn_sock->timer, 0); 864 pj_timer_heap_schedule_w_grp_lock(turn_sock->cfg.timer_heap, 865 &turn_sock->timer, 866 &delay, TIMER_DESTROY, 867 turn_sock->grp_lock); 868 } 869 } 870 871
Note: See TracChangeset
for help on using the changeset viewer.