diff -Naur asterisk.old/apps/app_meetme.c asterisk.new/apps/app_meetme.c --- asterisk.old/apps/app_meetme.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/apps/app_meetme.c 2005-09-26 11:18:46.000000000 +0200 @@ -814,7 +814,7 @@ snprintf(recordingtmp,sizeof(recordingtmp), "wav"); conf->recordingformat = ast_strdupa(recordingtmp); } - pthread_attr_init(&conf->attr); + ast_pthread_attr_init(&conf->attr); pthread_attr_setdetachstate(&conf->attr, PTHREAD_CREATE_DETACHED); ast_verbose(VERBOSE_PREFIX_4 "Starting recording of MeetMe Conference %s into file %s.%s.\n", conf->confno, conf->recordingfilename, conf->recordingformat); ast_pthread_create(&conf->recordthread, &conf->attr, recordthread, conf); diff -Naur asterisk.old/apps/app_queue.c asterisk.new/apps/app_queue.c --- asterisk.old/apps/app_queue.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/apps/app_queue.c 2005-09-26 11:18:46.000000000 +0200 @@ -485,7 +485,7 @@ if (sc) { sc->state = state; strcpy(sc->dev, dev); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&t, &attr, changethread, sc)) { ast_log(LOG_WARNING, "Failed to create update thread!\n"); diff -Naur asterisk.old/apps/app_rpt.c asterisk.new/apps/app_rpt.c --- asterisk.old/apps/app_rpt.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/apps/app_rpt.c 2005-09-26 11:18:46.000000000 +0200 @@ -1434,7 +1434,7 @@ } insque((struct qelem *)tele,(struct qelem *)myrpt->tele.next); ast_mutex_unlock(&myrpt->lock); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create(&tele->threadid,&attr,rpt_tele_thread,(void *) tele); return; @@ -2063,7 +2063,7 @@ myrpt->cidx = 0; myrpt->exten[myrpt->cidx] = 0; ast_mutex_unlock(&myrpt->lock); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create(&myrpt->rpt_call_thread,&attr,rpt_call,(void *) myrpt); return DC_COMPLETE; @@ -4981,7 +4981,7 @@ myrpt->cidx = 0; myrpt->exten[myrpt->cidx] = 0; ast_mutex_unlock(&myrpt->lock); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create(&myrpt->rpt_call_thread,&attr,rpt_call,(void *)myrpt); continue; @@ -5482,7 +5482,7 @@ ast_log(LOG_WARNING,"Did not specify ident for node %s\n",rpt_vars[i].name); pthread_exit(NULL); } - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create(&rpt_vars[i].rpt_thread,&attr,rpt,(void *) &rpt_vars[i]); } @@ -5517,7 +5517,7 @@ rpt_vars[i].threadrestarts = 0; rpt_vars[i].lastthreadrestarttime = time(NULL); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create(&rpt_vars[i].rpt_thread,&attr,rpt,(void *) &rpt_vars[i]); ast_log(LOG_WARNING, "rpt_thread restarted on node %s\n", rpt_vars[i].name); diff -Naur asterisk.old/asterisk.c asterisk.new/asterisk.c --- asterisk.old/asterisk.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/asterisk.c 2005-09-26 11:18:46.000000000 +0200 @@ -516,7 +516,7 @@ int flags; struct pollfd fds[1]; pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); for(;;) { if (ast_socket < 0) diff -Naur asterisk.old/cdr.c asterisk.new/cdr.c --- asterisk.old/cdr.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/cdr.c 2005-09-26 11:18:45.000000000 +0200 @@ -925,7 +925,7 @@ ast_log(LOG_DEBUG, "CDR single-threaded batch processing begins now\n"); do_batch_backend_process(oldbatchitems); } else { - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&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"); @@ -1179,7 +1179,7 @@ if it does not exist */ if (enabled && batchmode && (!was_enabled || !was_batchmode) && (cdr_thread == AST_PTHREADT_NULL)) { pthread_cond_init(&cdr_pending_cond, NULL); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&cdr_thread, &attr, do_cdr, NULL) < 0) { ast_log(LOG_ERROR, "Unable to start CDR thread.\n"); diff -Naur asterisk.old/channels/chan_h323.c asterisk.new/channels/chan_h323.c --- asterisk.old/channels/chan_h323.c 2005-09-26 09:41:32.000000000 +0200 +++ asterisk.new/channels/chan_h323.c 2005-09-26 11:18:45.000000000 +0200 @@ -1637,7 +1637,7 @@ /* Wake up the thread */ pthread_kill(monitor_thread, SIGURG); } else { - pthread_attr_init(&attr); + ast_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) { diff -Naur asterisk.old/channels/chan_mgcp.c asterisk.new/channels/chan_mgcp.c --- asterisk.old/channels/chan_mgcp.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/channels/chan_mgcp.c 2005-09-26 11:18:46.000000000 +0200 @@ -2899,7 +2899,7 @@ struct ast_channel *c; pthread_t t; pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); /* Off hook / answer */ @@ -3466,7 +3466,7 @@ static int restart_monitor(void) { pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); /* If we're supposed to be stopped -- stay stopped */ diff -Naur asterisk.old/channels/chan_sip.c asterisk.new/channels/chan_sip.c --- asterisk.old/channels/chan_sip.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/channels/chan_sip.c 2005-09-26 11:18:46.000000000 +0200 @@ -10838,7 +10838,7 @@ /* Wake up the thread */ pthread_kill(monitor_thread, SIGURG); } else { - pthread_attr_init(&attr); + ast_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) { diff -Naur asterisk.old/channels/chan_skinny.c asterisk.new/channels/chan_skinny.c --- asterisk.old/channels/chan_skinny.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/channels/chan_skinny.c 2005-09-26 11:18:46.000000000 +0200 @@ -2972,7 +2972,7 @@ int arg = 1; pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); for (;;) { diff -Naur asterisk.old/channels/chan_zap.c asterisk.new/channels/chan_zap.c --- asterisk.old/channels/chan_zap.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/channels/chan_zap.c 2005-09-26 11:18:45.000000000 +0200 @@ -3451,7 +3451,7 @@ pthread_attr_t attr; struct ast_channel *chan; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); index = zt_get_index(ast, p, 0); @@ -6145,7 +6145,7 @@ pthread_t threadid; pthread_attr_t attr; struct ast_channel *chan; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); /* Handle an event on a given channel for the monitor thread. */ switch(event) { @@ -6570,7 +6570,7 @@ static int restart_monitor(void) { pthread_attr_t attr; - pthread_attr_init(&attr); + ast_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) @@ -7940,7 +7940,7 @@ char plancallingani[256]; char calledtonstr[10]; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); gettimeofday(&lastidle, NULL); diff -Naur asterisk.old/devicestate.c asterisk.new/devicestate.c --- asterisk.old/devicestate.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/devicestate.c 2005-09-26 11:18:46.000000000 +0200 @@ -261,7 +261,7 @@ pthread_attr_t attr; pthread_cond_init(&change_pending, NULL); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&change_thread, &attr, do_devstate_changes, NULL) < 0) { ast_log(LOG_ERROR, "Unable to start device state change thread.\n"); diff -Naur asterisk.old/dnsmgr.c asterisk.new/dnsmgr.c --- asterisk.old/dnsmgr.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/dnsmgr.c 2005-09-26 11:18:46.000000000 +0200 @@ -336,7 +336,7 @@ /* if this reload enabled the manager, create the background thread if it does not exist */ if (enabled && !was_enabled && (refresh_thread == AST_PTHREADT_NULL)) { - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&refresh_thread, &attr, do_refresh, NULL) < 0) { ast_log(LOG_ERROR, "Unable to start refresh thread.\n"); diff -Naur asterisk.old/include/asterisk/utils.h asterisk.new/include/asterisk/utils.h --- asterisk.old/include/asterisk/utils.h 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/include/asterisk/utils.h 2005-09-26 11:20:19.000000000 +0200 @@ -190,6 +190,12 @@ #define AST_STACKSIZE 256 * 1024 #define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0) extern int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize); +#ifdef __linux__ +extern int ast_pthread_attr_init(pthread_attr_t *attr); +#else +#define ast_pthread_attr_init pthread_attr_init +#endif + /*! \brief Process a string to find and replace characters diff -Naur asterisk.old/manager.c asterisk.new/manager.c --- asterisk.old/manager.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/manager.c 2005-09-26 11:18:46.000000000 +0200 @@ -1039,7 +1039,7 @@ ast_copy_string(fast->exten, exten, sizeof(fast->exten)); fast->timeout = to; fast->priority = pi; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&th, &attr, fast_originate, fast)) { res = -1; @@ -1387,7 +1387,7 @@ int flags; pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); for (;;) { diff -Naur asterisk.old/pbx/pbx_dundi.c asterisk.new/pbx/pbx_dundi.c --- asterisk.old/pbx/pbx_dundi.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/pbx/pbx_dundi.c 2005-09-26 11:18:45.000000000 +0200 @@ -786,7 +786,7 @@ s += sizeof(dundi_eid); } ast_log(LOG_DEBUG, "Answering EID query for '%s@%s'!\n", dundi_eid_to_str(eid_str, sizeof(eid_str), ies->reqeid), ies->called_context); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); trans->thread = 1; if (ast_pthread_create(&lookupthread, &attr, dundi_query_thread, st)) { @@ -1017,7 +1017,7 @@ } st->nummaps = mapcount; ast_log(LOG_DEBUG, "Forwarding precache for '%s@%s'!\n", ies->called_number, ies->called_context); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); trans->thread = 1; if (ast_pthread_create(&lookupthread, &attr, dundi_precache_thread, st)) { @@ -1109,7 +1109,7 @@ } st->nummaps = mapcount; ast_log(LOG_DEBUG, "Answering query for '%s@%s'!\n", ies->called_number, ies->called_context); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); trans->thread = 1; if (ast_pthread_create(&lookupthread, &attr, dundi_lookup_thread, st)) { diff -Naur asterisk.old/pbx/pbx_spool.c asterisk.new/pbx/pbx_spool.c --- asterisk.old/pbx/pbx_spool.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/pbx/pbx_spool.c 2005-09-26 11:18:45.000000000 +0200 @@ -273,7 +273,7 @@ { pthread_t t; pthread_attr_t attr; - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&t,&attr,attempt_thread, o) == -1) { ast_log(LOG_WARNING, "Unable to create thread :(\n"); @@ -402,7 +402,7 @@ ast_log(LOG_WARNING, "Unable to create queue directory %s -- outgoing spool disabled\n", qdir); return 0; } - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&thread,&attr,scan_thread, NULL) == -1) { ast_log(LOG_WARNING, "Unable to create thread :(\n"); diff -Naur asterisk.old/pbx.c asterisk.new/pbx.c --- asterisk.old/pbx.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/pbx.c 2005-09-26 11:18:46.000000000 +0200 @@ -2478,7 +2478,7 @@ return AST_PBX_CALL_LIMIT; /* Start a new thread, and get something handling this channel. */ - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&t, &attr, pbx_thread, c)) { ast_log(LOG_WARNING, "Failed to create new channel thread\n"); @@ -5018,7 +5018,7 @@ as->priority = priority; as->timeout = timeout; ast_set_variables(chan, vars); - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ast_pthread_create(&as->p, &attr, async_wait, as)) { ast_log(LOG_WARNING, "Failed to start async wait\n"); @@ -5110,7 +5110,7 @@ ast_mutex_unlock(&chan->lock); ast_pbx_run_app(tmp); } else { - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (locked_channel) ast_mutex_lock(&chan->lock); @@ -5174,7 +5174,7 @@ as->timeout = timeout; ast_set_variables(chan, vars); /* Start a new thread, and get something handling this channel. */ - pthread_attr_init(&attr); + ast_pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (locked_channel) ast_mutex_lock(&chan->lock); diff -Naur asterisk.old/res/res_features.c asterisk.new/res/res_features.c --- asterisk.old/res/res_features.c 2005-09-26 09:41:33.000000000 +0200 +++ asterisk.new/res/res_features.c 2005-09-26 11:18:46.000000000 +0200 @@ -245,7 +245,7 @@ pthread_attr_t attr; int result; - result = pthread_attr_init(&attr); + result = ast_pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); result = ast_pthread_create(&thread, &attr,ast_bridge_call_thread, data); diff -Naur asterisk.old/utils.c asterisk.new/utils.c --- asterisk.old/utils.c 2005-09-26 09:41:31.000000000 +0200 +++ asterisk.new/utils.c 2005-09-26 11:18:45.000000000 +0200 @@ -464,6 +464,23 @@ return 0; } +#ifdef __linux__ +/* On Linux, pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED, which is + kind of useless. Instead we use this version which defaults to + PTHREAD_INHERIT_SCHED; that way the -p option to set realtime priority will + propagate down to new threads by default, but individual threads may + override it in the ast_pthread_create attributes as they wish.*/ +int ast_pthread_attr_init(pthread_attr_t *attr) { + int res; + + res = pthread_attr_init(attr); + if(res == 0) { + res = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED); + } + return res; +} +#endif + #ifndef __linux__ #undef pthread_create /* For ast_pthread_create function only */ #endif /* ! LINUX */ @@ -472,7 +489,7 @@ { pthread_attr_t lattr; if (!attr) { - pthread_attr_init(&lattr); + ast_pthread_attr_init(&lattr); attr = &lattr; } if (!stacksize)