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 | |
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
-rw-r--r-- | pjlib/include/pj/errno.h | 3 | ||||
-rw-r--r-- | pjlib/src/pj/config.c | 2 | ||||
-rw-r--r-- | pjlib/src/pj/errno.c | 8 | ||||
-rw-r--r-- | pjlib/src/pj/except.c | 10 | ||||
-rw-r--r-- | pjlib/src/pj/os_core_unix.c | 3 | ||||
-rw-r--r-- | pjlib/src/pj/os_core_win32.c | 3 | ||||
-rw-r--r-- | pjlib/src/pj/pool_buf.c | 2 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 9 | ||||
-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 |
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; } |