]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
update thread creation code a bit
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 4 Oct 2006 19:47:22 +0000 (19:47 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 4 Oct 2006 19:47:22 +0000 (19:47 +0000)
reduce standard thread stack size slightly to allow the pthreads library to allocate the stack+data and not overflow a power-of-2 allocation in the kernel and waste memory/address space
add a new stack size for 'background' threads (those that don't handle PBX calls) when LOW_MEMORY is defined

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@44378 65c4cc65-6c06-0410-ace0-fbb531ad65f3

27 files changed:
apps/app_meetme.c
apps/app_mixmonitor.c
apps/app_queue.c
channels/chan_alsa.c
channels/chan_h323.c
channels/chan_iax2.c
channels/chan_mgcp.c
channels/chan_oss.c
channels/chan_phone.c
channels/chan_sip.c
channels/chan_skinny.c
channels/chan_zap.c
include/asterisk/utils.h
main/asterisk.c
main/autoservice.c
main/cdr.c
main/devicestate.c
main/dnsmgr.c
main/http.c
main/manager.c
main/utils.c
pbx/pbx_dundi.c
pbx/pbx_spool.c
res/res_jabber.c
res/res_musiconhold.c
res/res_smdi.c
res/res_snmp.c

index 6fe797bbedebc2e150c054c1d4bce1d339f158dd..6ca99869cc0bbbe2ebcf83788547e412df3e2aae 100644 (file)
@@ -1075,7 +1075,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
        if ((conf->recording == MEETME_RECORD_OFF) && ((confflags & CONFFLAG_RECORDCONF) || (conf->lchan))) {
                pthread_attr_init(&conf->attr);
                pthread_attr_setdetachstate(&conf->attr, PTHREAD_CREATE_DETACHED);
-               ast_pthread_create(&conf->recordthread, &conf->attr, recordthread, conf);
+               ast_pthread_create_background(&conf->recordthread, &conf->attr, recordthread, conf);
        }
 
        time(&user->jointime);
index 1530920b102e9ae3521302fdd15c6fa4a6b8c7d9..1171fc89e17adaee41abac3acc75bd2181aaf229 100644 (file)
@@ -292,7 +292,7 @@ static void launch_monitor_thread(struct ast_channel *chan, const char *filename
 
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-       ast_pthread_create(&thread, &attr, mixmonitor_thread, mixmonitor);
+       ast_pthread_create_background(&thread, &attr, mixmonitor_thread, mixmonitor);
        pthread_attr_destroy(&attr);
 
 }
index 06c8ccaf8c86455dda54023268f94d5042aa28b8..6ad11be861510ef68a40a840ffde4bd798a18dc5 100644 (file)
@@ -605,7 +605,7 @@ static int statechange_queue(const char *dev, int state, void *ign)
        strcpy(sc->dev, dev);
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-       if (ast_pthread_create(&t, &attr, changethread, sc)) {
+       if (ast_pthread_create_background(&t, &attr, changethread, sc)) {
                ast_log(LOG_WARNING, "Failed to create update thread!\n");
                free(sc);
        }
index c3a4315e74290de52a37dda76c4318ba31cd9aec..58b5e0ea8cb51a5cbda55c3c420b0d1b38b12ef7 100644 (file)
@@ -1349,7 +1349,7 @@ static int load_module(void)
        }
        ast_cli_register_multiple(cli_alsa, sizeof(cli_alsa) / sizeof(struct ast_cli_entry));
 
-       ast_pthread_create(&sthread, NULL, sound_thread, NULL);
+       ast_pthread_create_background(&sthread, NULL, sound_thread, NULL);
 #ifdef ALSA_MONITOR
        if (alsa_monitor_start())
                ast_log(LOG_ERROR, "Problem starting Monitoring\n");
index 3ef75063b61d53910ce1714c03545342177ea7a1..8e2a04e19a90a661167e16eed4c10e32bb22657d 100644 (file)
@@ -2512,7 +2512,7 @@ static int restart_monitor(void)
                pthread_attr_init(&attr);
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                /* Start a new monitor */
-               if (ast_pthread_create(&monitor_thread, &attr, do_monitor, NULL) < 0) {
+               if (ast_pthread_create_background(&monitor_thread, &attr, do_monitor, NULL) < 0) {
                        monitor_thread = AST_PTHREADT_NULL;
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
index 27e31c86f9e482550c681d12f9c3889b96b9b023..1a299675c6257ab7145162b0bbede1c1abb0c111 100644 (file)
@@ -6143,7 +6143,7 @@ static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2)
        if ((d = ast_calloc(1, sizeof(*d)))) {
                d->chan1 = chan1m;
                d->chan2 = chan2m;
-               if (!ast_pthread_create(&th, NULL, iax_park_thread, d))
+               if (!ast_pthread_create_background(&th, NULL, iax_park_thread, d))
                        return 0;
                free(d);
        }
@@ -8116,8 +8116,8 @@ static int start_network_thread(void)
                        AST_LIST_UNLOCK(&idle_list);
                }
        }
-       ast_pthread_create(&schedthreadid, NULL, sched_thread, NULL);
-       ast_pthread_create(&netthreadid, NULL, network_thread, NULL);
+       ast_pthread_create_background(&schedthreadid, NULL, sched_thread, NULL);
+       ast_pthread_create_background(&netthreadid, NULL, network_thread, NULL);
        if (option_verbose > 1)
                ast_verbose(VERBOSE_PREFIX_2 "%d helper threaads started\n", threadcount);
        return 0;
index b2d0e109052bc2f31370552df619357b3cecdf48..d53433ab6974c4456cba7c3daf155e54663cf8e7 100644 (file)
@@ -3509,7 +3509,7 @@ static int restart_monitor(void)
                pthread_kill(monitor_thread, SIGURG);
        } else {
                /* Start a new monitor */
-               if (ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
+               if (ast_pthread_create_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                        return -1;
index e29b9086a1d8b682d268e3fbcb374f2e40b06511..02ba5ad7e978e5136381dd59d2e67b9ac7f25975 100644 (file)
@@ -1820,7 +1820,7 @@ static struct chan_oss_pvt *store_config(struct ast_config *cfg, char *ctg)
                ast_log(LOG_ERROR, "Unable to create pipe\n");
                goto error;
        }
-       ast_pthread_create(&o->sthread, NULL, sound_thread, o);
+       ast_pthread_create_background(&o->sthread, NULL, sound_thread, o);
        /* link into list of devices */
        if (o != &oss_default) {
                o->next = oss_default.next;
index 6e658ad3a24c295b3b97fd4a7d900d5f90fe81b1..f6380ba63a05f2bb95f9249eb8949e9e3504ab5c 100644 (file)
@@ -1148,7 +1148,7 @@ static int restart_monitor()
        }
        monitor = 1;
        /* Start a new monitor */
-       if (ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
+       if (ast_pthread_create_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
                ast_mutex_unlock(&monlock);
                ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                return -1;
index 95b592a3892d7ff0e3ceb77be221a21da7565b88..3c696f56fdc5eb8b90d5c2570b3050f412f511d0 100644 (file)
@@ -12272,7 +12272,7 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
                d->chan1 = transferee;  /* Transferee */
                d->chan2 = transferer;  /* Transferer */
                d->seqno = seqno;
-               if (ast_pthread_create(&th, NULL, sip_park_thread, d) < 0) {
+               if (ast_pthread_create_background(&th, NULL, sip_park_thread, d) < 0) {
                        /* Could not start thread */
                        free(d);        /* We don't need it anymore. If thread is created, d will be free'd
                                           by sip_park_thread() */
@@ -14611,7 +14611,7 @@ static int restart_monitor(void)
                pthread_kill(monitor_thread, SIGURG);
        } else {
                /* Start a new monitor */
-               if (ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
+               if (ast_pthread_create_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                        return -1;
index 453380881a31383c4e74a01b43ef5d529a1a341e..ec5a86be5370d2125c814446c3d52fb4a0af6438 100644 (file)
@@ -4351,7 +4351,7 @@ static int restart_monitor(void)
                pthread_kill(monitor_thread, SIGURG);
        } else {
                /* Start a new monitor */
-               if (ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
+               if (ast_pthread_create_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                        return -1;
@@ -4535,7 +4535,7 @@ static int reload_config(void)
                        if (option_verbose > 1)
                                ast_verbose(VERBOSE_PREFIX_2 "Skinny listening on %s:%d\n",
                                        ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
-                       ast_pthread_create(&accept_t,NULL, accept_thread, NULL);
+                       ast_pthread_create_background(&accept_t,NULL, accept_thread, NULL);
                }
        }
        ast_mutex_unlock(&netlock);
index f39e25b4ee99501151979cab3b9eb4f9a6d69628..869a33313accd52b160eb8177d4cd44f40072c39 100644 (file)
@@ -6914,7 +6914,7 @@ static int restart_monitor(void)
 #endif
        } else {
                /* Start a new monitor */
-               if (ast_pthread_create(&monitor_thread, &attr, do_monitor, NULL) < 0) {
+               if (ast_pthread_create_background(&monitor_thread, &attr, do_monitor, NULL) < 0) {
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                        return -1;
@@ -8324,7 +8324,7 @@ static void *pri_dchannel(void *vpri)
                                        idle = zt_request("Zap", AST_FORMAT_ULAW, idlen, &cause);
                                        if (idle) {
                                                pri->pvts[nextidle]->isidlecall = 1;
-                                               if (ast_pthread_create(&p, NULL, do_idle_thread, idle)) {
+                                               if (ast_pthread_create_background(&p, NULL, do_idle_thread, idle)) {
                                                        ast_log(LOG_WARNING, "Unable to start new thread for idle channel '%s'\n", idle->name);
                                                        zt_hangup(idle);
                                                }
@@ -9348,7 +9348,7 @@ static int start_pri(struct zt_pri *pri)
        /* Assume primary is the one we use */
        pri->pri = pri->dchans[0];
        pri->resetpos = -1;
-       if (ast_pthread_create(&pri->master, NULL, pri_dchannel, pri)) {
+       if (ast_pthread_create_background(&pri->master, NULL, pri_dchannel, pri)) {
                for (i = 0; i < NUM_DCHANS; i++) {
                        if (!pri->dchannels[i])
                                break;
index 2fe5a87d3635b65343d310145cbd4aa59e1967ac..9ae2e4595a9337c2fbb08be2368a68ce462ac69c 100644 (file)
@@ -246,15 +246,30 @@ static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct s
                || (sin1->sin_port != sin2->sin_port));
 }
 
-#define AST_STACKSIZE 256 * 1024
+#define AST_STACKSIZE 240 * 1024
+
+#if defined(LOW_MEMORY)
+#define AST_BACKGROUND_STACKSIZE 48 * 1024
+#else
+#define AST_BACKGROUND_STACKSIZE 240 * 1024
+#endif
 
 void ast_register_thread(char *name);
 void ast_unregister_thread(void *id);
 
-#define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0, \
-        __FILE__, __FUNCTION__, __LINE__, #c)
-int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize,
-       const char *file, const char *caller, int line, const char *start_fn);
+int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *),
+                            void *data, size_t stacksize, const char *file, const char *caller,
+                            int line, const char *start_fn);
+
+#define ast_pthread_create(a, b, c, d) ast_pthread_create_stack(a, b, c, d,                    \
+                                                               0,                              \
+                                                               __FILE__, __FUNCTION__,         \
+                                                               __LINE__, #c)
+
+#define ast_pthread_create_background(a, b, c, d) ast_pthread_create_stack(a, b, c, d,                 \
+                                                                          AST_BACKGROUND_STACKSIZE,    \
+                                                                          __FILE__, __FUNCTION__,      \
+                                                                          __LINE__, #c)
 
 /*!
        \brief Process a string to find and replace characters
index 6e3222af5de133c506a4e9dfda8fe1680833b44b..75426fe4ec7a00e8e2e4e86974cab3d25b71d12a 100644 (file)
@@ -301,7 +301,7 @@ void ast_register_thread(char *name)
        if (!new)
                return;
        new->id = pthread_self();
-       new->name = name; /* this was a copy already */
+       new->name = name; /* steal the allocated memory for the thread name */
        AST_LIST_LOCK(&thread_list);
        AST_LIST_INSERT_HEAD(&thread_list, new, list);
        AST_LIST_UNLOCK(&thread_list);
@@ -313,7 +313,7 @@ void ast_unregister_thread(void *id)
 
        AST_LIST_LOCK(&thread_list);
        AST_LIST_TRAVERSE_SAFE_BEGIN(&thread_list, x, list) {
-               if ((void *)x->id == id) {
+               if ((void *) x->id == id) {
                        AST_LIST_REMOVE_CURRENT(&thread_list, list);
                        break;
                }
@@ -906,7 +906,7 @@ static void *listener(void *unused)
                                        fcntl(consoles[x].p[1], F_SETFL, flags | O_NONBLOCK);
                                        consoles[x].fd = s;
                                        consoles[x].mute = ast_opt_mute;
-                                       if (ast_pthread_create(&consoles[x].t, &attr, netconsole, &consoles[x])) {
+                                       if (ast_pthread_create_background(&consoles[x].t, &attr, netconsole, &consoles[x])) {
                                                ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno));
                                                close(consoles[x].p[0]);
                                                close(consoles[x].p[1]);
@@ -964,7 +964,7 @@ static int ast_makesocket(void)
                return -1;
        }
        ast_register_verbose(network_verboser);
-       ast_pthread_create(&lthread, NULL, listener, NULL);
+       ast_pthread_create_background(&lthread, NULL, listener, NULL);
 
        if (!ast_strlen_zero(ast_config_AST_CTL_OWNER)) {
                struct passwd *pw;
index 51a1e1ca676b60d6b517d92f55f4cc447b8a412d..1d9670794dab29e2d57729972e0153b0ed4f628e 100644 (file)
@@ -111,7 +111,7 @@ int ast_autoservice_start(struct ast_channel *chan)
                AST_LIST_INSERT_HEAD(&aslist, as, list);
                res = 0;
                if (asthread == AST_PTHREADT_NULL) { /* need start the thread */
-                       if (ast_pthread_create(&asthread, NULL, autoservice_run, NULL)) {
+                       if (ast_pthread_create_background(&asthread, NULL, autoservice_run, NULL)) {
                                ast_log(LOG_WARNING, "Unable to create autoservice thread :(\n");
                                /* There will only be a single member in the list at this point,
                                   the one we just added. */
index 4d3ca86bffa88ba17fd5296bd1319ef466b52b36..fb243ff4931f5ce3352c8f28acac8ea1e0dcc9fa 100644 (file)
@@ -853,7 +853,7 @@ void ast_cdr_submit_batch(int shutdown)
        } else {
                pthread_attr_init(&attr);
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-               if (ast_pthread_create(&batch_post_thread, &attr, do_batch_backend_process, oldbatchitems)) {
+               if (ast_pthread_create_background(&batch_post_thread, &attr, do_batch_backend_process, oldbatchitems)) {
                        ast_log(LOG_WARNING, "CDR processing thread could not detach, now trying in this thread\n");
                        do_batch_backend_process(oldbatchitems);
                } else {
@@ -1101,7 +1101,7 @@ static int do_reload(void)
           if it does not exist */
        if (enabled && batchmode && (!was_enabled || !was_batchmode) && (cdr_thread == AST_PTHREADT_NULL)) {
                ast_cond_init(&cdr_pending_cond, NULL);
-               if (ast_pthread_create(&cdr_thread, NULL, do_cdr, NULL) < 0) {
+               if (ast_pthread_create_background(&cdr_thread, NULL, do_cdr, NULL) < 0) {
                        ast_log(LOG_ERROR, "Unable to start CDR thread.\n");
                        ast_sched_del(sched, cdr_sched);
                } else {
index c434ce9a0a1a8bbc9b112c6ff6a04c8a8f7a0e25..3f38930d17061327aa8c005887919bf0ab9da5bd 100644 (file)
@@ -374,7 +374,7 @@ static void *do_devstate_changes(void *data)
 int ast_device_state_engine_init(void)
 {
        ast_cond_init(&change_pending, NULL);
-       if (ast_pthread_create(&change_thread, NULL, do_devstate_changes, NULL) < 0) {
+       if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) {
                ast_log(LOG_ERROR, "Unable to start device state change thread.\n");
                return -1;
        }
index 0cc0d63f8ef6c6afcdf5546037abb2858909968c..3f370e054c125bab940f607a5c4edda9b5d76175 100644 (file)
@@ -390,7 +390,7 @@ static int do_reload(int loading)
        /* if this reload enabled the manager, create the background thread
           if it does not exist */
        if (enabled && !was_enabled && (refresh_thread == AST_PTHREADT_NULL)) {
-               if (ast_pthread_create(&refresh_thread, NULL, do_refresh, NULL) < 0) {
+               if (ast_pthread_create_background(&refresh_thread, NULL, do_refresh, NULL) < 0) {
                        ast_log(LOG_ERROR, "Unable to start refresh thread.\n");
                }
                else {
index 9666539c711d1aa738d24dabd80a008f9a414830..e76163105553ea548560f0a4d14f9df41a544cd5 100644 (file)
@@ -510,7 +510,7 @@ static void *http_root(void *data)
                                pthread_attr_init(&attr);
                                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                                
-                               if (ast_pthread_create(&launched, &attr, ast_httpd_helper_thread, ser)) {
+                               if (ast_pthread_create_background(&launched, &attr, ast_httpd_helper_thread, ser)) {
                                        ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno));
                                        fclose(ser->f);
                                        free(ser);
@@ -588,7 +588,7 @@ static void http_server_start(struct sockaddr_in *sin)
        }
        flags = fcntl(httpfd, F_GETFL);
        fcntl(httpfd, F_SETFL, flags | O_NONBLOCK);
-       if (ast_pthread_create(&master, NULL, http_root, NULL)) {
+       if (ast_pthread_create_background(&master, NULL, http_root, NULL)) {
                ast_log(LOG_NOTICE, "Unable to launch http server on %s:%d: %s\n",
                                ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port),
                                strerror(errno));
index 543784c13bcfd5cf733c7860a1b848560e5677ba..ca2bd68fb2c8ba466f069af8b9d198fbb641d9e5 100644 (file)
@@ -2194,7 +2194,7 @@ static void *accept_thread(void *ignore)
                        s->eventq = s->eventq->next;
                AST_LIST_UNLOCK(&sessions);
                ast_atomic_fetchadd_int(&s->eventq->usecount, 1);
-               if (ast_pthread_create(&s->t, &attr, session_do, s))
+               if (ast_pthread_create_background(&s->t, &attr, session_do, s))
                        destroy_session(s);
        }
        pthread_attr_destroy(&attr);
@@ -2805,7 +2805,7 @@ int init_manager(void)
                fcntl(asock, F_SETFL, flags | O_NONBLOCK);
                if (option_verbose)
                        ast_verbose("Asterisk Management interface listening on port %d\n", portno);
-               ast_pthread_create(&t, NULL, accept_thread, NULL);
+               ast_pthread_create_background(&t, NULL, accept_thread, NULL);
        }
        return 0;
 }
index 22e5027a8fbbf11196eff5370d99f8ba26b2cdfc..3f44fe777fde7fb6ec5ff296080c2cf00722c9be 100644 (file)
@@ -525,31 +525,38 @@ struct thr_arg {
  * are odd macros which start and end a block, so they _must_ be
  * used in pairs (the latter with a '1' argument to call the
  * handler on exit.
- * On BSD we don't need this, but we keep it for compatibility with the MAC.
+ * On BSD we don't need this, but we keep it for compatibility.
  */
 static void *dummy_start(void *data)
 {
        void *ret;
-       struct thr_arg a = *((struct thr_arg *)data);   /* make a local copy */
+       struct thr_arg a = *((struct thr_arg *) data);  /* make a local copy */
 
+       /* note that even though data->name is a pointer to allocated memory,
+          we are not freeing it here because ast_register_thread is going to
+          keep a copy of the pointer and then ast_unregister_thread will
+          free the memory
+       */
        free(data);
        ast_register_thread(a.name);
-       pthread_cleanup_push(ast_unregister_thread, (void *)pthread_self());    /* on unregister */
+       pthread_cleanup_push(ast_unregister_thread, (void *) pthread_self());
        ret = a.start_routine(a.data);
        pthread_cleanup_pop(1);
+
        return ret;
 }
 
-int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize,
-       const char *file, const char *caller, int line, const char *start_fn)
+int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *),
+                            void *data, size_t stacksize, const char *file, const char *caller,
+                            int line, const char *start_fn)
 {
        struct thr_arg *a;
 
-       pthread_attr_t lattr;
        if (!attr) {
-               pthread_attr_init(&lattr);
-               attr = &lattr;
+               attr = alloca(sizeof(*attr));
+               pthread_attr_init(attr);
        }
+
 #ifdef __linux__
        /* On Linux, pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
           which is kind of useless. Change this here to
@@ -558,27 +565,25 @@ int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*st
           This does mean that callers cannot set a different priority using
           PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
           the priority afterwards with pthread_setschedparam(). */
-       errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED);
-       if (errno)
-               ast_log(LOG_WARNING, "pthread_attr_setinheritsched returned non-zero: %s\n", strerror(errno));
+       if ((errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED)))
+               ast_log(LOG_WARNING, "pthread_attr_setinheritsched: %s\n", strerror(errno));
 #endif
 
        if (!stacksize)
                stacksize = AST_STACKSIZE;
-       errno = pthread_attr_setstacksize(attr, stacksize);
-       if (errno)
-               ast_log(LOG_WARNING, "pthread_attr_setstacksize returned non-zero: %s\n", strerror(errno));
-       a = ast_malloc(sizeof(*a));
-       if (!a)
-               ast_log(LOG_WARNING, "no memory, thread %s will not be listed\n", start_fn);
-       else {  /* remap parameters */
+
+       if ((errno = pthread_attr_setstacksize(attr, stacksize ? stacksize : AST_STACKSIZE)))
+               ast_log(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(errno));
+
+       if ((a = ast_malloc(sizeof(*a)))) {
                a->start_routine = start_routine;
                a->data = data;
                start_routine = dummy_start;
                asprintf(&a->name, "%-20s started at [%5d] %s %s()",
-                       start_fn, line, file, caller);
+                        start_fn, line, file, caller);
                data = a;
        }
+
        return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
 }
 
index 5d62c641dbde01257998fb2f8586a5a530f84c4d..99295826ec77c54267468944b83d6375ddfa7273 100644 (file)
@@ -2123,8 +2123,8 @@ static void *process_precache(void *ign)
 
 static int start_network_thread(void)
 {
-       ast_pthread_create(&netthreadid, NULL, network_thread, NULL);
-       ast_pthread_create(&precachethreadid, NULL, process_precache, NULL);
+       ast_pthread_create_background(&netthreadid, NULL, network_thread, NULL);
+       ast_pthread_create_background(&precachethreadid, NULL, process_precache, NULL);
        return 0;
 }
 
index c4714a09d559e80bd23810f9985e5a8356904609..ec008280bd6070b8de84eaa1b730c08d46508971 100644 (file)
@@ -495,7 +495,7 @@ static int load_module(void)
        snprintf(qdonedir, sizeof(qdir), "%s/%s", ast_config_AST_SPOOL_DIR, "outgoing_done");
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-       if ((ret = ast_pthread_create(&thread,&attr,scan_thread, NULL)) != 0) {
+       if ((ret = ast_pthread_create_background(&thread,&attr,scan_thread, NULL)) != 0) {
                ast_log(LOG_WARNING, "Unable to create thread :( (returned error: %d)\n", ret);
                return -1;
        }
index d9b76c6309b9bf23269a8111c5adcb8db5c0b1c9..07a61b5ef1970c25958cd4c8da81ce375f58b97a 100644 (file)
@@ -2366,7 +2366,7 @@ static int aji_reload()
                ASTOBJ_RDLOCK(iterator);
                if(iterator->state == AJI_DISCONNECTED) {
                        if (!iterator->thread)
-                               ast_pthread_create(&iterator->thread, NULL, aji_recv_loop, iterator);
+                               ast_pthread_create_background(&iterator->thread, NULL, aji_recv_loop, iterator);
                } else if (iterator->state == AJI_CONNECTING)
                        aji_get_roster(iterator);
                ASTOBJ_UNLOCK(iterator);
index 19d0fd0690efc76db0d7d7ffef65e3a107e69e7e..a4debac8f30e67cd111d22fb86da8f46e9cc8639 100644 (file)
@@ -864,7 +864,7 @@ static int moh_register(struct mohclass *moh, int reload)
 #else
                moh->pseudofd = -1;
 #endif
-               if (ast_pthread_create(&moh->thread, NULL, monmp3thread, moh)) {
+               if (ast_pthread_create_background(&moh->thread, NULL, monmp3thread, moh)) {
                        ast_log(LOG_WARNING, "Unable to create moh...\n");
                        if (moh->pseudofd > -1)
                                close(moh->pseudofd);
index c0c7f8927755638a47b74a0299fbe59f1987c3d6..a4d8494f63497e1eade71d916e3b6795bde86170 100644 (file)
@@ -678,7 +678,7 @@ static int smdi_load(int reload)
                         /* start the listner thread */
                        if (option_verbose > 2)
                                ast_verbose(VERBOSE_PREFIX_3 "Starting SMDI monitor thread for %s\n", iface->name);
-                       if (ast_pthread_create(&iface->thread, NULL, smdi_read, iface)) {
+                       if (ast_pthread_create_background(&iface->thread, NULL, smdi_read, iface)) {
                                ast_log(LOG_ERROR, "Error starting SMDI monitor thread for %s\n", iface->name);
                                ASTOBJ_UNREF(iface, ast_smdi_interface_destroy);
                                continue;
index fbef97f0ab1f87be6bffd04ee88bcff1ad106bc1..2ccadc4073f0937c30ad210966fb85c07e73ae4e 100644 (file)
@@ -96,7 +96,7 @@ static int load_module(void)
 
        res_snmp_dont_stop = 1;
        if (res_snmp_enabled)
-               return ast_pthread_create(&thread, NULL, agent_thread, NULL);
+               return ast_pthread_create_background(&thread, NULL, agent_thread, NULL);
        else
                return 0;
 }
@@ -121,7 +121,7 @@ static int reload(void)
 
        res_snmp_dont_stop = 1;
        if (res_snmp_enabled)
-               return ast_pthread_create(&thread, NULL, agent_thread, NULL);
+               return ast_pthread_create_background(&thread, NULL, agent_thread, NULL);
        else
                return 0;
 }