summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2007-05-24 18:30:19 +0000
committerRussell Bryant <russell@russellbryant.com>2007-05-24 18:30:19 +0000
commit4b3a3fb14c298512ef69e17a710e210de14914fb (patch)
tree86895556d8f221a39105f4398a54d612fbbd3da8 /channels
parentbcd2bd8294408ca2f432747ef2e3073edecec4c1 (diff)
Add a new API call for creating detached threads. Then, go replace all of the
places in the code where the same block of code for creating detached threads was replicated. (patch from bbryant) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@65968 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_h323.c7
-rw-r--r--channels/chan_iax2.c27
-rw-r--r--channels/chan_mgcp.c6
-rw-r--r--channels/chan_sip.c8
-rw-r--r--channels/chan_skinny.c7
-rw-r--r--channels/chan_zap.c29
6 files changed, 13 insertions, 71 deletions
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index 65154b618..e8d091528 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -2601,7 +2601,6 @@ restartsearch:
static int restart_monitor(void)
{
- pthread_attr_t attr;
/* If we're supposed to be stopped -- stay stopped */
if (ast_mutex_lock(&monlock)) {
ast_log(LOG_WARNING, "Unable to lock monitor\n");
@@ -2620,17 +2619,13 @@ static int restart_monitor(void)
/* Wake up the thread */
pthread_kill(monitor_thread, SIGURG);
} else {
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* Start a new monitor */
- if (ast_pthread_create_background(&monitor_thread, &attr, do_monitor, NULL) < 0) {
+ if (ast_pthread_create_detached_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
monitor_thread = AST_PTHREADT_NULL;
ast_mutex_unlock(&monlock);
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
- pthread_attr_destroy(&attr);
return -1;
}
- pthread_attr_destroy(&attr);
}
ast_mutex_unlock(&monlock);
return 0;
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index b2c2a4cc0..a62d9fc90 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -926,7 +926,6 @@ static void insert_idle_thread(struct iax2_thread *thread)
static struct iax2_thread *find_idle_thread(void)
{
- pthread_attr_t attr;
struct iax2_thread *thread = NULL;
/* Pop the head of the idle list off */
@@ -960,9 +959,7 @@ static struct iax2_thread *find_idle_thread(void)
ast_cond_init(&thread->cond, NULL);
/* Create thread and send it on it's way */
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (ast_pthread_create_background(&thread->threadid, &attr, iax2_process_thread, thread)) {
+ if (ast_pthread_create_detached_background(&thread->threadid, NULL, iax2_process_thread, thread)) {
ast_cond_destroy(&thread->cond);
ast_mutex_destroy(&thread->lock);
free(thread);
@@ -6267,24 +6264,18 @@ static void spawn_dp_lookup(int callno, const char *context, const char *calledn
{
pthread_t newthread;
struct dpreq_data *dpr;
- pthread_attr_t attr;
if (!(dpr = ast_calloc(1, sizeof(*dpr))))
return;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
dpr->callno = callno;
ast_copy_string(dpr->context, context, sizeof(dpr->context));
ast_copy_string(dpr->callednum, callednum, sizeof(dpr->callednum));
if (callerid)
dpr->callerid = ast_strdup(callerid);
- if (ast_pthread_create(&newthread, &attr, dp_lookup_thread, dpr)) {
+ if (ast_pthread_create_detached(&newthread, NULL, dp_lookup_thread, dpr)) {
ast_log(LOG_WARNING, "Unable to start lookup thread!\n");
}
-
- pthread_attr_destroy(&attr);
}
struct iax_dual {
@@ -6352,18 +6343,11 @@ static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2)
return -1;
}
if ((d = ast_calloc(1, sizeof(*d)))) {
- pthread_attr_t attr;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
d->chan1 = chan1m;
d->chan2 = chan2m;
- if (!ast_pthread_create_background(&th, &attr, iax_park_thread, d)) {
- pthread_attr_destroy(&attr);
+ if (!ast_pthread_create_detached_background(&th, NULL, iax_park_thread, d)) {
return 0;
}
- pthread_attr_destroy(&attr);
free(d);
}
return -1;
@@ -8467,7 +8451,6 @@ static void *network_thread(void *ignore)
static int start_network_thread(void)
{
- pthread_attr_t attr;
int threadcount = 0;
int x;
for (x = 0; x < iaxthreadcount; x++) {
@@ -8477,9 +8460,7 @@ static int start_network_thread(void)
thread->threadnum = ++threadcount;
ast_mutex_init(&thread->lock);
ast_cond_init(&thread->cond, NULL);
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (ast_pthread_create(&thread->threadid, &attr, iax2_process_thread, thread)) {
+ if (ast_pthread_create_detached(&thread->threadid, NULL, iax2_process_thread, thread)) {
ast_log(LOG_WARNING, "Failed to create new thread!\n");
free(thread);
thread = NULL;
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index f9caf584d..3895330c5 100644
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -2956,9 +2956,6 @@ static void handle_hd_hf(struct mgcp_subchannel *sub, char *ev)
struct mgcp_endpoint *p = sub->parent;
struct ast_channel *c;
pthread_t t;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* Off hook / answer */
if (sub->outgoing) {
@@ -3006,7 +3003,7 @@ static void handle_hd_hf(struct mgcp_subchannel *sub, char *ev)
}
c = mgcp_new(sub, AST_STATE_DOWN);
if (c) {
- if (ast_pthread_create(&t, &attr, mgcp_ss, c)) {
+ if (ast_pthread_create_detached(&t, NULL, mgcp_ss, c)) {
ast_log(LOG_WARNING, "Unable to create switch thread: %s\n", strerror(errno));
ast_hangup(c);
}
@@ -3034,7 +3031,6 @@ static void handle_hd_hf(struct mgcp_subchannel *sub, char *ev)
/*ast_queue_control(sub->owner, AST_CONTROL_ANSWER);*/
}
}
- pthread_attr_destroy(&attr);
}
static int handle_request(struct mgcp_subchannel *sub, struct mgcp_request *req, struct sockaddr_in *sin)
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index ac72c112d..4c63ffe15 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -13640,24 +13640,18 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
return -1;
}
if ((d = ast_calloc(1, sizeof(*d)))) {
- pthread_attr_t attr;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* Save original request for followup */
copy_request(&d->req, req);
d->chan1 = transferee; /* Transferee */
d->chan2 = transferer; /* Transferer */
d->seqno = seqno;
- if (ast_pthread_create_background(&th, &attr, sip_park_thread, d) < 0) {
+ if (ast_pthread_create_detached_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() */
- pthread_attr_destroy(&attr);
return 0;
}
- pthread_attr_destroy(&attr);
}
return -1;
}
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index e5051204a..72ca80182 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -4514,12 +4514,8 @@ static void *accept_thread(void *ignore)
struct skinnysession *s;
struct protoent *p;
int arg = 1;
- pthread_attr_t attr;
pthread_t tcp_thread;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
for (;;) {
sinlen = sizeof(sin);
as = accept(skinnysock, (struct sockaddr *)&sin, &sinlen);
@@ -4544,14 +4540,13 @@ static void *accept_thread(void *ignore)
sessions = s;
ast_mutex_unlock(&sessionlock);
- if (ast_pthread_create(&tcp_thread, &attr, skinny_session, s)) {
+ if (ast_pthread_create_detached(&tcp_thread, NULL, skinny_session, s)) {
destroy_session(s);
}
}
if (skinnydebug)
ast_verbose("killing accept thread\n");
close(as);
- pthread_attr_destroy(&attr);
return 0;
}
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 2359fdeb9..d1a603288 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -3946,7 +3946,6 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
char *c;
struct zt_pvt *p = ast->tech_pvt;
pthread_t threadid;
- pthread_attr_t attr;
struct ast_channel *chan;
struct ast_frame *f;
@@ -4549,11 +4548,9 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
if (res)
ast_log(LOG_WARNING, "Unable to start dial recall tone on channel %d\n", p->channel);
p->owner = chan;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (!chan) {
ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", p->channel);
- } else if (ast_pthread_create(&threadid, &attr, ss_thread, chan)) {
+ } else if (ast_pthread_create_detached(&threadid, NULL, ss_thread, chan)) {
ast_log(LOG_WARNING, "Unable to start simple switch on channel %d\n", p->channel);
res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION);
zt_enable_ec(p);
@@ -4569,7 +4566,6 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
}
p->subs[SUB_THREEWAY].needhold = 1;
}
- pthread_attr_destroy(&attr);
}
} else {
/* Already have a 3 way call */
@@ -6941,8 +6937,7 @@ static int handle_init_event(struct zt_pvt *i, int event)
pthread_t threadid;
pthread_attr_t attr;
struct ast_channel *chan;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
/* Handle an event on a given channel for the monitor thread. */
switch (event) {
case ZT_EVENT_NONE:
@@ -6986,7 +6981,7 @@ static int handle_init_event(struct zt_pvt *i, int event)
res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_DIALTONE);
if (res < 0)
ast_log(LOG_WARNING, "Unable to play dialtone on channel %d\n", i->channel);
- if (ast_pthread_create(&threadid, &attr, ss_thread, chan)) {
+ if (ast_pthread_create_detached(&threadid, NULL, ss_thread, chan)) {
ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION);
if (res < 0)
@@ -7133,7 +7128,6 @@ static int handle_init_event(struct zt_pvt *i, int event)
zap_destroy_channel_bynum(i->channel);
break;
}
- pthread_attr_destroy(&attr);
return 0;
}
@@ -7332,9 +7326,6 @@ static void *do_monitor(void *data)
static int restart_monitor(void)
{
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* If we're supposed to be stopped -- stay stopped */
if (monitor_thread == AST_PTHREADT_STOP)
return 0;
@@ -7349,15 +7340,13 @@ static int restart_monitor(void)
pthread_kill(monitor_thread, SIGURG);
} else {
/* Start a new monitor */
- if (ast_pthread_create_background(&monitor_thread, &attr, do_monitor, NULL) < 0) {
+ if (ast_pthread_create_detached_background(&monitor_thread, NULL, do_monitor, NULL) < 0) {
ast_mutex_unlock(&monlock);
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
- pthread_attr_destroy(&attr);
return -1;
}
}
ast_mutex_unlock(&monlock);
- pthread_attr_destroy(&attr);
return 0;
}
@@ -8521,15 +8510,11 @@ static void *ss7_linkset(void *data)
ss7_event *e = NULL;
struct zt_pvt *p;
int chanpos;
- pthread_attr_t attr;
struct pollfd pollers[NUM_DCHANS];
int cic;
unsigned int dpc;
int nextms = 0;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
ss7_start(ss7);
while(1) {
@@ -9300,7 +9285,6 @@ static void *pri_dchannel(void *vpri)
int cause=0;
struct zt_pvt *crv;
pthread_t threadid;
- pthread_attr_t attr;
char ani2str[6];
char plancallingnum[256];
char plancallingani[256];
@@ -9799,9 +9783,7 @@ static void *pri_dchannel(void *vpri)
pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
ast_mutex_lock(&pri->lock);
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (c && !ast_pthread_create(&threadid, &attr, ss_thread, c)) {
+ if (c && !ast_pthread_create_detached(&threadid, NULL, ss_thread, c)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
plancallingnum, S_OR(pri->pvts[chanpos]->exten, "<unspecified>"),
@@ -9816,7 +9798,6 @@ static void *pri_dchannel(void *vpri)
pri->pvts[chanpos]->call = NULL;
}
}
- pthread_attr_destroy(&attr);
} else {
ast_mutex_unlock(&pri->lock);
/* Release PRI lock while we create the channel */