asterisk/main
Matthew Jordan 530ce21b5d Reorder startup sequence to prevent lockups when process is sent to background
Although it is very rare and timing dependent, the potential exists for the
call to 'daemon' to cause what appears to be a deadlock in Asterisk during
startup.  This can occur when a recursive mutex is obtained prior to the
daemon call executing.  Since daemon uses fork to send the process into the
background, any threading primitives are unsafe to re-use after the call.
Implementations of pthread recursive mutexes are highly likely to store the
thread identifier of the thread that previously obtained the mutex.  If
the mutex was locked prior to the fork, a subsequent unlock operation will
potentially fail as the thread identifier is no longer valid.  Since the
mutex is still locked, all subsequent attempts to grab the mutex by other
threads will block.

This behavior exhibited itself most often when DEBUG_THREADS was enabled, as
this compile time option surrounds the mutexes in Asterisk with another
recursive mutex that protects the storage of thread related information.  This
made it much more likely that a recursive mutex would be obtained prior to
daemon and unlocked after the call.

This patch does the following:
a) It backports a patch from Asterisk 11 that prevents the spawning of the
   localtime monitoring thread.  This thread is now spawned after Asterisk has
   fully booted.
b) It re-orders the startup sequence to call daemon earlier during Asterisk
   startup.  This limits the potential of threading primitives being accessed
   by initialization calls before daemon is called.
c) It removes calls to ast_verbose/ast_log/etc. prior to daemon being called.
   Developers should send error messages directly to stderr prior to daemon,
   as calls to ast_log may access recursive mutexes that store thread related
   information.
d) It reorganizes when thread local storage is created for storing lock
   information during the creation of threads.  Prior to this patch, the
   read/write lock protecting the list of threads in ast_register_thread would
   utilize the lock in the thread local storage prior to it being initialized;
   this patch prevents that.

On a very related note, this patch will *greatly* improve the stability of the
Asterisk Test Suite.

Review: https://reviewboard.asterisk.org/r/2197

(closes issue ASTERISK-19463)
Reported by: mjordan
Tested by: mjordan
........

