Changeset 4444


Ignore:
Timestamp:
Mar 20, 2013 11:02:45 AM (7 years ago)
Author:
bennylp
Message:

Part 1 of re #1646: fixed the deadlock problem in SIP transaction related to transport event

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r4438 r4444  
    134134                                         (64*PJSIP_T1_TIMEOUT)%1000 }; 
    135135 
    136 #define TIMER_INACTIVE  0 
    137 #define TIMER_ACTIVE    1 
     136#define TIMER_INACTIVE          0 
     137#define RETRANSMIT_TIMER        1 
     138#define TIMEOUT_TIMER           2 
     139#define TRANSPORT_ERR_TIMER     3 
    138140 
    139141 
     
    165167                                       pjsip_transport_state state, 
    166168                                       const pjsip_transport_state_info *info); 
     169static void        tsx_set_state( pjsip_transaction *tsx, 
     170                                  pjsip_tsx_state_e state, 
     171                                  pjsip_event_id_e event_src_type, 
     172                                  void *event_src ); 
     173static void        tsx_set_state_no_notify( pjsip_transaction *tsx, 
     174                                            pjsip_tsx_state_e state, 
     175                                            pjsip_event_id_e event_src_type, 
     176                                            void *event_src ); 
     177static void        tsx_set_status_code(pjsip_transaction *tsx, 
     178                                       int code, const pj_str_t *reason); 
    167179static pj_status_t tsx_create( pjsip_module *tsx_user, 
    168180                               pj_grp_lock_t *grp_lock, 
     
    921933} 
    922934 
     935/* Utility: schedule a timer */ 
     936static pj_status_t tsx_schedule_timer(pjsip_transaction *tsx, 
     937                                      pj_timer_entry *entry, 
     938                                      const pj_time_val *delay, 
     939                                      int active_id) 
     940{ 
     941    pj_timer_heap_t *timer_heap = pjsip_endpt_get_timer_heap(tsx->endpt); 
     942    pj_status_t status; 
     943 
     944    pj_assert(active_id != 0); 
     945    status = pj_timer_heap_schedule_w_grp_lock(timer_heap, entry, 
     946                                               delay, active_id, 
     947                                               tsx->grp_lock); 
     948 
     949    return status; 
     950} 
     951 
     952/* Utility: cancel a timer */ 
     953static int tsx_cancel_timer(pjsip_transaction *tsx, 
     954                            pj_timer_entry *entry) 
     955{ 
     956    pj_timer_heap_t *timer_heap = pjsip_endpt_get_timer_heap(tsx->endpt); 
     957    return pj_timer_heap_cancel_if_active(timer_heap, entry, TIMER_INACTIVE); 
     958} 
     959 
    923960/* Create and initialize basic transaction structure. 
    924961 * This function is called by both UAC and UAS creation. 
     
    947984 
    948985    tsx->handle_200resp = 1; 
    949     tsx->retransmit_timer.id = 0; 
     986    tsx->retransmit_timer.id = TIMER_INACTIVE; 
    950987    tsx->retransmit_timer.user_data = tsx; 
    951988    tsx->retransmit_timer.cb = &tsx_timer_callback; 
    952     tsx->timeout_timer.id = 0; 
     989    tsx->timeout_timer.id = TIMER_INACTIVE; 
    953990    tsx->timeout_timer.user_data = tsx; 
    954991    tsx->timeout_timer.cb = &tsx_timer_callback; 
     
    10061043    } 
    10071044    /* Cancel timeout timer. */ 
    1008     if (tsx->timeout_timer.id != 0) { 
    1009         pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
    1010         tsx->timeout_timer.id = 0; 
    1011     } 
     1045    tsx_cancel_timer(tsx, &tsx->timeout_timer); 
     1046 
    10121047    /* Cancel retransmission timer. */ 
    1013     if (tsx->retransmit_timer.id != 0) { 
    1014         pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    1015         tsx->retransmit_timer.id = 0; 
    1016     } 
     1048    tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    10171049 
    10181050    /* Clear some pending flags. */ 
     
    10401072 
    10411073/* 
    1042  * Callback when timer expires. 
     1074 * Callback when timer expires. Transport error also piggybacks this event 
     1075 * to avoid deadlock (https://trac.pjsip.org/repos/ticket/1646). 
    10431076 */ 
    10441077static void tsx_timer_callback( pj_timer_heap_t *theap, pj_timer_entry *entry) 
    10451078{ 
    1046     pjsip_event event; 
    10471079    pjsip_transaction *tsx = (pjsip_transaction*) entry->user_data; 
    10481080 
    10491081    PJ_UNUSED_ARG(theap); 
    10501082 
    1051     entry->id = 0; 
    1052      
    1053     PJ_LOG(5,(tsx->obj_name, "%s timer event",  
    1054              (entry==&tsx->retransmit_timer ? "Retransmit":"Timeout"))); 
    1055     pj_log_push_indent(); 
    1056  
    1057  
    1058     PJSIP_EVENT_INIT_TIMER(event, entry); 
    1059  
    1060     /* Dispatch event to transaction. */ 
    1061     pj_grp_lock_acquire(tsx->grp_lock); 
    1062     (*tsx->state_handler)(tsx, &event); 
    1063     pj_grp_lock_release(tsx->grp_lock); 
    1064  
    1065     pj_log_pop_indent(); 
     1083    if (entry->id == TRANSPORT_ERR_TIMER) { 
     1084        /* Posted transport error event */ 
     1085        entry->id = 0; 
     1086        if (tsx->state < PJSIP_TSX_STATE_TERMINATED) { 
     1087            pjsip_tsx_state_e prev_state; 
     1088 
     1089            pj_grp_lock_acquire(tsx->grp_lock); 
     1090            prev_state = tsx->state; 
     1091 
     1092            if (tsx->status_code < 200) { 
     1093                pj_str_t err; 
     1094                char errmsg[PJ_ERR_MSG_SIZE]; 
     1095 
     1096                err = pj_strerror(tsx->transport_err, errmsg, sizeof(errmsg)); 
     1097                tsx_set_status_code(tsx, PJSIP_SC_TSX_TRANSPORT_ERROR, &err); 
     1098            } 
     1099 
     1100            /* Set transaction state etc, but don't notify TU now, 
     1101             * otherwise we'll get a deadlock. See: 
     1102             * https://trac.pjsip.org/repos/ticket/1646 
     1103             */ 
     1104            tsx_set_state_no_notify( tsx, PJSIP_TSX_STATE_TERMINATED, 
     1105                                     PJSIP_EVENT_TRANSPORT_ERROR, NULL); 
     1106            pj_grp_lock_release(tsx->grp_lock); 
     1107 
     1108            /* Now notify TU about state change, WITHOUT holding the 
     1109             * group lock. It should be safe to do so; transaction will 
     1110             * not get destroyed because group lock reference counter 
     1111             * has been incremented by the timer heap. 
     1112             */ 
     1113            if (tsx->tsx_user && tsx->tsx_user->on_tsx_state) { 
     1114                pjsip_event e; 
     1115                PJSIP_EVENT_INIT_TSX_STATE(e, tsx, 
     1116                                           PJSIP_EVENT_TRANSPORT_ERROR, NULL, 
     1117                                           prev_state); 
     1118                (*tsx->tsx_user->on_tsx_state)(tsx, &e); 
     1119            } 
     1120        } 
     1121    } else { 
     1122        pjsip_event event; 
     1123 
     1124        entry->id = 0; 
     1125 
     1126        PJ_LOG(5,(tsx->obj_name, "%s timer event", 
     1127                 (entry==&tsx->retransmit_timer ? "Retransmit":"Timeout"))); 
     1128        pj_log_push_indent(); 
     1129 
     1130 
     1131        PJSIP_EVENT_INIT_TIMER(event, entry); 
     1132 
     1133        /* Dispatch event to transaction. */ 
     1134        pj_grp_lock_acquire(tsx->grp_lock); 
     1135        (*tsx->state_handler)(tsx, &event); 
     1136        pj_grp_lock_release(tsx->grp_lock); 
     1137 
     1138        pj_log_pop_indent(); 
     1139    } 
    10661140} 
    10671141 
     
    11411215 
    11421216        lock_timer(tsx); 
    1143  
    1144         /* Cancel timeout timer. */ 
    1145         if (tsx->timeout_timer.id != 0) { 
    1146             pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
    1147             tsx->timeout_timer.id = 0; 
    1148         } 
    1149  
    1150         tsx->timeout_timer.id = TIMER_ACTIVE; 
    1151         pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, 
    1152                                     &timeout); 
    1153  
     1217        tsx_cancel_timer(tsx, &tsx->timeout_timer); 
     1218        tsx_schedule_timer( tsx, &tsx->timeout_timer, &timeout, TIMEOUT_TIMER); 
    11541219        unlock_timer(tsx); 
    11551220 
     
    11661231} 
    11671232 
     1233/* Set transaction state without notifying tsx_user */ 
     1234static void tsx_set_state_no_notify( pjsip_transaction *tsx, 
     1235                                     pjsip_tsx_state_e state, 
     1236                                     pjsip_event_id_e event_src_type, 
     1237                                     void *event_src ) 
     1238{ 
     1239    pjsip_module *tsx_user = tsx->tsx_user; 
     1240    tsx->tsx_user = NULL; 
     1241    tsx_set_state(tsx, state, event_src_type, event_src); 
     1242    tsx->tsx_user = tsx_user; 
     1243} 
    11681244 
    11691245/* 
     
    15511627    pj_grp_lock_acquire(tsx->grp_lock); 
    15521628    /* Cancel retransmission timer. */ 
    1553     if (tsx->retransmit_timer.id != 0) { 
    1554         pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    1555         tsx->retransmit_timer.id = 0; 
    1556     } 
     1629    tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    15571630    pj_grp_lock_release(tsx->grp_lock); 
    15581631 
     
    15921665    } 
    15931666 
    1594     if (tsx->timeout_timer.id != 0) { 
    1595         pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
    1596         tsx->timeout_timer.id = 0; 
    1597     } 
     1667    tsx_cancel_timer(tsx, &tsx->timeout_timer); 
    15981668 
    15991669    timeout.sec = 0; 
     
    16011671    pj_time_val_normalize(&timeout); 
    16021672 
    1603     tsx->timeout_timer.id = TIMER_ACTIVE; 
    1604     pjsip_endpt_schedule_timer(tsx->endpt, &tsx->timeout_timer, 
    1605                                &timeout); 
    1606  
     1673    tsx_schedule_timer(tsx, &tsx->timeout_timer, &timeout, TIMEOUT_TIMER); 
    16071674 
    16081675    unlock_timer(tsx); 
     
    18291896            if (tsx->timeout_timer.id) { 
    18301897                lock_timer(tsx); 
    1831  
    1832                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
    1833                 tsx->timeout_timer.id = TIMER_INACTIVE; 
    1834  
    1835                 tsx->timeout_timer.id = TIMER_ACTIVE; 
    1836                 pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,  
    1837                                             &timeout_timer_val); 
    1838  
     1898                tsx_cancel_timer(tsx, &tsx->timeout_timer); 
     1899                tsx_schedule_timer( tsx, &tsx->timeout_timer, 
     1900                                    &timeout_timer_val, TIMEOUT_TIMER); 
    18391901                unlock_timer(tsx); 
    18401902            } 
     
    18921954    if (state == PJSIP_TP_STATE_DISCONNECTED) { 
    18931955        pjsip_transaction *tsx; 
     1956        pj_time_val delay = {0, 0}; 
    18941957 
    18951958        pj_assert(tp && info && info->user_data); 
     
    18971960        tsx = (pjsip_transaction*)info->user_data; 
    18981961 
    1899         pj_grp_lock_acquire(tsx->grp_lock); 
    1900  
    1901         /* Terminate transaction when transport disconnected */ 
    1902         if (tsx->state < PJSIP_TSX_STATE_TERMINATED) { 
    1903             pj_str_t err; 
    1904             char errmsg[PJ_ERR_MSG_SIZE]; 
    1905  
    1906             err = pj_strerror(info->status, errmsg, sizeof(errmsg)); 
    1907             tsx_set_status_code(tsx, PJSIP_SC_TSX_TRANSPORT_ERROR, &err); 
    1908             tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
    1909                            PJSIP_EVENT_TRANSPORT_ERROR, NULL); 
    1910         } 
    1911  
    1912         pj_grp_lock_release(tsx->grp_lock); 
     1962        /* Post the event for later processing, to avoid deadlock. 
     1963         * See https://trac.pjsip.org/repos/ticket/1646 
     1964         */ 
     1965        lock_timer(tsx); 
     1966        tsx->transport_err = info->status; 
     1967        tsx_cancel_timer(tsx, &tsx->timeout_timer); 
     1968        tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay, 
     1969                           TRANSPORT_ERR_TIMER); 
     1970        unlock_timer(tsx); 
    19131971    } 
    19141972} 
     
    21192177        timeout.sec = msec_time / 1000; 
    21202178        timeout.msec = msec_time % 1000; 
    2121         tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2122         pjsip_endpt_schedule_timer( tsx->endpt, &tsx->retransmit_timer,  
    2123                                     &timeout); 
     2179        tsx_schedule_timer( tsx, &tsx->retransmit_timer, &timeout, 
     2180                            RETRANSMIT_TIMER); 
    21242181    } 
    21252182} 
     
    21882245} 
    21892246 
    2190  
    21912247/* 
    21922248 * Handler for events in state Null. 
     
    22412297         */ 
    22422298        lock_timer(tsx); 
    2243         tsx->timeout_timer.id = TIMER_ACTIVE; 
    2244         pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,  
    2245                                     &timeout_timer_val); 
     2299        tsx_schedule_timer( tsx, &tsx->timeout_timer, &timeout_timer_val, 
     2300                            TIMEOUT_TIMER); 
    22462301        unlock_timer(tsx); 
    22472302 
     
    22542309                tsx->transport_flag |= TSX_HAS_PENDING_RESCHED; 
    22552310            } else { 
    2256                 tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2257                 pjsip_endpt_schedule_timer(tsx->endpt, &tsx->retransmit_timer, 
    2258                                            &t1_timer_val); 
     2311                tsx_schedule_timer(tsx, &tsx->retransmit_timer, 
     2312                                   &t1_timer_val, RETRANSMIT_TIMER); 
    22592313            } 
    22602314        } 
     
    22932347               event->body.timer.entry == &tsx->timeout_timer)  
    22942348    { 
    2295  
    22962349        /* Cancel retransmission timer. */ 
    2297         if (tsx->retransmit_timer.id != 0) { 
    2298             pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2299             tsx->retransmit_timer.id = 0; 
    2300         } 
     2350        tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
     2351 
    23012352        tsx->transport_flag &= ~(TSX_HAS_PENDING_RESCHED); 
    23022353 
     
    23052356 
    23062357        /* Inform TU. */ 
    2307         tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     2358        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, 
    23082359                       PJSIP_EVENT_TIMER, &tsx->timeout_timer); 
    23092360 
     
    23282379         */ 
    23292380        if (code >= 200) { 
    2330             if (tsx->retransmit_timer.id != 0) { 
    2331                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2332                 tsx->retransmit_timer.id = 0; 
    2333             } 
     2381            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    23342382 
    23352383            if (tsx->timeout_timer.id != 0) { 
    23362384                lock_timer(tsx); 
    2337                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
    2338                 tsx->timeout_timer.id = 0; 
     2385                tsx_cancel_timer(tsx, &tsx->timeout_timer); 
    23392386                unlock_timer(tsx); 
    23402387            } 
     
    23442391             * retransmit timer will be rescheduled at T2. 
    23452392             */ 
    2346             if (tsx->retransmit_timer.id != 0) { 
    2347                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2348                 tsx->retransmit_timer.id = 0; 
    2349             } 
     2393            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    23502394 
    23512395            /* For provisional response, only cancel retransmit when this 
     
    23592403                /* Cancel timeout timer */ 
    23602404                lock_timer(tsx); 
    2361                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer); 
     2405                tsx_cancel_timer(tsx, &tsx->timeout_timer); 
    23622406                unlock_timer(tsx); 
    23632407 
    23642408            } else { 
    23652409                if (!tsx->is_reliable) { 
    2366                     tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2367                     pjsip_endpt_schedule_timer(tsx->endpt,  
    2368                                                &tsx->retransmit_timer, 
    2369                                                &t2_timer_val); 
     2410                    tsx_schedule_timer(tsx, &tsx->retransmit_timer, 
     2411                                       &t2_timer_val, RETRANSMIT_TIMER); 
    23702412                } 
    23712413            } 
     
    25252567 
    25262568                /* Stop 1xx retransmission timer, if any */ 
    2527                 if (tsx->retransmit_timer.id) { 
    2528                     pjsip_endpt_cancel_timer(tsx->endpt,  
    2529                                              &tsx->retransmit_timer); 
    2530                     tsx->retransmit_timer.id = 0; 
    2531                 } 
     2569                tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    25322570 
    25332571                /* Schedule retransmission */ 
     
    25372575                } else { 
    25382576                    pj_time_val delay = {PJSIP_TSX_1XX_RETRANS_DELAY, 0}; 
    2539  
    2540                     tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2541                     pjsip_endpt_schedule_timer( tsx->endpt,  
    2542                                                 &tsx->retransmit_timer, 
    2543                                                 &delay); 
     2577                    tsx_schedule_timer( tsx, &tsx->retransmit_timer, &delay, 
     2578                                        RETRANSMIT_TIMER); 
    25442579                } 
    25452580            } 
     
    25482583 
    25492584            /* Stop 1xx retransmission timer, if any */ 
    2550             if (tsx->retransmit_timer.id) { 
    2551                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2552                 tsx->retransmit_timer.id = 0; 
    2553             } 
     2585            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    25542586 
    25552587            if (tsx->method.id == PJSIP_INVITE_METHOD && tsx->handle_200resp==0) { 
     
    25722604                        tsx->transport_flag |= TSX_HAS_PENDING_RESCHED; 
    25732605                    } else { 
    2574                         tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2575                         pjsip_endpt_schedule_timer( tsx->endpt,  
    2576                                                     &tsx->retransmit_timer, 
    2577                                                     &t1_timer_val); 
     2606                        tsx_schedule_timer( tsx, &tsx->retransmit_timer, 
     2607                                            &t1_timer_val, RETRANSMIT_TIMER); 
    25782608                    } 
    25792609                } 
     
    26122642 
    26132643                lock_timer(tsx); 
    2614                 tsx->timeout_timer.id = TIMER_ACTIVE; 
    2615                 pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,  
    2616                                             &timeout); 
     2644                tsx_schedule_timer( tsx, &tsx->timeout_timer, 
     2645                                    &timeout, TIMEOUT_TIMER); 
    26172646                unlock_timer(tsx); 
    26182647 
     
    26252654 
    26262655            /* Stop 1xx retransmission timer, if any */ 
    2627             if (tsx->retransmit_timer.id) { 
    2628                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2629                 tsx->retransmit_timer.id = 0; 
    2630             } 
     2656            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    26312657 
    26322658            /* 3xx-6xx class message causes transaction to move to  
     
    26462672            if (tsx->method.id == PJSIP_INVITE_METHOD) { 
    26472673                /* Start timer H for INVITE */ 
    2648                 tsx->timeout_timer.id = TIMER_ACTIVE; 
    2649                 pjsip_endpt_schedule_timer(tsx->endpt,&tsx->timeout_timer, 
    2650                                            &timeout_timer_val); 
     2674                tsx_schedule_timer(tsx, &tsx->timeout_timer, 
     2675                                   &timeout_timer_val, TIMEOUT_TIMER); 
    26512676            } else if (!tsx->is_reliable) { 
    26522677                /* Start timer J on 64*T1 seconds for non-INVITE */ 
    2653                 tsx->timeout_timer.id = TIMER_ACTIVE; 
    2654                 pjsip_endpt_schedule_timer(tsx->endpt,&tsx->timeout_timer, 
    2655                                            &timeout_timer_val); 
     2678                tsx_schedule_timer(tsx, &tsx->timeout_timer, 
     2679                                   &timeout_timer_val, TIMEOUT_TIMER); 
    26562680            } else { 
    26572681                /* Start timer J on zero seconds for non-INVITE */ 
    26582682                pj_time_val zero_time = { 0, 0 }; 
    2659                 tsx->timeout_timer.id = TIMER_ACTIVE; 
    2660                 pjsip_endpt_schedule_timer(tsx->endpt,&tsx->timeout_timer, 
    2661                                            &zero_time); 
     2683                tsx_schedule_timer(tsx, &tsx->timeout_timer, 
     2684                                   &zero_time, TIMEOUT_TIMER); 
    26622685            } 
    26632686            unlock_timer(tsx); 
     
    26752698                        tsx->transport_flag |= TSX_HAS_PENDING_RESCHED; 
    26762699                    } else { 
    2677                         tsx->retransmit_timer.id = TIMER_ACTIVE; 
    2678                         pjsip_endpt_schedule_timer(tsx->endpt,  
    2679                                                    &tsx->retransmit_timer,  
    2680                                                    &t1_timer_val); 
     2700                        tsx_schedule_timer(tsx, &tsx->retransmit_timer, 
     2701                                           &t1_timer_val, RETRANSMIT_TIMER); 
    26812702                    } 
    26822703                } 
     
    27182739        tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL); 
    27192740 
    2720         tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     2741        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, 
    27212742                       PJSIP_EVENT_TIMER, &tsx->timeout_timer); 
    27222743 
     
    27902811        /* Stop timeout timer B/F. */ 
    27912812        lock_timer(tsx); 
    2792         pjsip_endpt_cancel_timer( tsx->endpt, &tsx->timeout_timer ); 
     2813        tsx_cancel_timer( tsx, &tsx->timeout_timer ); 
    27932814        unlock_timer(tsx); 
    27942815 
     
    28162837            } 
    28172838            lock_timer(tsx); 
    2818             tsx->timeout_timer.id = TIMER_ACTIVE; 
    2819             pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,  
    2820                                         &timeout); 
     2839            tsx_schedule_timer( tsx, &tsx->timeout_timer, 
     2840                                &timeout, TIMEOUT_TIMER); 
    28212841            unlock_timer(tsx); 
    28222842 
    28232843            /* Cancel retransmission timer */ 
    2824             if (tsx->retransmit_timer.id != 0) { 
    2825                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2826                 tsx->retransmit_timer.id = 0; 
    2827             } 
     2844            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    28282845 
    28292846            /* Move state to Completed, inform TU. */ 
     
    28362853 
    28372854        /* Inform TU. */ 
    2838         tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     2855        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, 
    28392856                       PJSIP_EVENT_TIMER, &tsx->timeout_timer); 
    28402857 
     
    28522869 
    28532870        /* Stop timer B. */ 
    2854         pjsip_endpt_cancel_timer( tsx->endpt, &tsx->timeout_timer ); 
     2871        tsx_cancel_timer( tsx, &tsx->timeout_timer ); 
    28552872 
    28562873        /* Generate and send ACK for INVITE. */ 
     
    28852902            timeout.sec = timeout.msec = 0; 
    28862903        } 
    2887         tsx->timeout->timer.id = TSX_TIMER_TIMEOUT; 
    2888         pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, &timeout); 
     2904        tsx_schedule_timer( tsx, &tsx->timeout_timer, &timeout, TIMEOUT_TIMER); 
    28892905 
    28902906        /* Inform TU.  
     
    29052921 
    29062922        /* Cancel retransmission timer */ 
    2907         if (tsx->retransmit_timer.id != 0) { 
    2908             pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    2909             tsx->retransmit_timer.id = 0; 
    2910         } 
     2923        tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
    29112924 
    29122925        /* Stop timer B. */ 
    29132926        lock_timer(tsx); 
    2914         tsx->timeout_timer.id = 0; 
    2915         pjsip_endpt_cancel_timer( tsx->endpt, &tsx->timeout_timer ); 
     2927        tsx_cancel_timer( tsx, &tsx->timeout_timer ); 
    29162928        unlock_timer(tsx); 
    29172929 
     
    29662978         *  https://trac.pjsip.org/repos/ticket/1374 
    29672979         */ 
    2968         if (tsx->timeout_timer.id) 
    2969             pjsip_endpt_cancel_timer( tsx->endpt, &tsx->timeout_timer ); 
    2970         tsx->timeout_timer.id = TIMER_ACTIVE; 
    2971         pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, &timeout); 
     2980        tsx_cancel_timer( tsx, &tsx->timeout_timer ); 
     2981        tsx_schedule_timer( tsx, &tsx->timeout_timer, &timeout, 
     2982                            TIMEOUT_TIMER); 
    29722983        unlock_timer(tsx); 
    29732984 
     
    30213032 
    30223033            /* Cease retransmission. */ 
    3023             if (tsx->retransmit_timer.id != 0) { 
    3024                 pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer); 
    3025                 tsx->retransmit_timer.id = 0; 
    3026             } 
     3034            tsx_cancel_timer(tsx, &tsx->retransmit_timer); 
     3035 
    30273036            tsx->transport_flag &= ~(TSX_HAS_PENDING_RESCHED); 
    30283037 
    30293038            /* Reschedule timeout timer. */ 
    30303039            lock_timer(tsx); 
    3031             pjsip_endpt_cancel_timer( tsx->endpt, &tsx->timeout_timer ); 
    3032             tsx->timeout_timer.id = TIMER_ACTIVE; 
     3040            tsx_cancel_timer( tsx, &tsx->timeout_timer ); 
    30333041 
    30343042            /* Timer I is T4 timer for unreliable transports, and 
     
    30423050                timeout.msec = t4_timer_val.msec; 
    30433051            } 
    3044             pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,  
    3045                                         &timeout); 
     3052            tsx_schedule_timer( tsx, &tsx->timeout_timer, 
     3053                                &timeout, TIMEOUT_TIMER); 
    30463054            unlock_timer(tsx); 
    30473055 
     
    31083116 
    31093117        /* Move to Terminated state. */ 
    3110         tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     3118        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, 
    31113119                       PJSIP_EVENT_TIMER, event->body.timer.entry ); 
    31123120 
     
    31773185 
    31783186        /* Move to Terminated state. */ 
    3179         tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     3187        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, 
    31803188                       PJSIP_EVENT_TIMER, &tsx->timeout_timer ); 
    31813189 
Note: See TracChangeset for help on using the changeset viewer.