summaryrefslogtreecommitdiff
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
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
-rw-r--r--pjlib/include/pj/errno.h3
-rw-r--r--pjlib/src/pj/config.c2
-rw-r--r--pjlib/src/pj/errno.c8
-rw-r--r--pjlib/src/pj/except.c10
-rw-r--r--pjlib/src/pj/os_core_unix.c3
-rw-r--r--pjlib/src/pj/os_core_win32.c3
-rw-r--r--pjlib/src/pj/pool_buf.c2
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c9
-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
12 files changed, 72 insertions, 17 deletions
diff --git a/pjlib/include/pj/errno.h b/pjlib/include/pj/errno.h
index 03440c2a..7ca36e98 100644
--- a/pjlib/include/pj/errno.h
+++ b/pjlib/include/pj/errno.h
@@ -346,5 +346,8 @@ PJ_DECL(pj_status_t) pj_register_strerror(pj_status_t start_code,
PJ_END_DECL
+/* Internal */
+void pj_errno_clear_handlers(void);
+
#endif /* __PJ_ERRNO_H__ */
diff --git a/pjlib/src/pj/config.c b/pjlib/src/pj/config.c
index cce57304..e4c5db61 100644
--- a/pjlib/src/pj/config.c
+++ b/pjlib/src/pj/config.c
@@ -21,7 +21,7 @@
#include <pj/ioqueue.h>
static const char *id = "config.c";
-const char *PJ_VERSION = "0.5.9";
+const char *PJ_VERSION = "0.5.9.1";
PJ_DEF(void) pj_dump_config(void)
{
diff --git a/pjlib/src/pj/errno.c b/pjlib/src/pj/errno.c
index 1d7767f4..cbbe0684 100644
--- a/pjlib/src/pj/errno.c
+++ b/pjlib/src/pj/errno.c
@@ -133,6 +133,14 @@ PJ_DECL(pj_status_t) pj_register_strerror(pj_status_t start,
return PJ_SUCCESS;
}
+/* Internal PJLIB function called by pj_shutdown() to clear error handlers */
+void pj_errno_clear_handlers(void)
+{
+ err_msg_hnd_cnt = 0;
+ pj_bzero(err_msg_hnd, sizeof(err_msg_hnd));
+}
+
+
/*
* pj_strerror()
*/
diff --git a/pjlib/src/pj/except.c b/pjlib/src/pj/except.c
index bb21e05b..4bbd410b 100644
--- a/pjlib/src/pj/except.c
+++ b/pjlib/src/pj/except.c
@@ -57,6 +57,16 @@ static void exception_cleanup(void)
pj_thread_local_free(thread_local_id);
thread_local_id = -1;
}
+
+#if defined(PJ_HAS_EXCEPTION_NAMES) && PJ_HAS_EXCEPTION_NAMES != 0
+ {
+ unsigned i;
+ for (i=0; i<PJ_MAX_EXCEPTION_ID; ++i)
+ exception_id_names[i] = NULL;
+ }
+#else
+ last_exception_id = 1;
+#endif
}
PJ_DEF(void) pj_push_exception_handler_(struct pj_exception_state_t *rec)
diff --git a/pjlib/src/pj/os_core_unix.c b/pjlib/src/pj/os_core_unix.c
index 2d69d6d0..9fd8d372 100644
--- a/pjlib/src/pj/os_core_unix.c
+++ b/pjlib/src/pj/os_core_unix.c
@@ -207,6 +207,9 @@ PJ_DEF(void) pj_shutdown()
thread_tls_id = -1;
}
#endif
+
+ /* Clear static variables */
+ pj_errno_clear_handlers();
}
diff --git a/pjlib/src/pj/os_core_win32.c b/pjlib/src/pj/os_core_win32.c
index 23e2cde1..788d71f5 100644
--- a/pjlib/src/pj/os_core_win32.c
+++ b/pjlib/src/pj/os_core_win32.c
@@ -218,6 +218,9 @@ PJ_DEF(void) pj_shutdown()
thread_tls_id = -1;
}
+ /* Clear static variables */
+ pj_errno_clear_handlers();
+
/* Shutdown Winsock */
//WSACleanup();
}
diff --git a/pjlib/src/pj/pool_buf.c b/pjlib/src/pj/pool_buf.c
index 44115f3a..c373fa75 100644
--- a/pjlib/src/pj/pool_buf.c
+++ b/pjlib/src/pj/pool_buf.c
@@ -38,6 +38,8 @@ static void pool_buf_cleanup(void)
pj_thread_local_free(tls);
tls = -1;
}
+ if (is_initialized)
+ is_initialized = 0;
}
static pj_status_t pool_buf_initialize()
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c
index c04e571e..81a6e5cb 100644
--- a/pjsip-apps/src/pjsua/pjsua_app.c
+++ b/pjsip-apps/src/pjsua/pjsua_app.c
@@ -361,6 +361,7 @@ static pj_status_t parse_args(int argc, char *argv[],
unsigned i;
/* Run pj_getopt once to see if user specifies config file to read. */
+ pj_optind = 0;
while ((c=pj_getopt_long(argc, argv, "", long_options,
&option_index)) != -1)
{
@@ -2845,6 +2846,8 @@ pj_status_t app_main(void)
pj_status_t app_destroy(void)
{
+ pj_status_t status;
+
#ifdef STEREO_DEMO
if (app_config.snd) {
pjmedia_snd_port_destroy(app_config.snd);
@@ -2857,7 +2860,11 @@ pj_status_t app_destroy(void)
app_config.pool = NULL;
}
- return pjsua_destroy();
+ status = pjsua_destroy();
+
+ pj_bzero(&app_config, sizeof(app_config));
+
+ return status;
}
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;
}