Ignore:
Timestamp:
Mar 5, 2013 11:59:54 AM (8 years ago)
Author:
bennylp
Message:

Implementation of Re #1628: Modify SIP transaction to use group lock to avoid deadlock etc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/test/tsx_basic_test.c

    r3553 r4420  
    126126            return -40; 
    127127        } 
    128         pj_mutex_unlock(tsx->mutex); 
     128        pj_grp_lock_release(tsx->grp_lock); 
    129129    } 
    130130 
     
    156156    return 0; 
    157157} 
     158 
     159/**************************************************************************/ 
     160 
     161struct tsx_test_state 
     162{ 
     163    int pool_cnt; 
     164}; 
     165 
     166static void save_tsx_test_state(struct tsx_test_state *st) 
     167{ 
     168    st->pool_cnt = caching_pool.used_count; 
     169} 
     170 
     171static pj_status_t check_tsx_test_state(struct tsx_test_state *st) 
     172{ 
     173    if (caching_pool.used_count > st->pool_cnt) 
     174        return -1; 
     175 
     176    return 0; 
     177} 
     178 
     179static void destroy_endpt() 
     180{ 
     181    pjsip_endpt_destroy(endpt); 
     182    endpt = NULL; 
     183} 
     184 
     185static pj_status_t init_endpt() 
     186{ 
     187    pj_str_t ns = { "10.187.27.172", 13};       /* just a random, unreachable IP */ 
     188    pj_dns_resolver *resolver; 
     189    pj_status_t rc; 
     190 
     191    rc = pjsip_endpt_create(&caching_pool.factory, "endpt", &endpt); 
     192    if (rc != PJ_SUCCESS) { 
     193        app_perror("pjsip_endpt_create", rc); 
     194        return rc; 
     195    } 
     196 
     197    /* Start transaction layer module. */ 
     198    rc = pjsip_tsx_layer_init_module(endpt); 
     199    if (rc != PJ_SUCCESS) { 
     200        app_perror("tsx_layer_init", rc); 
     201        return rc; 
     202    } 
     203 
     204    rc = pjsip_udp_transport_start(endpt, NULL, NULL, 1,  NULL); 
     205    if (rc != PJ_SUCCESS) { 
     206        app_perror("udp init", rc); 
     207        return rc; 
     208    } 
     209 
     210    rc = pjsip_tcp_transport_start(endpt, NULL, 1, NULL); 
     211    if (rc != PJ_SUCCESS) { 
     212        app_perror("tcp init", rc); 
     213        return rc; 
     214    } 
     215 
     216    rc = pjsip_endpt_create_resolver(endpt, &resolver); 
     217    if (rc != PJ_SUCCESS) { 
     218        app_perror("create resolver", rc); 
     219        return rc; 
     220    } 
     221 
     222    pj_dns_resolver_set_ns(resolver, 1, &ns, NULL); 
     223 
     224    rc = pjsip_endpt_set_resolver(endpt, resolver); 
     225    if (rc != PJ_SUCCESS) { 
     226        app_perror("set resolver", rc); 
     227        return rc; 
     228    } 
     229 
     230    return PJ_SUCCESS; 
     231} 
     232 
     233static int tsx_create_and_send_req(void *arg) 
     234{ 
     235    pj_str_t dst_uri = pj_str((char*)arg); 
     236    pj_str_t from_uri = pj_str((char*)"<sip:user@host>"); 
     237    pjsip_tx_data *tdata; 
     238    pj_status_t status; 
     239 
     240    status = pjsip_endpt_create_request(endpt, &pjsip_options_method, 
     241                                        &dst_uri, &from_uri, &dst_uri, 
     242                                        NULL, NULL, -1, NULL, 
     243                                        &tdata); 
     244    if (status != PJ_SUCCESS) 
     245        return status; 
     246 
     247    status = pjsip_endpt_send_request(endpt, tdata, -1, NULL, NULL); 
     248    if (status != PJ_SUCCESS) 
     249        return status; 
     250 
     251    return PJ_SUCCESS; 
     252} 
     253 
     254int tsx_destroy_test() 
     255{ 
     256    struct tsx_test_state state; 
     257    struct test_desc 
     258    { 
     259        const char *title; 
     260        int (*func)(void*); 
     261        void *arg; 
     262        int sleep_before_unload; 
     263        int sleep_after_unload; 
     264    } test_entries[] = 
     265    { 
     266        { 
     267            "normal unable to resolve", 
     268            &tsx_create_and_send_req, 
     269            "sip:user@somehost", 
     270            10000, 
     271            1 
     272        }, 
     273        { 
     274            "resolve and destroy, wait", 
     275            &tsx_create_and_send_req, 
     276            "sip:user@somehost", 
     277            1, 
     278            10000 
     279        }, 
     280        { 
     281            "tcp connect and destroy", 
     282            &tsx_create_and_send_req, 
     283            "sip:user@10.125.36.63:58517;transport=tcp", 
     284            60000, 
     285            1000 
     286        }, 
     287        { 
     288            "tcp connect and destroy", 
     289            &tsx_create_and_send_req, 
     290            "sip:user@10.125.36.63:58517;transport=tcp", 
     291            1, 
     292            60000 
     293        }, 
     294 
     295    }; 
     296    int rc; 
     297    unsigned i; 
     298    const int INDENT = 2; 
     299 
     300    pj_log_add_indent(INDENT); 
     301    destroy_endpt(); 
     302 
     303    for (i=0; i<PJ_ARRAY_SIZE(test_entries); ++i) { 
     304        struct test_desc *td = &test_entries[i]; 
     305 
     306        PJ_LOG(3,(THIS_FILE, "%s", td->title)); 
     307 
     308        pj_log_add_indent(INDENT); 
     309        save_tsx_test_state(&state); 
     310 
     311        rc = init_endpt(); 
     312        if (rc != PJ_SUCCESS) { 
     313            pj_log_add_indent(-INDENT*2); 
     314            return -10; 
     315        } 
     316 
     317        rc = td->func(td->arg); 
     318        if (rc != PJ_SUCCESS) { 
     319            pj_log_add_indent(-INDENT*2); 
     320            return -20; 
     321        } 
     322 
     323        flush_events(td->sleep_before_unload); 
     324        pjsip_tsx_layer_destroy(); 
     325        flush_events(td->sleep_after_unload); 
     326        destroy_endpt(); 
     327 
     328        rc = check_tsx_test_state(&state); 
     329        if (rc != PJ_SUCCESS) { 
     330            init_endpt(); 
     331            pj_log_add_indent(-INDENT*2); 
     332            return -30; 
     333        } 
     334 
     335        pj_log_add_indent(-INDENT); 
     336    } 
     337 
     338    init_endpt(); 
     339 
     340    pj_log_add_indent(-INDENT); 
     341    return 0; 
     342} 
     343 
Note: See TracChangeset for help on using the changeset viewer.