diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-12-01 11:14:37 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-12-01 11:14:37 +0000 |
commit | b9032ff0ae71378939fda1bacde4ee89a685f6d1 (patch) | |
tree | a0e337be547e0d1b5760c2a226535f9e6f1f550c /pjsip/src | |
parent | 634423cd1e3f12d6cc70c8e6564d40e986eb0312 (diff) |
Fixed ticket #29: calling pjsua_init() to reinitialize the whole libraries after pjsua_destroy() is called
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@839 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsip/sip_endpoint.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_parser.c | 30 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transaction.c | 12 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 3 |
4 files changed, 34 insertions, 15 deletions
diff --git a/pjsip/src/pjsip/sip_endpoint.c b/pjsip/src/pjsip/sip_endpoint.c index 2dd872f4..59729987 100644 --- a/pjsip/src/pjsip/sip_endpoint.c +++ b/pjsip/src/pjsip/sip_endpoint.c @@ -108,6 +108,7 @@ static pj_status_t endpt_on_tx_msg( pjsip_endpoint *endpt, /* Defined in sip_parser.c */ void init_sip_parser(void); +void deinit_sip_parser(void); /* Defined in sip_tel_uri.c */ pj_status_t pjsip_tel_uri_subsys_init(void); @@ -588,6 +589,9 @@ PJ_DEF(void) pjsip_endpt_destroy(pjsip_endpoint *endpt) /* Delete endpoint mutex. */ pj_mutex_destroy(endpt->mutex); + /* Deinit parser */ + deinit_sip_parser(); + /* Delete module's mutex */ pj_rwmutex_destroy(endpt->mod_mutex); diff --git a/pjsip/src/pjsip/sip_parser.c b/pjsip/src/pjsip/sip_parser.c index ce5e5e4c..bb6d6baa 100644 --- a/pjsip/src/pjsip/sip_parser.c +++ b/pjsip/src/pjsip/sip_parser.c @@ -281,14 +281,8 @@ static void concat_param( pj_str_t *param, pj_pool_t *pool, /* Initialize static properties of the parser. */ static pj_status_t init_parser() { - static int initialized; pj_status_t status; - if (initialized) - return PJ_SUCCESS; - - initialized = 1; - /* * Syntax error exception number. */ @@ -472,12 +466,26 @@ static pj_status_t init_parser() void init_sip_parser(void) { - if (!parser_is_initialized) { - if (!parser_is_initialized) { - init_parser(); - parser_is_initialized = 1; - } + pj_enter_critical_section(); + if (++parser_is_initialized == 1) { + init_parser(); + } + pj_leave_critical_section(); +} + +void deinit_sip_parser(void) +{ + pj_enter_critical_section(); + if (--parser_is_initialized == 0) { + /* Clear header handlers */ + pj_bzero(handler, sizeof(handler)); + handler_count = 0; + + /* Clear URI handlers */ + pj_bzero(uri_handler, sizeof(uri_handler)); + uri_handler_count = 0; } + pj_leave_critical_section(); } /* Compare the handler record with header name, and return: diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c index af742b6f..23685ff6 100644 --- a/pjsip/src/pjsip/sip_transaction.c +++ b/pjsip/src/pjsip/sip_transaction.c @@ -175,7 +175,7 @@ static void tsx_timer_callback( pj_timer_heap_t *theap, pj_timer_entry *entry); static pj_status_t tsx_create( pjsip_module *tsx_user, pjsip_transaction **p_tsx); -static void tsx_destroy( pjsip_transaction *tsx ); +static pj_status_t tsx_destroy( pjsip_transaction *tsx ); static void tsx_resched_retransmission( pjsip_transaction *tsx ); static pj_status_t tsx_retransmit( pjsip_transaction *tsx, int resched); static int tsx_send_msg( pjsip_transaction *tsx, @@ -644,8 +644,10 @@ static pj_status_t mod_tsx_layer_stop(void) while (it) { pjsip_transaction *tsx = pj_hash_this(mod_tsx_layer.htable, it); pj_hash_iterator_t *next = pj_hash_next(mod_tsx_layer.htable, it); - if (tsx) + if (tsx) { + mod_tsx_layer_unregister_tsx(tsx); tsx_destroy(tsx); + } it = next; } @@ -920,7 +922,7 @@ static pj_status_t tsx_create( pjsip_module *tsx_user, /* Destroy transaction. */ -static void tsx_destroy( pjsip_transaction *tsx ) +static pj_status_t tsx_destroy( pjsip_transaction *tsx ) { struct tsx_lock_data *lck; @@ -954,7 +956,7 @@ static void tsx_destroy( pjsip_transaction *tsx ) tsx->tsx_user = NULL; PJ_LOG(4,(tsx->obj_name, "Will destroy later because transport is " "in progress")); - return; + return PJ_EBUSY; } /* Clear TLS, so that mutex will not be unlocked */ @@ -971,6 +973,8 @@ static void tsx_destroy( pjsip_transaction *tsx ) PJ_LOG(5,(tsx->obj_name, "Transaction destroyed!")); pjsip_endpt_release_pool(tsx->endpt, tsx->pool); + + return PJ_SUCCESS; } diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index bb169c41..be87a8e2 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -711,6 +711,9 @@ PJ_DEF(pj_status_t) pjsua_destroy(void) /* Shutdown PJLIB */ pj_shutdown(); + /* Clear pjsua_var */ + pj_bzero(&pjsua_var, sizeof(pjsua_var)); + /* Done. */ return PJ_SUCCESS; } |