diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2006-10-19 02:16:34 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2006-10-19 02:16:34 +0000 |
commit | 4b8e41c52909dd25460726bea383f141e1302798 (patch) | |
tree | 7e2fbbf610dc7739fe1bc1c1874f73f43eabb7e8 | |
parent | 777d03bd17ffadd7091c059c59bc4d8392affdd5 (diff) |
restore freeing of threadstorage objects without custom cleanup functions
allow custom threadstorage init functions to return failure
use a custom init function for chan_sip's temp_pvt, to improve performance a bit
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@45634 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_sip.c | 18 | ||||
-rw-r--r-- | include/asterisk/threadstorage.h | 12 |
2 files changed, 17 insertions, 13 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c23f54aa3..b9735cbb0 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1142,10 +1142,11 @@ static struct ast_register_list { int recheck; } regl; +static int temp_pvt_init(void *); static void temp_pvt_cleanup(void *); /*! \brief A per-thread temporary pvt structure */ -AST_THREADSTORAGE_CUSTOM(ts_temp_pvt, NULL, temp_pvt_cleanup); +AST_THREADSTORAGE_CUSTOM(ts_temp_pvt, temp_pvt_init, temp_pvt_cleanup); /*! \todo Move the sip_auth list to AST_LIST */ static struct sip_auth *authl = NULL; /*!< Authentication list for realm authentication */ @@ -5532,6 +5533,14 @@ static int __transmit_response(struct sip_pvt *p, const char *msg, const struct return send_response(p, &resp, reliable, seqno); } +static int temp_pvt_init(void *data) +{ + struct sip_pvt *p = data; + + ast_set_flag(&p->flags[0], SIP_NO_HISTORY); + return ast_string_field_init(p, 512); +} + static void temp_pvt_cleanup(void *data) { struct sip_pvt *p = data; @@ -5551,13 +5560,6 @@ static int transmit_response_using_temp(ast_string_field callid, struct sockaddr return -1; } - /* if the structure was just allocated, initialize it */ - if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { - ast_set_flag(&p->flags[0], SIP_NO_HISTORY); - if (ast_string_field_init(p, 512)) - return -1; - } - /* Initialize the bare minimum */ p->method = intended_method; diff --git a/include/asterisk/threadstorage.h b/include/asterisk/threadstorage.h index 6964839cb..d13b616f0 100644 --- a/include/asterisk/threadstorage.h +++ b/include/asterisk/threadstorage.h @@ -42,7 +42,7 @@ struct ast_threadstorage { /*! The function that initializes the key */ void (*key_init)(void); /*! Custom initialization function specific to the object */ - void (*custom_init)(void *); + int (*custom_init)(void *); }; /*! @@ -58,13 +58,13 @@ struct ast_threadstorage { * \endcode */ #define AST_THREADSTORAGE(name) \ - AST_THREADSTORAGE_CUSTOM(name, NULL, NULL) + AST_THREADSTORAGE_CUSTOM(name, NULL, ast_free) /*! * \brief Define a thread storage variable, with custom initialization and cleanup * * \arg name The name of the thread storage object - * \arg init This is a custom that will be called after each thread specific + * \arg init This is a custom function that will be called after each thread specific * object is allocated, with the allocated block of memory passed * as the argument. * \arg cleanup This is a custom function that will be called instead of ast_free @@ -127,8 +127,10 @@ void *ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size), if (!(buf = pthread_getspecific(ts->key))) { if (!(buf = ast_calloc(1, init_size))) return NULL; - if (ts->custom_init) - ts->custom_init(buf); + if (ts->custom_init && ts->custom_init(buf)) { + free(buf); + return NULL; + } pthread_setspecific(ts->key, buf); } |