Ignore:
Timestamp:
Jun 28, 2006 4:46:49 PM (18 years ago)
Author:
bennylp
Message:

Major improvements in PJSIP to support TCP. The changes fall into these categories: (1) the TCP transport implementation itself (*.[hc]), (2) bug-fix in SIP transaction when using reliable transports, (3) support for TCP transport in PJSUA-LIB/PJSUA, and (4) changes in PJSIP-TEST to support TCP testing.

File:
1 edited

Legend:

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

    r127 r563  
    2222 
    2323#define POOL_SIZE       8000 
    24 #define LOOP            10000 
     24#if defined(PJ_DEBUG) && PJ_DEBUG!=0 
     25#   define LOOP         10000 
     26#else 
     27#   define LOOP         100000 
     28#endif 
    2529#define AVERAGE_MSG_LEN 800 
    2630#define THIS_FILE       "msg_test.c" 
     
    3539#define FLAG_PARSE_ONLY         4 
    3640#define FLAG_PRINT_ONLY         8 
    37  
    38 static int flag = 0; 
    3941 
    4042struct test_msg 
     
    102104}; 
    103105 
    104 static pj_highprec_t detect_len, parse_len, print_len; 
    105 static pj_timestamp  detect_time, parse_time, print_time; 
     106static struct 
     107{ 
     108    int flag; 
     109    pj_highprec_t detect_len, parse_len, print_len; 
     110    pj_timestamp  detect_time, parse_time, print_time; 
     111} var; 
    106112 
    107113static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry ) 
     
    122128    entry->len = pj_native_strlen(entry->msg); 
    123129 
    124     if (flag & FLAG_PARSE_ONLY) 
     130    if (var.flag & FLAG_PARSE_ONLY) 
    125131        goto parse_msg; 
    126132 
    127     if (flag & FLAG_PRINT_ONLY) { 
     133    if (var.flag & FLAG_PRINT_ONLY) { 
    128134        if (print_msg == NULL) 
    129135            print_msg = entry->creator(pool); 
     
    132138 
    133139    /* Detect message. */ 
    134     detect_len = detect_len + entry->len; 
     140    var.detect_len = var.detect_len + entry->len; 
    135141    pj_get_timestamp(&t1); 
    136142    status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size); 
     
    149155    pj_get_timestamp(&t2); 
    150156    pj_sub_timestamp(&t2, &t1); 
    151     pj_add_timestamp(&detect_time, &t2); 
    152  
    153     if (flag & FLAG_DETECT_ONLY) 
     157    pj_add_timestamp(&var.detect_time, &t2); 
     158 
     159    if (var.flag & FLAG_DETECT_ONLY) 
    154160        return PJ_SUCCESS; 
    155161     
    156162    /* Parse message. */ 
    157163parse_msg: 
    158     parse_len = parse_len + entry->len; 
     164    var.parse_len = var.parse_len + entry->len; 
    159165    pj_get_timestamp(&t1); 
    160166    pj_list_init(&err_list); 
     
    172178    pj_get_timestamp(&t2); 
    173179    pj_sub_timestamp(&t2, &t1); 
    174     pj_add_timestamp(&parse_time, &t2); 
    175  
    176     if (flag & FLAG_PARSE_ONLY) 
     180    pj_add_timestamp(&var.parse_time, &t2); 
     181 
     182    if (var.flag & FLAG_PARSE_ONLY) 
    177183        return PJ_SUCCESS; 
    178184 
     
    307313    /* Print message. */ 
    308314print_msg: 
    309     print_len = print_len + entry->len; 
     315    var.print_len = var.print_len + entry->len; 
    310316    pj_get_timestamp(&t1); 
    311     if (flag && FLAG_PRINT_ONLY) 
     317    if (var.flag && FLAG_PRINT_ONLY) 
    312318        ref_msg = print_msg; 
    313319    len = pjsip_msg_print(ref_msg, msgbuf1, PJSIP_MAX_PKT_LEN); 
     
    318324    pj_get_timestamp(&t2); 
    319325    pj_sub_timestamp(&t2, &t1); 
    320     pj_add_timestamp(&print_time, &t2); 
     326    pj_add_timestamp(&var.print_time, &t2); 
    321327 
    322328 
     
    675681/*****************************************************************************/ 
    676682 
    677 int msg_test(void) 
     683static pj_status_t simple_test(void) 
     684{ 
     685    unsigned i; 
     686    pj_status_t status; 
     687 
     688    PJ_LOG(3,(THIS_FILE, "  simple test..")); 
     689    for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) { 
     690        pj_pool_t *pool; 
     691        pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE); 
     692        status = test_entry( pool, &test_array[i] ); 
     693        pjsip_endpt_release_pool(endpt, pool); 
     694 
     695        if (status != PJ_SUCCESS) 
     696            return status; 
     697    } 
     698 
     699    return PJ_SUCCESS; 
     700} 
     701 
     702 
     703static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,  
     704                         unsigned *p_print) 
    678705{ 
    679706    pj_status_t status; 
     
    684711    pj_highprec_t avg_detect, avg_parse, avg_print, kbytes; 
    685712 
    686     PJ_LOG(3,(THIS_FILE, "  simple test..")); 
    687     for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) { 
    688         pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE); 
    689         status = test_entry( pool, &test_array[i] ); 
    690         pjsip_endpt_release_pool(endpt, pool); 
    691  
    692         if (status != PJ_SUCCESS) 
    693             return status; 
    694     } 
    695  
    696     PJ_LOG(3,(THIS_FILE, "  benchmarking..")); 
    697     detect_len = parse_len = print_len = 0; 
    698     zero.u64 = detect_time.u64 = parse_time.u64 = print_time.u64 = 0; 
    699      
     713 
     714    pj_memset(&var, 0, sizeof(var)); 
     715    zero.u64 = 0; 
     716 
    700717    for (loop=0; loop<LOOP; ++loop) { 
    701718        for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) { 
     
    709726    } 
    710727 
    711     kbytes = detect_len; 
     728    kbytes = var.detect_len; 
    712729    pj_highprec_mod(kbytes, 1000000); 
    713730    pj_highprec_div(kbytes, 100000); 
    714     elapsed = pj_elapsed_time(&zero, &detect_time); 
    715     avg_detect = pj_elapsed_usec(&zero, &detect_time); 
     731    elapsed = pj_elapsed_time(&zero, &var.detect_time); 
     732    avg_detect = pj_elapsed_usec(&zero, &var.detect_time); 
    716733    pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN); 
    717     pj_highprec_div(avg_detect, detect_len); 
     734    pj_highprec_div(avg_detect, var.detect_len); 
    718735    avg_detect = 1000000 / avg_detect; 
    719736 
    720737    PJ_LOG(3,(THIS_FILE,  
    721738              "    %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",  
    722               (unsigned)(detect_len/1000000), (unsigned)kbytes, 
     739              (unsigned)(var.detect_len/1000000), (unsigned)kbytes, 
    723740              elapsed.sec, elapsed.msec, 
    724741              (unsigned)avg_detect)); 
    725  
    726     kbytes = parse_len; 
     742    *p_detect = (unsigned)avg_detect; 
     743 
     744    kbytes = var.parse_len; 
    727745    pj_highprec_mod(kbytes, 1000000); 
    728746    pj_highprec_div(kbytes, 100000); 
    729     elapsed = pj_elapsed_time(&zero, &parse_time); 
    730     avg_parse = pj_elapsed_usec(&zero, &parse_time); 
     747    elapsed = pj_elapsed_time(&zero, &var.parse_time); 
     748    avg_parse = pj_elapsed_usec(&zero, &var.parse_time); 
    731749    pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN); 
    732     pj_highprec_div(avg_parse, parse_len); 
     750    pj_highprec_div(avg_parse, var.parse_len); 
    733751    avg_parse = 1000000 / avg_parse; 
    734752 
    735753    PJ_LOG(3,(THIS_FILE,  
    736754              "    %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",  
    737               (unsigned)(parse_len/1000000), (unsigned)kbytes, 
     755              (unsigned)(var.parse_len/1000000), (unsigned)kbytes, 
    738756              elapsed.sec, elapsed.msec, 
    739757              (unsigned)avg_parse)); 
    740  
    741     kbytes = print_len; 
     758    *p_parse = (unsigned)avg_parse; 
     759 
     760    kbytes = var.print_len; 
    742761    pj_highprec_mod(kbytes, 1000000); 
    743762    pj_highprec_div(kbytes, 100000); 
    744     elapsed = pj_elapsed_time(&zero, &print_time); 
    745     avg_print = pj_elapsed_usec(&zero, &print_time); 
     763    elapsed = pj_elapsed_time(&zero, &var.print_time); 
     764    avg_print = pj_elapsed_usec(&zero, &var.print_time); 
    746765    pj_highprec_mul(avg_print, AVERAGE_MSG_LEN); 
    747     pj_highprec_div(avg_print, print_len); 
     766    pj_highprec_div(avg_print, var.print_len); 
    748767    avg_print = 1000000 / avg_print; 
    749768 
    750769    PJ_LOG(3,(THIS_FILE,  
    751770              "    %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",  
    752               (unsigned)(print_len/1000000), (unsigned)kbytes, 
     771              (unsigned)(var.print_len/1000000), (unsigned)kbytes, 
    753772              elapsed.sec, elapsed.msec, 
    754773              (unsigned)avg_print)); 
    755774 
     775    *p_print = (unsigned)avg_print; 
    756776    return status; 
    757777} 
    758778 
    759779/*****************************************************************************/ 
     780 
     781int msg_test(void) 
     782{ 
     783    enum { COUNT = 4, DETECT=0, PARSE=1, PRINT=2 }; 
     784    struct { 
     785        unsigned detect; 
     786        unsigned parse; 
     787        unsigned print; 
     788    } run[COUNT]; 
     789    unsigned i, max, avg_len; 
     790    char desc[250]; 
     791    pj_status_t status; 
     792 
     793 
     794    status = simple_test(); 
     795    if (status != PJ_SUCCESS) 
     796        return status; 
     797 
     798    for (i=0; i<COUNT; ++i) { 
     799        PJ_LOG(3,(THIS_FILE, "  benchmarking (%d of %d)..", i+1, COUNT)); 
     800        status = msg_benchmark(&run[i].detect, &run[i].parse, &run[i].print); 
     801        if (status != PJ_SUCCESS) 
     802            return status; 
     803    } 
     804 
     805    /* Calculate average message length */ 
     806    for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(test_array); ++i) { 
     807        avg_len += test_array[i].len; 
     808    } 
     809    avg_len /= PJ_ARRAY_SIZE(test_array); 
     810 
     811 
     812    /* Print maximum detect/sec */ 
     813    for (i=0, max=0; i<COUNT; ++i) 
     814        if (run[i].detect > max) max = run[i].detect; 
     815 
     816    PJ_LOG(3,("", "  Maximum message detection/sec=%u", max)); 
     817 
     818    pj_ansi_sprintf(desc, "Number of SIP messages " 
     819                          "can be pre-parse by <tt>pjsip_find_msg()</tt> " 
     820                          "per second (tested with %d message sets with " 
     821                          "average message length of " 
     822                          "%d bytes)", PJ_ARRAY_SIZE(test_array), avg_len); 
     823    report_ival("msg-detect-per-sec", max, "msg/sec", desc); 
     824 
     825    /* Print maximum parse/sec */ 
     826    for (i=0, max=0; i<COUNT; ++i) 
     827        if (run[i].parse > max) max = run[i].parse; 
     828 
     829    PJ_LOG(3,("", "  Maximum message parsing/sec=%u", max)); 
     830 
     831    pj_ansi_sprintf(desc, "Number of SIP messages " 
     832                          "can be <b>parsed</b> by <tt>pjsip_parse_msg()</tt> " 
     833                          "per second (tested with %d message sets with " 
     834                          "average message length of " 
     835                          "%d bytes)", PJ_ARRAY_SIZE(test_array), avg_len); 
     836    report_ival("msg-parse-per-sec", max, "msg/sec", desc); 
     837 
     838    /* Msg parsing bandwidth */ 
     839    report_ival("msg-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec", 
     840                "Message parsing bandwidth in megabytes (number of megabytes" 
     841                " worth of SIP messages that can be parsed per second). " 
     842                "The value is derived from msg-parse-per-sec above."); 
     843 
     844 
     845    /* Print maximum print/sec */ 
     846    for (i=0, max=0; i<COUNT; ++i) 
     847        if (run[i].print > max) max = run[i].print; 
     848 
     849    PJ_LOG(3,("", "  Maximum message print/sec=%u", max)); 
     850 
     851    pj_ansi_sprintf(desc, "Number of SIP messages " 
     852                          "can be <b>printed</b> by <tt>pjsip_msg_print()</tt>" 
     853                          " per second (tested with %d message sets with " 
     854                          "average message length of " 
     855                          "%d bytes)", PJ_ARRAY_SIZE(test_array), avg_len); 
     856 
     857    report_ival("msg-print-per-sec", max, "msg/sec", desc); 
     858 
     859    /* Msg print bandwidth */ 
     860    report_ival("msg-printed-bandwidth-mb", avg_len*max/1000000, "MB/sec", 
     861                "Message print bandwidth in megabytes (total size of " 
     862                "SIP messages printed per second). " 
     863                "The value is derived from msg-print-per-sec above."); 
     864 
     865 
     866    return PJ_SUCCESS; 
     867} 
     868 
Note: See TracChangeset for help on using the changeset viewer.