summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin P. Fleming <kpfleming@digium.com>2006-10-19 02:16:34 +0000
committerKevin P. Fleming <kpfleming@digium.com>2006-10-19 02:16:34 +0000
commit4b8e41c52909dd25460726bea383f141e1302798 (patch)
tree7e2fbbf610dc7739fe1bc1c1874f73f43eabb7e8
parent777d03bd17ffadd7091c059c59bc4d8392affdd5 (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.c18
-rw-r--r--include/asterisk/threadstorage.h12
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);
}