restore freeing of threadstorage objects without custom cleanup functions
authorKevin P. Fleming <kpfleming@digium.com>
Thu, 19 Oct 2006 02:16:34 +0000 (02:16 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Thu, 19 Oct 2006 02:16:34 +0000 (02:16 +0000)
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

channels/chan_sip.c
include/asterisk/threadstorage.h

index c23f54a..b9735cb 100644 (file)
@@ -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;
 
index 6964839..d13b616 100644 (file)
@@ -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);
        }