Merged revisions 376428 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 376431 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 376441 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@376447 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-11-18 20:27:45 +00:00
..
editline Enable usage of system-provided NetBSD editline library if available. 2012-07-25 12:21:54 +00:00
stdtime Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
Makefile Title update 2012-10-14 21:56:13 +00:00
abstract_jb.c Unit tests for the Jitter Buffer API; remove unnecessary resync 2012-07-23 21:15:26 +00:00
acl.c Trivial patch to make 'best_score' defined for all architectures. 2012-10-07 17:33:38 +00:00
adsi.c Fix crash in unloading of res_adsi module 2012-06-26 13:23:12 +00:00
alaw.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
aoc.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
app.c core: Fix a memory leak in app.c from an early return 2012-10-22 20:19:51 +00:00
ast_expr2.c Allow the REALTIME() function to report errors back to the caller. 2012-07-11 17:16:50 +00:00
ast_expr2.fl Avoid cppcheck warnings; removing unused vars and a bit of cleanup. 2012-04-17 18:57:40 +00:00
ast_expr2.h Allow the REALTIME() function to report errors back to the caller. 2012-07-11 17:16:50 +00:00
ast_expr2.y Multiple revisions 360356-360357 2012-03-24 02:42:42 +00:00
ast_expr2f.c Doxygen Updates - janitor work 2012-09-21 17:14:59 +00:00
asterisk.c Reorder startup sequence to prevent lockups when process is sent to background 2012-11-18 20:27:45 +00:00
asterisk.dynamics Remove the old stub files, preferring the optional_api method. 2010-07-14 20:48:59 +00:00
asterisk.exports.in Add new config-parsing framework 2012-06-01 16:33:25 +00:00
astfd.c Doxygen Updates Janitor Work 2012-09-22 20:43:30 +00:00
astmm.c Add MALLOC_DEBUG enhancements. 2012-11-08 17:38:31 +00:00
astobj2.c Missed an astobj2.c debug tag. 2012-10-02 23:23:30 +00:00
audiohook.c Doxygen Updates Janitor Work 2012-09-22 20:43:30 +00:00
autochan.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
autoservice.c Hangup handlers - Dialplan subroutines that run when the channel hangs up. 2012-06-29 17:02:32 +00:00
bridging.c Fix bridging thread leak. 2012-07-06 15:31:52 +00:00
buildinfo.c fix a few small things found by using sparse 2008-10-30 16:49:02 +00:00
callerid.c Allow for redirecting reasons to be set to arbitrary strings. 2012-09-25 19:29:14 +00:00
ccss.c Things don't need to be that const. 2012-11-02 21:01:33 +00:00
cdr.c Prevent multiple CDR batches from conflicting when scheduling the CDR write 2012-11-04 00:02:06 +00:00
cel.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
channel.c Patch to prevent stopping the active generator when it is not the silence 2012-11-15 14:35:01 +00:00
channel_internal_api.c Fix stuck DTMF when bridge is broken. 2012-11-06 19:05:11 +00:00
chanvars.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
cli.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
config.c Add scoped locks to Asterisk. 2012-08-21 19:04:32 +00:00
config_options.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
cygload.c Kill off red blobs in most of main/* 2012-03-22 19:51:16 +00:00
data.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
datastore.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
db.c Properly finalize prepared SQLite3 statements to prevent memory leak 2012-11-04 01:19:43 +00:00
devicestate.c Deprecate chan_gtalk, chan_jingle, and res_jabber 2012-09-10 19:49:30 +00:00
dial.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
dns.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
dnsmgr.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
dsp.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
ecdisa.h Kill off red blobs in most of main/* 2012-03-22 19:51:16 +00:00
enum.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
event.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
features.c Fix stuck DTMF when bridge is broken. 2012-11-06 19:05:11 +00:00
file.c Clean up doxygen warnings 2012-08-30 14:23:28 +00:00
fixedjitterbuf.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
fixedjitterbuf.h Kill off red blobs in most of main/* 2012-03-22 19:51:16 +00:00
format.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
format_cap.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
format_pref.c Things don't need to be that const. 2012-11-02 21:01:33 +00:00
frame.c Rewrite a comment that didn't adequately explain the code it was documenting. 2012-07-24 16:54:26 +00:00
framehook.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
fskmodem.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
fskmodem_float.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
fskmodem_int.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
global_datastores.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
hashtab.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
heap.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
http.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
image.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
indications.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
io.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
jitterbuf.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
libasteriskssl.c Resolve memory leaks in TLS initialization and TLS client connections 2012-09-14 19:53:43 +00:00
libasteriskssl.exports.in Address OpenSSL initialization issues when using third-party libraries. 2012-01-30 21:21:16 +00:00
loader.c Add safety NULL pointer check in module user references. 2012-11-05 21:42:49 +00:00
lock.c Fixes ast_rwlock_timed[rd|wr]lock for BSD and variants. 2012-08-27 16:56:56 +00:00
logger.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
manager.c Don't attempt to purge sessions when no sessions exist 2012-11-04 03:10:21 +00:00
md5.c md5: supress some compiler warnings. 2012-04-28 01:33:49 +00:00
message.c Update documentation for MessageSend application/command's From field for XMPP 2012-10-06 01:47:00 +00:00
named_acl.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
netsock.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
netsock2.c Fix NULL pointer segfault in ast_sockaddr_parse() 2012-06-20 02:07:00 +00:00
pbx.c Properly check if the "Context" and "Extension" headers are empty in a ShowDialPlan action. 2012-11-12 20:46:51 +00:00
plc.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
poll.c Merged revisions 285268 via svnmerge from 2010-09-07 19:09:08 +00:00
presencestate.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
privacy.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
rtp_engine.c Multiple revisions 375993-375994 2012-11-07 19:15:26 +00:00
say.c Fix saying of date in Dutch. 2012-09-25 23:10:22 +00:00
sched.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
security_events.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
sha1.c Doxygen Updates - janitor work 2012-09-21 17:14:59 +00:00
sip_api.c Don't make chan_sip export global symbols. 2012-10-11 15:49:02 +00:00
slinfactory.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
srv.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
strcompat.c Clean up and ensure proper usage of alloca() 2012-07-31 20:21:43 +00:00
strings.c Doxygen Updates - janitor work 2012-09-21 17:14:59 +00:00
stun.c When receiving a STUN binding request send one out as the Google Talk client uses this as a method to determine if the remote party is still reachable or not. 2012-07-09 22:38:25 +00:00
syslog.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
taskprocessor.c Fix a variety of ref counting issues 2012-10-02 01:47:16 +00:00
tcptls.c Ensure Asterisk fails TCP/TLS SIP calls when certificate checking fails 2012-10-17 19:01:27 +00:00
tdd.c Doxygen Updates - janitor work 2012-09-21 17:14:59 +00:00
term.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
test.c Tweak unit test warning message. 2012-07-30 23:26:51 +00:00
threadstorage.c Clean up and ensure proper usage of alloca() 2012-07-31 20:21:43 +00:00
timing.c Refactor ast_timer_ack to return an error and handle the error in timer users 2012-11-05 23:10:14 +00:00
translate.c Add support for parsing SDP attributes, generating SDP attributes, and passing it through. 2012-07-13 16:49:40 +00:00
udptl.c Doxygen Updates - Title update 2012-10-18 14:17:40 +00:00
ulaw.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
utils.c Reorder startup sequence to prevent lockups when process is sent to background 2012-11-18 20:27:45 +00:00
xml.c Multiple revisions 369001-369002 2012-06-15 16:20:16 +00:00
xmldoc.c Fix memory leaks in XML documentation 2012-11-04 00:48:24 +00:00