summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-12-01 11:14:37 +0000
committerBenny Prijono <bennylp@teluu.com>2006-12-01 11:14:37 +0000
commitb9032ff0ae71378939fda1bacde4ee89a685f6d1 (patch)
treea0e337be547e0d1b5760c2a226535f9e6f1f550c /pjsip
parent634423cd1e3f12d6cc70c8e6564d40e986eb0312 (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')
-rw-r--r--pjsip/src/pjsip/sip_endpoint.c4
-rw-r--r--pjsip/src/pjsip/sip_parser.c30
-rw-r--r--pjsip/src/pjsip/sip_transaction.c12
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c3
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;
}