]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merge FreeBSD locking fixes (bug #1411)
authorMark Spencer <markster@digium.com>
Wed, 9 Jun 2004 01:45:08 +0000 (01:45 +0000)
committerMark Spencer <markster@digium.com>
Wed, 9 Jun 2004 01:45:08 +0000 (01:45 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3176 65c4cc65-6c06-0410-ace0-fbb531ad65f3

76 files changed:
acl.c
apps/app_intercom.c
apps/app_meetme.c
apps/app_queue.c
apps/app_voicemail.c
asterisk.c
astmm.c
autoservice.c
cdr.c
cdr/cdr_odbc.c
cdr/cdr_pgsql.c
channel.c
channels/chan_agent.c
channels/chan_alsa.c
channels/chan_h323.c
channels/chan_iax.c
channels/chan_iax2.c
channels/chan_local.c
channels/chan_mgcp.c
channels/chan_modem.c
channels/chan_modem_aopen.c
channels/chan_modem_bestdata.c
channels/chan_modem_i4l.c
channels/chan_nbs.c
channels/chan_oss.c
channels/chan_phone.c
channels/chan_sip.c
channels/chan_skinny.c
channels/chan_vofr.c
channels/chan_vpb.c
channels/chan_zap.c
cli.c
codecs/codec_a_mu.c
codecs/codec_adpcm.c
codecs/codec_alaw.c
codecs/codec_g723_1.c
codecs/codec_g726.c
codecs/codec_gsm.c
codecs/codec_ilbc.c
codecs/codec_lpc10.c
codecs/codec_speex.c
codecs/codec_ulaw.c
db.c
dns.c
enum.c
file.c
formats/format_g723.c
formats/format_g726.c
formats/format_g729.c
formats/format_gsm.c
formats/format_h263.c
formats/format_ilbc.c
formats/format_pcm.c
formats/format_pcm_alaw.c
formats/format_vox.c
formats/format_wav.c
formats/format_wav_gsm.c
frame.c
image.c
include/asterisk/linkedlists.h
include/asterisk/lock.h
include/asterisk/module.h
indications.c
loader.c
logger.c
manager.c
pbx.c
pbx/pbx_config.c
pbx/pbx_gtkconsole.c
res/res_crypto.c
res/res_monitor.c
res/res_musiconhold.c
res/res_parking.c
stdtime/localtime.c
translate.c
utils.c

diff --git a/acl.c b/acl.c
index d696716dab1d356d382a579faf7f2e7e2c7917c2..4feea75a7fcf09a7767b2beaf28d2ecb294c007d 100755 (executable)
--- a/acl.c
+++ b/acl.c
@@ -34,7 +34,7 @@
 #include <fcntl.h>
 #include <net/route.h>
 
-static ast_mutex_t routeseq_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(routeseq_lock);
 #endif
 
 
index a4d863697479d59ee722d16ad40a4610edb25682..4462be1809dd71785840e2f3e47f9a5db8581e6e 100755 (executable)
@@ -59,7 +59,7 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
-static ast_mutex_t sound_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(sound_lock);
 static int sound = -1;
 
 static int write_audio(short *data, int len)
index 591ea5af8b8db23e54e3d3e8522475b695db2d45..84f2e1081e7e1548dfd864763ed1d5b40eb3170b 100755 (executable)
@@ -125,7 +125,7 @@ struct ast_conf_user {
 #define ADMINFLAG_KICKME (1 << 2)      /* User is kicked */
 
 
-static ast_mutex_t conflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(conflock);
 
 static int admin_exec(struct ast_channel *chan, void *data);
 
index 840c5fca7da1f5678355f9b07cb4134b3fae2c9a..86047fdbed651292435e74fc363c3d2ad6f2a0ef 100755 (executable)
@@ -218,7 +218,7 @@ struct ast_call_queue {
 };
 
 static struct ast_call_queue *queues = NULL;
-static ast_mutex_t qlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(qlock);
 
 static char *int2strat(int strategy)
 {
index fd47cac8c31745060ad0f452f7164fb33875fb6c..e2f3fbfc6b36b3f600d933196c8c7ae24cc48035 100755 (executable)
@@ -207,7 +207,7 @@ static char *app2 = "VoiceMailMain";
 
 static char *app3 = "MailboxExists";
 
-static ast_mutex_t vmlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(vmlock);
 struct ast_vm_user *users;
 struct ast_vm_user *usersl;
 struct vm_zone *zones = NULL;
index e6e74efaaa740abe5a65f94b3d57aff48ab07df4..5894da1a8c95c954e3ddfb8a54a6a2de5468e988 100755 (executable)
@@ -83,7 +83,7 @@ static struct ast_atexit {
        void (*func)(void);
        struct ast_atexit *next;
 } *atexits = NULL;
-static ast_mutex_t atexitslock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(atexitslock);
 
 time_t ast_startuptime;
 time_t ast_lastreloadtime;
diff --git a/astmm.c b/astmm.c
index 6e507aaacf43337450e5ec214404db1befc9d5cb..6b98c557d1be4aa74488fdcf33e3d1466ca59bfa 100755 (executable)
--- a/astmm.c
+++ b/astmm.c
@@ -58,8 +58,8 @@ static struct ast_region {
 #define HASH(a) \
        (((unsigned long)(a)) % SOME_PRIME)
        
-static ast_mutex_t reglock = AST_MUTEX_INITIALIZER;
-static ast_mutex_t showmemorylock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(reglock);
+AST_MUTEX_DEFINE_STATIC(showmemorylock);
 
 static inline void *__ast_alloc_region(size_t size, int which, const char *file, int lineno, const char *func)
 {
index 3f24db8c19f9c78d52025b1cfe0ec13f9a20798f..2f28f35a7a868405cc05f1ab1da6e7121232b39e 100755 (executable)
@@ -36,7 +36,7 @@
 
 #define MAX_AUTOMONS 256
 
-static ast_mutex_t autolock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(autolock);
 
 struct asent {
        struct ast_channel *chan;
diff --git a/cdr.c b/cdr.c
index 67acf105def3c34599eb50c3ebfed77e7c47e87c..5f43b12a42a306d0442d12cfba19825f5cf1a09a 100755 (executable)
--- a/cdr.c
+++ b/cdr.c
@@ -30,7 +30,7 @@
 int ast_default_amaflags = AST_CDR_DOCUMENTATION;
 char ast_default_accountcode[20] = "";
 
-static ast_mutex_t cdrlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(cdrlock);
 
 static struct ast_cdr_beitem {
        char name[20];
index 2bcd9d3f7a11e0585089501443f66a2d1b28779f..acd23270ab1885cdf8dc261d04cbb25ca37f5025 100755 (executable)
@@ -41,7 +41,7 @@ static char *dsn = NULL, *username = NULL, *password = NULL, *loguniqueid = NULL
 static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, loguniqueid_alloc = 0;
 static int connected = 0;
 
-static ast_mutex_t odbc_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(odbc_lock);
 
 static int odbc_do_query(void);
 static int odbc_init(void);
index bbbc2275cf95c3ada7b6867327f3221485760476..876ed7f8c8e8111cf0d8f5eb6727442dead4f142 100755 (executable)
@@ -41,7 +41,7 @@ static char *pghostname = NULL, *pgdbname = NULL, *pgdbuser = NULL, *pgpassword
 static int hostname_alloc = 0, dbname_alloc = 0, dbuser_alloc = 0, password_alloc = 0, dbsock_alloc = 0, dbport_alloc = 0;
 static int connected = 0;
 
-static ast_mutex_t pgsql_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(pgsql_lock);
 
 PGconn         *conn;
 PGresult       *result;
index b3ba99743e9b1e2b8d36491245ddc118bc52b501..52a49aa45dbf1992fba8b05b9e180e7e44185baa 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -74,7 +74,7 @@ struct ast_channel *channels = NULL;
 /* Protect the channel list (highly unlikely that two things would change
    it at the same time, but still! */
    
-static ast_mutex_t chlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(chlock);
 
 int ast_check_hangup(struct ast_channel *chan)
 {
index cc35c3ee58d3bb0d3c54fe88b2e0c2ddbaa382fc..f91c6324b8523cbef4a4dd24d6246f0c2975c97e 100755 (executable)
@@ -91,10 +91,10 @@ static int wrapuptime;
 static int ackcall;
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of sip_pvt's) */
-static ast_mutex_t agentlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(agentlock);
 
 static int recordagentcalls = 0;
 static char recordformat[AST_MAX_BUF];
index 8446a7a93088d30790d55bf0b4b43225ed40ce28..d78ee0f205256c0f5e0cffee4b1b6060726f267b 100755 (executable)
@@ -77,7 +77,7 @@ static int silencethreshold = 1000;
 static char digits[80] = "";
 static char text2send[80] = "";
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char *type = "Console";
 static char *desc = "ALSA Console Channel Driver";
index 20f8cd1ea648c1a4deb5c5b9b004673bfbd4d7d9..6c49f227c2c935833d06ce78ede1a8041723a517 100755 (executable)
@@ -141,15 +141,15 @@ static struct sched_context *sched;
 static struct io_context *io;
 
 /** Protect the interface list (of oh323_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /** Usage counter and associated lock */
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
index d1be1918350b838e59971e19ebcdf9a11ee9673e..b8a48fed2d1b583b5878325e01fe79c42f601d8c 100755 (executable)
@@ -80,7 +80,7 @@
 #define GAMMA (0.01)
 
 #ifdef MYSQL_FRIENDS
-static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(mysqllock);
 static MYSQL *mysql;
 static char mydbuser[80];
 static char mydbpass[80];
@@ -112,7 +112,7 @@ static int tos = 0;
 static int expirey = AST_DEFAULT_REG_EXPIRE;
 
 static int usecnt;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 int (*iax_regfunk)(char *username, int onoff) = NULL;
 
index 25097ac4a76ee93af83ddb018a9c9db22b041cbe..a89a0f55725f9266416808582b5937dc15619deb 100755 (executable)
 #define GAMMA (0.01)
 
 #ifdef MYSQL_FRIENDS
-static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(mysqllock);
 static MYSQL *mysql;
 static char mydbuser[80];
 static char mydbpass[80];
@@ -138,7 +138,7 @@ static int expirey = IAX_DEFAULT_REG_EXPIRE;
 static int timingfd = -1;                              /* Timing file descriptor */
 
 static int usecnt;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 int (*iax2_regfunk)(char *username, int onoff) = NULL;
 
@@ -269,7 +269,7 @@ static struct iax2_trunk_peer {
        int calls;
 } *tpeers = NULL;
 
-static ast_mutex_t tpeerlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(tpeerlock);
 
 struct iax_firmware {
        struct iax_firmware *next;
index 86ed6d17ad3dc2b5ecb460c7ba26424cbbbd7787..c6cb4c7cf50dcfb52776a887b4b5346d34233c6d 100755 (executable)
@@ -49,12 +49,12 @@ static char *tdesc = "Local Proxy Channel Driver";
 static int capability = -1;
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 #define IS_OUTBOUND(a,b) (a == b->chan ? 1 : 0)
 
 /* Protect the interface list (of sip_pvt's) */
-static ast_mutex_t locallock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(locallock);
 
 static struct local_pvt {
        ast_mutex_t lock;                               /* Channel private lock */
index 27adaccfa89d42e2b16f879707d40fdaca063a15..740731eabfca2eb365a4c4e3de55393ae236bdf8 100755 (executable)
@@ -199,7 +199,7 @@ static int adsi = 0;
 
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 /* SC: transaction id should always be positive */
 static unsigned int oseq;
 
@@ -214,9 +214,9 @@ static int matchdigittimeout = 3000;
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(netlock);
 
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
@@ -419,10 +419,10 @@ static struct mgcp_gateway {
        struct mgcp_gateway *next;
 } *gateways;
 
-static ast_mutex_t mgcp_reload_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(mgcp_reload_lock);
 static int mgcp_reloading = 0;
 
-static ast_mutex_t gatelock  = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(gatelock);
 
 static int mgcpsock  = -1;
 
index 728aa361ada85cb4b3d931add44ff7d0dc36febd..905a15d28308986fd4fa030ddc14afdc55592a5b 100755 (executable)
@@ -72,14 +72,14 @@ static int baudrate = 115200;
 
 static int stripmsd = 0;
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of ast_modem_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
index 4222e85cdd9ea068aa560debdbe0065459956864..c123bfddff8077215d825c6d35be5629ca692fdc 100755 (executable)
@@ -34,7 +34,7 @@ static char *breakcmd = "\0x10\0x03";
 static char *desc = "A/Open (Rockwell Chipset) ITU-2 VoiceModem Driver";
 
 static int usecnt;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char *aopen_idents[] = {
        /* Identify A/Open Modem */
index 10732dca75f72acff8e3526798f810bc591f847f..7eca765199655a40868488f0fecb57163c326096 100755 (executable)
@@ -39,7 +39,7 @@ static char *breakcmd = "\020!";
 static char *desc = "BestData (Conexant V.90 Chipset) VoiceModem Driver";
 
 static int usecnt;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char *bestdata_idents[] = {
        /* Identify BestData Modem */
index a8d08a631ac73ddefba0b3ebcc4c2b0a43976c15..a7c28b621dcbd71af2704ed8f06f86e4740d3999 100755 (executable)
@@ -34,7 +34,7 @@ static char *breakcmd = "\0x10\0x14\0x10\0x3";
 static char *desc = "ISDN4Linux Emulated Modem Driver";
 
 static int usecnt;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char *i4l_idents[] = {
        /* Identify ISDN4Linux Driver */
index b4e5392c423eaa21056723ea70eed36c1e895c6d..700dcc643f4aa6185c6d32f1e4b288e345acb50a 100755 (executable)
@@ -41,7 +41,7 @@ static int usecnt =0;
 /* Only linear is allowed */
 static int prefformat = AST_FORMAT_SLINEAR;
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char context[AST_MAX_EXTENSION] = "default";
 
index 731ae30eea8d43a063ebae3a0d782be65e5bb167..7bd7ddb8c52d6ae755837921e9c4bdcee17ec290 100755 (executable)
@@ -70,7 +70,7 @@ static int silencesuppression = 0;
 static int silencethreshold = 1000;
 
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 static char *type = "Console";
 static char *desc = "OSS Console Channel Driver";
index 3e1a28b4b33370b3451f1ed04fa7b4c83df87c69..8b2261cbb02c5a4139ea84a2e278503735466d73 100755 (executable)
@@ -76,14 +76,14 @@ static int silencesupression = 0;
 
 static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW;
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of phone_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
index 3c0dc2b56d2b9b76f2fb6cc55ee144fb13033b35..74d84bd89b67c96b27f30dabc9a81562194ce486 100755 (executable)
@@ -108,7 +108,7 @@ static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
 /* MYSQL_FRIENDS: Check if peer exists in database and read some configuration
    from databse (not all options supported though) */
 #ifdef MYSQL_FRIENDS
-static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(mysqllock);
 static MYSQL *mysql;
 static char mydbuser[80];
 static char mydbpass[80];
@@ -155,16 +155,16 @@ static int globalrtptimeout = 0;
 static int globalrtpholdtimeout = 0;
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of sip_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(netlock);
 
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
@@ -430,7 +430,7 @@ struct sip_peer {
        struct sip_peer *next;
 };
 
-static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(sip_reload_lock);
 static int sip_reloading = 0;
 
 #define REG_STATE_UNREGISTERED 0
@@ -467,20 +467,20 @@ struct sip_registry {
 static struct ast_user_list {
        struct sip_user *users;
        ast_mutex_t lock;
-} userl = { NULL, AST_MUTEX_INITIALIZER };
+} userl;
 
 /*--- The peer list: Peers and Friends ---*/
 static struct ast_peer_list {
        struct sip_peer *peers;
        ast_mutex_t lock;
-} peerl = { NULL, AST_MUTEX_INITIALIZER };
+} peerl;
 
 /*--- The register list: Other SIP proxys we register with and call ---*/
 static struct ast_register_list {
        struct sip_registry *registrations;
        ast_mutex_t lock;
        int recheck;
-} regl = { NULL, AST_MUTEX_INITIALIZER };
+} regl;
 
 
 #define REINVITE_INVITE                1
@@ -1368,6 +1368,7 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
                                ast_sched_del(sched, cp->retransid);
                        free(cp);
                }
+                ast_mutex_destroy(&p->lock);
                free(p);
        }
 }
@@ -2018,6 +2019,7 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
        struct sip_pvt *p;
 
        p = malloc(sizeof(struct sip_pvt));
+        ast_mutex_init(&p->lock);
        if (!p)
                return NULL;
        /* Keep track of stuff */
@@ -2035,6 +2037,7 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
        p->ocseq = 101;
        if (!p->rtp) {
                ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
+                ast_mutex_destroy(&p->lock);
                free(p);
                return NULL;
        }
@@ -2049,7 +2052,6 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
                if (p->vrtp)
                        ast_rtp_setnat(p->vrtp, p->nat);
        }
-       ast_mutex_init(&p->lock);
 
        if (sin) {
                memcpy(&p->sa, sin, sizeof(p->sa));
@@ -8039,6 +8041,10 @@ int load_module()
        int res;
        struct sip_peer *peer;
        struct sip_registry *reg;
+
+        ast_mutex_init(&userl.lock);
+        ast_mutex_init(&peerl.lock);
+        ast_mutex_init(&regl.lock);
        sched = sched_context_create();
        if (!sched) {
                ast_log(LOG_WARNING, "Unable to create schedule context\n");
index 22b07c597761aeaaa1bb68fb3a93c0beafef4000..bb8a9a9c8bd582f09e1ebd23d913d5e5f19a71f9 100755 (executable)
@@ -585,17 +585,17 @@ static struct io_context *io;
 
 /* usage count and locking */
 static int usecnt = 0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 /* Protect the network socket */
-static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(netlock);
 /* Protect the session list */
-static ast_mutex_t sessionlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(sessionlock);
 /* Protect the device list */
-static ast_mutex_t devicelock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(devicelock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
index 444701fd7d0b3be6d6134c7acb4b0a0f4fef3a15..7ab952dc27dec7f9c5a563a2e8cb0119c498e316 100755 (executable)
@@ -53,14 +53,14 @@ static char context[AST_MAX_EXTENSION] = "default";
 static char language[MAX_LANGUAGE] = "";
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of vofr_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
index c578946e093cb083f8aec0f454a5a2203c862728..7528a0f2097cfcf58af91f21bf05b9e151eb45a6 100755 (executable)
@@ -69,14 +69,14 @@ static int gruntdetect_timeout = 3600000; /* Grunt detect timeout is 1hr. */
 
 static const int prefformat = AST_FORMAT_SLINEAR;
 
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of vpb_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
@@ -171,7 +171,7 @@ typedef struct  {
 static vpb_bridge_t * bridges;
 static int max_bridges = MAX_BRIDGES_V4PCI;
 
-static ast_mutex_t bridge_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(bridge_lock);
 
 typedef enum {
        vpb_model_unknown = 0, 
index 58a67ddf0481aff2fe5d042ba7bfb5b4b8548867..076ad18a1ba6159ddb30543dd3f276ef2b3100c9 100755 (executable)
@@ -241,16 +241,16 @@ static int gendigittimeout = 8000;
 static int matchdigittimeout = 3000;
 
 static int usecnt =0;
-static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
 /* Protect the interface list (of zt_pvt's) */
-static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(iflock);
 
 static int ifcount = 0;
 
 /* Protect the monitoring thread, so only one process can kill or start it, and not
    when it's doing something critical. */
-static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monlock);
 
 /* This is the thread for the monitor which checks for input on the channels
    which are not currently in use.  */
diff --git a/cli.c b/cli.c
index 6fa4e28fd34f563ebdbd41c9632fe7120db63017..69d9e67fbdb551b1288db504390316fd22b5097e 100755 (executable)
--- a/cli.c
+++ b/cli.c
@@ -46,8 +46,7 @@ void ast_cli(int fd, char *fmt, ...)
        free(stuff);
 }
 
-ast_mutex_t clilock = AST_MUTEX_INITIALIZER;
-
+AST_MUTEX_DEFINE_STATIC(clilock);
 
 struct ast_cli_entry *helpers = NULL;
 
@@ -157,7 +156,7 @@ static int handle_unload(int fd, int argc, char *argv[])
 #define MODLIST_FORMAT  "%-25s %-40.40s %-10d\n"
 #define MODLIST_FORMAT2 "%-25s %-40.40s %-10s\n"
 
-static ast_mutex_t climodentrylock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(climodentrylock);
 static int climodentryfd = -1;
 
 static int modlist_modentry(char *module, char *description, int usecnt)
index 4b66342622ba6bb919b7101f339b441d3d8ac469..84d23a146cd86a8abdc733c7e3460ec44d48b8d8 100755 (executable)
@@ -27,7 +27,7 @@
 
 #define BUFFER_SIZE   8096     /* size for the translation buffers */
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt = 0;
 
 static char *tdesc = "A-law and Mulaw direct Coder/Decoder";
index 6ca656a2328e1983fceb27669b0d5eb87c25f72f..9aa0304c715859344507af8086999ddb9986321f 100755 (executable)
@@ -28,7 +28,7 @@
 
 #define BUFFER_SIZE   8096     /* size for the translation buffers */
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt = 0;
 
 static char *tdesc = "Adaptive Differential PCM Coder/Decoder";
index 08baba4bd4c181d56bf4b91d49dfb206e258499a..5574cd451fbee16ac061c856800ff0a685b87751 100755 (executable)
@@ -26,7 +26,7 @@
 
 #define BUFFER_SIZE   8096     /* size for the translation buffers */
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt = 0;
 
 static char *tdesc = "A-law Coder/Decoder";
index 0d793897f8b7c577c9ce181099874919665f0e26..3692b56abddbdf0e27b952ba2a096e037aff7b87 100755 (executable)
@@ -56,7 +56,7 @@
 #include "slin_g723_ex.h"
 #include "g723_slin_ex.h"
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt=0;
 
 #ifdef ANNEX_B
index ac32678cabc8dd85c9ea5606a8546d686290e498..3dad026ddc90765fd551c1b1f206ec06a1c3a117 100755 (executable)
@@ -29,7 +29,7 @@
 #define BUFFER_SIZE   8096     /* size for the translation buffers */
 #define BUF_SHIFT      5
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt = 0;
 
 static char *tdesc = "ITU G.726-32kbps G726 Transcoder";
index f0efe1a825326d2a70c251981762a932ca9f5e6d..8e37c70ec53621abfa1a5594b730ae79eba17b36 100755 (executable)
@@ -39,7 +39,7 @@
 #include "slin_gsm_ex.h"
 #include "gsm_slin_ex.h"
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt=0;
 
 static char *tdesc = "GSM/PCM16 (signed linear) Codec Translator";
index d3497ba41c2b0e370a736bf1aedf7a70adde621e..947921249214a54666207f6d97d9379eea2d18a1 100755 (executable)
@@ -35,7 +35,7 @@
 
 #define USE_ILBC_ENHANCER      0
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt=0;
 
 static char *tdesc = "iLBC/PCM16 (signed linear) Codec Translator";
index ffd1ddc23d8360c820a0a90e54ebfbc08c813bb1..2b054710a5092ce040e8275276e6cdf2e9a5e06f 100755 (executable)
@@ -43,7 +43,7 @@
 
 #define LPC10_BYTES_IN_COMPRESSED_FRAME (LPC10_BITS_IN_COMPRESSED_FRAME + 7)/8
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt=0;
 
 static char *tdesc = "LPC10 2.4kbps (signed linear) Voice Coder";
index ae731fafa350ed65eb9715bad7bca124e29006d0..4bd5155dde7b15e989d12a7fe4d2af3a0582233f 100755 (executable)
@@ -37,7 +37,7 @@
 #include "slin_speex_ex.h"
 #include "speex_slin_ex.h"
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt=0;
 
 static char *tdesc = "Speex/PCM16 (signed linear) Codec Translator";
index 41101897d36dde26e19b7ef421287929141138d2..55ff81e1cce40f0446fdb4a89eda045ceb746261 100755 (executable)
@@ -26,7 +26,7 @@
 
 #define BUFFER_SIZE   8096     /* size for the translation buffers */
 
-static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(localuser_lock);
 static int localusecnt = 0;
 
 static char *tdesc = "Mu-law Coder/Decoder";
diff --git a/db.c b/db.c
index 372d22df0a4ef5386d433e82c1913ae363bb29e0..4842b71de9a003471ebdc2474ec2223bd9caf4d0 100755 (executable)
--- a/db.c
+++ b/db.c
@@ -38,7 +38,7 @@
 #include "astconf.h"
 
 static DB *astdb;
-static ast_mutex_t dblock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(dblock);
 
 static int dbinit(void) 
 {
diff --git a/dns.c b/dns.c
index 0ec7d6d51a75830dfb9790fdb0e9358c95036d8f..dbd918d6f216ee86076dc74edb07e42dd0521539 100755 (executable)
--- a/dns.c
+++ b/dns.c
@@ -154,7 +154,7 @@ static int dns_parse_answer(void *context,
 #if defined(res_ninit)
 #define HAS_RES_NINIT
 #else
-static ast_mutex_t res_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(res_lock);
 #if 0
 #warning "Warning, res_ninit is missing...  Could have reentrancy issues"
 #endif
diff --git a/enum.c b/enum.c
index a4ffe3fa357b8d35b746cf3b564a95240de46937..b746d45ab40eece493e5ca52a069adb757a65180 100755 (executable)
--- a/enum.c
+++ b/enum.c
@@ -53,7 +53,7 @@ static struct enum_search {
 
 static int enumver = 0;
 
-static ast_mutex_t enumlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(enumlock);
 
 struct naptr {
        unsigned short order;
diff --git a/file.c b/file.c
index ad80d5272bf3ebb7150bbb2c17381b82f2e00da3..1e896e8cd1ecf0186018f73045d73ec082ba665d 100755 (executable)
--- a/file.c
+++ b/file.c
@@ -79,7 +79,7 @@ struct ast_filestream {
        struct ast_channel *owner;
 };
 
-static ast_mutex_t formatlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(formatlock);
 
 static struct ast_format *formats = NULL;
 
index 1b610f1f0c8279531a4ab6effc577a36e64bd456..cf5228f8beec7b9d26e1818db1143f4256811fcb 100755 (executable)
@@ -42,7 +42,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t g723_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(g723_lock);
 static int glistcnt = 0;
 
 static char *name = "g723sf";
index c12b6275f7f1440c1bd8dc3fac2947dcf1e610e9..acb44c728bb44e6ca20fcce37079bc78c47d32b8 100755 (executable)
@@ -59,7 +59,7 @@ struct ast_filestream {
        unsigned char g726[FRAME_TIME * 5];     /* G.726 encoded voice */
 };
 
-static ast_mutex_t g726_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(g726_lock);
 static int glistcnt = 0;
 
 static char *desc = "Raw G.726 (16/24/32/40kbps) data";
index 68dde216fd49f924156fa0ca20cce1e4df9082fd..9f7531d5f244186d7c7e9a4534fa6f222c10b5ad 100755 (executable)
@@ -49,7 +49,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t g729_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(g729_lock);
 static int glistcnt = 0;
 
 static char *name = "g729";
index d58039e6d26275960cdb859dd99156c3ee9f7a81..619786e56fb698849002f4d753330c8cf10e5f16 100755 (executable)
@@ -58,7 +58,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t gsm_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(gsm_lock);
 static int glistcnt = 0;
 
 static char *name = "gsm";
index 7a8866666c7966e715d4ebf28f8516fbafec3e99..dd8a21454c14b67dccceb185640028986fc61cd8 100755 (executable)
@@ -50,7 +50,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t h263_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(h263_lock);
 static int glistcnt = 0;
 
 static char *name = "h263";
index d4863c7209ecd81f78d99e8d8094e5e2be54d27e..0d50900d90da0e19d0601f9d4d12398e1e45cc47 100755 (executable)
@@ -51,7 +51,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t ilbc_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(ilbc_lock);
 static int glistcnt = 0;
 
 static char *name = "iLBC";
index bc548992ba5c761ef67a4dec72b49740f42f666f..2ad29471ce7779303ba803bff19def1382d256c2 100755 (executable)
@@ -47,7 +47,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t pcm_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(pcm_lock);
 static int glistcnt = 0;
 
 static char *name = "pcm";
index db6b0c3d039789beafc1b0ffa1910ceddfa579a6..55911d8f39e7d06f47c46e706999170eaaaaa89d 100755 (executable)
@@ -54,7 +54,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t pcm_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(pcm_lock);
 static int glistcnt = 0;
 
 static char *name = "alaw";
index 20021fb733d0de2dd703c78ab5316534a493d173..095332a515053ea1bafa72f7cb13c98fcb7eda74 100755 (executable)
@@ -51,7 +51,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t vox_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(vox_lock);
 static int glistcnt = 0;
 
 static char *name = "vox";
index 52f1508abd435a4bc2615e871cb053d64df56ec4..804c38c4ebf1a352a139ec941c34bebbb2865cd0 100755 (executable)
@@ -53,7 +53,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t wav_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(wav_lock);
 static int glistcnt = 0;
 
 static char *name = "wav";
index 6c988bdb8ed8e5b09b7ca1ea7aa20b02b62c2ea8..a9f9df838a0ea0f3fcc3da33a29d4dba93f6b609 100755 (executable)
@@ -63,7 +63,7 @@ struct ast_filestream {
 };
 
 
-static ast_mutex_t wav_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(wav_lock);
 static int glistcnt = 0;
 
 static char *name = "wav49";
diff --git a/frame.c b/frame.c
index 1e80f0b0d1a68f4a620db9f6b13c74eaf00acc97..f8905ca959d023192bb2c87483138e096c9f2f8b 100755 (executable)
--- a/frame.c
+++ b/frame.c
@@ -29,7 +29,7 @@
 #ifdef TRACE_FRAMES
 static int headers = 0;
 static struct ast_frame *headerlist = NULL;
-static ast_mutex_t framelock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(framelock);
 #endif
 
 #define SMOOTHER_SIZE 8000
diff --git a/image.c b/image.c
index 01590436ce7e54ea2404b2c80203ccf2532f8d92..f0c21035f9d4664294e637c260066b88f7acd900 100755 (executable)
--- a/image.c
+++ b/image.c
@@ -33,7 +33,7 @@
 #include "astconf.h"
 
 static struct ast_imager *list;
-static ast_mutex_t listlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(listlock);
 
 int ast_image_register(struct ast_imager *img)
 {
index 01067d5f07ee4dcba6e75a7d6a15cd0185f1bf0c..b752b3adb781808be53993ce1fa1120e3269be85 100755 (executable)
@@ -16,9 +16,6 @@ struct name {                                                         \
        ast_mutex_t lock;                                               \
 }
 
-#define AST_LIST_HEAD_INITIALIZER(head)                                        \
-       { NULL, AST_MUTEX_INITIALIZER }
-       
 #define AST_LIST_HEAD_SET(head,entry) do {                             \
        (head)->first=(entry);                                          \
        ast_pthread_mutex_init(&(head)->lock,NULL);                             \
index c40a1ddcf8793720603cf94768580492c83316de..4c82928e2a0f09a1ca4f95db7b78df1d1d2c6210 100755 (executable)
                                                                                                                 0x20 } }
 #endif
 
+#ifdef __FreeBSD__
+#ifdef __GNUC__
+#define AST_MUTEX_INIT_W_CONSTRUCTORS
+#else
+#define AST_MUTEX_INIT_ON_FIRST_USE
+#endif
+#endif /* __FreeBSD__ */
+
 #ifdef DEBUG_THREADS
 
 #ifdef THREAD_CRASH
 
 /* From now on, Asterisk REQUIRES Recursive (not error checking) mutexes
    and will not run without them. */
+#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_INIT_VAULE      { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, NULL, 0, NULL, 0 }
+#else
+#define AST_MUTEX_INIT_VAULE      { PTHREAD_MUTEX_INITIALIZER, NULL, 0, NULL, 0 }
+#endif
 
-#define AST_MUTEX_INITIALIZER      { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, NULL, 0, NULL, 0 }
+#ifdef PTHREAD_MUTEX_RECURSIVE_NP
 #define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE_NP
+#else
+#define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE
+#endif
 
 struct ast_mutex_info {
        pthread_mutex_t mutex;
@@ -55,38 +71,53 @@ struct ast_mutex_info {
 
 typedef struct ast_mutex_info ast_mutex_t;
 
-static inline int ast_mutex_init(ast_mutex_t *t) {
-       static pthread_mutexattr_t  attr;
-       static int  init = 1;
-       int res;
-       extern int  pthread_mutexattr_setkind_np(pthread_mutexattr_t *, int);
-
-       if (init) {
-               pthread_mutexattr_init(&attr);
-               pthread_mutexattr_setkind_np(&attr, AST_MUTEX_KIND);
-               init = 0;
-       }
-       res = pthread_mutex_init(&t->mutex, &attr);
+static inline int ast_pthread_mutex_init(ast_mutex_t *t, pthread_mutexattr_t *attr) 
+{
        t->file = NULL;
        t->lineno = 0;
        t->func = 0;
        t->thread  = 0;
-       return res;
+       return pthread_mutex_init(&t->mutex, attr);
 }
 
-static inline int ast_pthread_mutex_init(ast_mutex_t *t, pthread_mutexattr_t *attr) 
+static inline int ast_mutex_init(ast_mutex_t *t)
 {
-       int res;
-       res = pthread_mutex_init(&t->mutex, attr);
-       t->file = NULL;
-       t->lineno = 0;
-       t->func = 0;
-       t->thread  = 0;
-       return res;
+       static pthread_mutexattr_t  attr;
+        pthread_mutexattr_init(&attr);
+       pthread_mutexattr_settype(&attr, AST_MUTEX_KIND);
+       return ast_pthread_mutex_init(t, &attr);
 }
 
-static inline int __ast_pthread_mutex_lock(char *filename, int lineno, char *func, ast_mutex_t *t) {
+#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
+/* if AST_MUTEX_INIT_W_CONSTRUCTORS is defined, use file scope
+ constrictors/destructors to create/destroy mutexes.  */ 
+#define __AST_MUTEX_DEFINE(scope,mutex) \
+       scope ast_mutex_t mutex = AST_MUTEX_INIT_VAULE; \
+static void  __attribute__ ((constructor)) init_##mutex(void) \
+{ \
+       ast_mutex_init(&mutex); \
+} \
+static void  __attribute__ ((destructor)) fini_##mutex(void) \
+{ \
+       ast_mutex_destroy(&mutex); \
+}
+#elif defined(AST_MUTEX_INIT_ON_FIRST_USE) || !defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
+/* if AST_MUTEX_INIT_ON_FIRST_USE is defined, mutexes are created on
+ first use.  The performance impact on FreeBSD should be small since
+ the pthreads library does this itself to initialize errror checking
+ (defaulty type) mutexes.  If nither is defined, the pthreads librariy
+ does the initialization itself on first use. */ 
+#define __AST_MUTEX_DEFINE(scope,mutex) \
+       scope ast_mutex_t mutex = AST_MUTEX_INIT_VAULE
+#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
+
+static inline int __ast_pthread_mutex_lock(char *filename, int lineno, char *func, ast_mutex_t *t)
+{
        int res;
+#ifdef AST_MUTEX_INIT_ON_FIRST_USE
+        if(*t->mutex == (ast_mutex_t)AST_MUTEX_KIND)
+               ast_mutex_init(t->mutex);
+#endif
        res = pthread_mutex_lock(&t->mutex);
        if (!res) {
                t->file = filename;
@@ -107,6 +138,10 @@ static inline int __ast_pthread_mutex_lock(char *filename, int lineno, char *fun
 
 static inline int __ast_pthread_mutex_trylock(char *filename, int lineno, char *func, ast_mutex_t *t) {
        int res;
+#ifdef AST_MUTEX_INIT_ON_FIRST_USE
+        if(*t->mutex == (ast_mutex_t)AST_MUTEX_KIND)
+               ast_mutex_init(t->mutex);
+#endif
        res = pthread_mutex_trylock(&t->mutex);
        if (!res) {
                t->file = filename;
@@ -166,26 +201,83 @@ static inline int __ast_pthread_mutex_destroy(char *filename, int lineno, char *
 
 /* From now on, Asterisk REQUIRES Recursive (not error checking) mutexes
    and will not run without them. */
-#define AST_MUTEX_INITIALIZER      PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_INIT_VAULE      PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#else
+#define AST_MUTEX_INIT_VAULE      PTHREAD_MUTEX_INITIALIZER
+#endif
+
+#ifdef PTHREAD_MUTEX_RECURSIVE_NP
 #define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE_NP
+#else
+#define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE
+#endif
 
 typedef pthread_mutex_t ast_mutex_t;
 
-#define ast_mutex_lock(t) pthread_mutex_lock(t)
-#define ast_mutex_unlock(t) pthread_mutex_unlock(t)
-#define ast_mutex_trylock(t) pthread_mutex_trylock(t)
-static inline int ast_mutex_init(ast_mutex_t *t)
+static inline int ast_mutex_init(ast_mutex_t *pmutex)
 {
        pthread_mutexattr_t attr;
        pthread_mutexattr_init(&attr);
        pthread_mutexattr_settype(&attr, AST_MUTEX_KIND);
-       return pthread_mutex_init(t, &attr);
+       return pthread_mutex_init(pmutex, &attr);
+}
+#define ast_pthread_mutex_init(pmutex,a) pthread_mutex_init(pmutex,a)
+#define ast_mutex_unlock(pmutex) pthread_mutex_unlock(pmutex)
+#define ast_mutex_destroy(pmutex) pthread_mutex_destroy(pmutex)
+
+#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
+/* if AST_MUTEX_INIT_W_CONSTRUCTORS is defined, use file scope
+ constrictors/destructors to create/destroy mutexes.  */ 
+#define __AST_MUTEX_DEFINE(scope,mutex) \
+       scope ast_mutex_t mutex = AST_MUTEX_INIT_VAULE; \
+static void  __attribute__ ((constructor)) init_##mutex(void) \
+{ \
+       ast_mutex_init(&mutex); \
+} \
+static void  __attribute__ ((destructor)) fini_##mutex(void) \
+{ \
+       ast_mutex_destroy(&mutex); \
+}
+
+#define ast_mutex_lock(pmutex) pthread_mutex_lock(pmutex)
+#define ast_mutex_trylock(pmutex) pthread_mutex_trylock(pmutex)
+
+#elif defined(AST_MUTEX_INIT_ON_FIRST_USE)
+/* if AST_MUTEX_INIT_ON_FIRST_USE is defined, mutexes are created on
+ first use.  The performance impact on FreeBSD should be small since
+ the pthreads library does this itself to initialize errror checking
+ (defaulty type) mutexes.*/ 
+#define __AST_MUTEX_DEFINE(scope,mutex) \
+       scope ast_mutex_t mutex = AST_MUTEX_INIT_VAULE
+
+static inline int ast_mutex_lock(ast_mutex_t *pmutex)
+{
+  if(*pmutex == (ast_mutex_t)AST_MUTEX_KIND)
+    ast_mutex_init(pmutex);
+  return pthread_mutex_lock(pmutex);
+}
+static inline int ast_mutex_trylock(ast_mutex_t *pmutex)
+{
+  if(*pmutex == (ast_mutex_t)AST_MUTEX_KIND)
+    ast_mutex_init(pmutex);
+  return pthread_mutex_trylock(pmutex);
 }
-#define ast_pthread_mutex_init(t,a) pthread_mutex_init(t,a)
-#define ast_mutex_destroy(t) pthread_mutex_destroy(t)
+#else
+/* By default, use static initialization of mutexes.*/ 
+#define __AST_MUTEX_DEFINE(scope,mutex) \
+       scope ast_mutex_t mutex = AST_MUTEX_INIT_VAULE
+#define ast_mutex_lock(pmutex) pthread_mutex_lock(pmutex)
+#define ast_mutex_trylock(pmutex) pthread_mutex_trylock(pmutex)
+#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
 
 #endif /* DEBUG_THREADS */
 
+#define AST_MUTEX_DEFINE_STATIC(mutex) __AST_MUTEX_DEFINE(static,mutex)
+#define AST_MUTEX_DEFINE_EXPORTED(mutex) __AST_MUTEX_DEFINE(/**/,mutex)
+
+
+#define AST_MUTEX_INITIALIZER __use_AST_MUTEX_DEFINE_STATIC_rather_than_AST_MUTEX_INITIALIZER__
 #define gethostbyname __gethostbyname__is__not__reentrant__use__ast_gethostbyname__instead__
 
 #endif
index b7a5184e8fc5bd5e2f9dc531cea71ff517457e24..aba72980d7293395fb64ef34650328077d14846f 100755 (executable)
@@ -152,7 +152,7 @@ void ast_unregister_atexit(void (*func)(void));
                                                                struct localuser *next; \
                                                        }
 
-#define LOCAL_USER_DECL static ast_mutex_t localuser_lock = AST_MUTEX_INITIALIZER; \
+#define LOCAL_USER_DECL AST_MUTEX_DEFINE_STATIC(localuser_lock); \
                                                static struct localuser *localusers = NULL; \
                                                static int localusecnt = 0;
 
index 1f8b555558a6d73ab5c7def81e840baf9bdb302b..25b98a0ca5953c1bd2d876d6e514e8d0425e4567 100755 (executable)
@@ -229,7 +229,7 @@ static struct tone_zone *current_tonezone;
 
 /* Protect the tone_zones list (highly unlikely that two things would change
  * it at the same time, but still! */
-ast_mutex_t tzlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_EXPORTED(tzlock);
 
 /* Set global indication country */
 int ast_set_indication_country(const char *country)
index 7451fd46643a91ca4384fbcb9b25a2415df68b5b..b05cdf7668bcb88f871139471a29b4132ff72381 100755 (executable)
--- a/loader.c
+++ b/loader.c
@@ -98,8 +98,8 @@ static struct loadupdate {
        struct loadupdate *next;
 } *updaters = NULL;
 
-static ast_mutex_t modlock = AST_MUTEX_INITIALIZER;
-static ast_mutex_t reloadlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(modlock);
+AST_MUTEX_DEFINE_STATIC(reloadlock);
 
 static struct module *module_list=NULL;
 
index 331ca669f2d484d1973aa312017f9d734c9b05bd..2b7f9f2c680b3876a6498de1182bc62e176c3646 100755 (executable)
--- a/logger.c
+++ b/logger.c
@@ -49,8 +49,8 @@ static int syslog_level_map[] = {
 #define MAX_MSG_QUEUE 200
 
 static char dateformat[256] = "%b %e %T";              /* Original Asterisk Format */
-static ast_mutex_t msglist_lock = AST_MUTEX_INITIALIZER;
-static ast_mutex_t loglock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(msglist_lock);
+AST_MUTEX_DEFINE_STATIC(loglock);
 static int pending_logger_reload = 0;
 
 static struct msglist {
@@ -228,7 +228,7 @@ static void init_logger_chain(void)
 }
 
 static FILE *qlog = NULL;
-static ast_mutex_t qloglock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(qloglock);
 
 void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...)
 {
index 9806da78a7008f418cc67e3d581807c14a7a8fcf..f5055d124478455484fb6f4d40d6c2bef407ab9c 100755 (executable)
--- a/manager.c
+++ b/manager.c
@@ -59,7 +59,7 @@ static int enabled = 0;
 static int portno = DEFAULT_MANAGER_PORT;
 static int asock = -1;
 static pthread_t t;
-static ast_mutex_t sessionlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(sessionlock);
 static int block_sockets = 0;
 
 static struct permalias {
@@ -78,7 +78,7 @@ static struct permalias {
 
 static struct mansession *sessions = NULL;
 static struct manager_action *first_action = NULL;
-static ast_mutex_t actionlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(actionlock);
 
 int ast_carefulwrite(int fd, char *s, int len, int timeoutms) 
 {
diff --git a/pbx.c b/pbx.c
index 02acc3ded447395ef05ad629f10fbbcb0985b9ec..02c006b69d18a332348bf809d5122691d39a8338 100755 (executable)
--- a/pbx.c
+++ b/pbx.c
@@ -176,7 +176,7 @@ int pbx_builtin_setvar(struct ast_channel *, void *);
 void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
 char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
 
-static struct varshead globals = AST_LIST_HEAD_INITIALIZER(varshead);
+static struct varshead globals;
 
 static struct pbx_builtin {
        char name[AST_MAX_APP];
@@ -362,18 +362,18 @@ static struct pbx_builtin {
 };
 
 /* Lock for the application list */
-static ast_mutex_t applock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(applock);
 static struct ast_context *contexts = NULL;
 /* Lock for the ast_context list */
-static ast_mutex_t conlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(conlock);
 static struct ast_app *apps = NULL;
 
 /* Lock for switches */
-static ast_mutex_t switchlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(switchlock);
 struct ast_switch *switches = NULL;
 
 /* Lock for extension state notifys */
-static ast_mutex_t hintlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(hintlock);
 static int stateid = 1;
 struct ast_hint *hints = NULL;
 struct ast_state_cb *statecbs = NULL;
@@ -4654,6 +4654,7 @@ int load_pbx(void)
                ast_verbose( "Asterisk PBX Core Initializing\n");
                ast_verbose( "Registering builtin applications:\n");
        }
+        AST_LIST_HEAD_INIT(&globals);
        ast_cli_register(&show_applications_cli);
        ast_cli_register(&show_application_cli);
        ast_cli_register(&show_dialplan_cli);
index 2d47c4db183d634a6ee0e375c076a5e1e8de3ff1..0c0cbd1b64a0ce58b53cb6e55786a21bac3b62f0 100755 (executable)
@@ -42,7 +42,7 @@ static char *registrar = "pbx_config";
 static int static_config = 0;
 static int write_protect_config = 1;
 
-static ast_mutex_t save_dialplan_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(save_dialplan_lock);
 
 static struct ast_context *local_contexts = NULL;
 
index 86755d245baed166f0ba9f74639263685a0ffe2f..fa2ac21acf013b8cbe989490b0e4cfad64d99f6c 100755 (executable)
@@ -41,7 +41,7 @@
 #include "../asterisk.h"
 #include "../astconf.h"
 
-static ast_mutex_t verb_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(verb_lock);
 
 static pthread_t console_thread;
 
index 2a2e5cb8b9d75788158194b2271c5b38472f5ed4..e0cb6233cd4619c8678c14aa790d56addeaf4869 100755 (executable)
@@ -59,7 +59,7 @@
 static char base64[64];
 static char b2a[256];
 
-static ast_mutex_t keylock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(keylock);
 
 #define KEY_NEEDS_PASSCODE (1 << 16)
 
index 2f028ca935b7743580b190eab6db384f555355c7..43b6d728e47a5f29dd79121e22738679803cbe32 100755 (executable)
@@ -23,7 +23,7 @@
 
 #define AST_MONITOR_DIR        AST_SPOOL_DIR "/monitor"
 
-static ast_mutex_t monitorlock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(monitorlock);
 
 static unsigned long seq = 0;
 
index d6bc6c760e54e1a4ee8cceeab884698cd87c10a5..27519a7ea6143f1f8d1c3310d728d5d8f576d99f 100755 (executable)
@@ -99,7 +99,7 @@ struct mohdata {
 
 static struct mohclass *mohclasses;
 
-static ast_mutex_t moh_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(moh_lock);
 
 #define LOCAL_MPG_123 "/usr/local/bin/mpg123"
 #define MPG_123 "/usr/bin/mpg123"
index e63f490cb2d376a16355dcc6caf629e5658bdbcc..29db04136d21db5bbbb17256729ea4e82666e459 100755 (executable)
@@ -84,7 +84,7 @@ struct parkeduser {
 
 static struct parkeduser *parkinglot;
 
-static ast_mutex_t parking_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(parking_lock);
 
 static pthread_t parking_thread;
 
index f0b67e67ee4247fe763207835ecc22e0b75b2bcd..c0058300e0f768db5d6ad1fea57437f12570c27b 100755 (executable)
@@ -184,10 +184,10 @@ static struct state *     gmtptr      = NULL;
 
 static int             gmt_is_set;
 #ifdef _THREAD_SAFE
-static ast_mutex_t             lcl_mutex   = AST_MUTEX_INITIALIZER;
-static ast_mutex_t             tzset_mutex     = AST_MUTEX_INITIALIZER;
-static ast_mutex_t             tzsetwall_mutex = AST_MUTEX_INITIALIZER;
-static ast_mutex_t             gmt_mutex   = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(lcl_mutex);
+AST_MUTEX_DEFINE_STATIC(tzset_mutex);
+AST_MUTEX_DEFINE_STATIC(tzsetwall_mutex);
+AST_MUTEX_DEFINE_STATIC(gmt_mutex);
 #endif
 
 /*
index 1a9529542c1b762efc9f7b78bc3d04509c7dd060..56f0e5e9988ac36c636dcf39390e8bfd091c6348 100755 (executable)
@@ -34,7 +34,7 @@
 /* This could all be done more efficiently *IF* we chained packets together
    by default, but it would also complicate virtually every application. */
    
-static ast_mutex_t list_lock = AST_MUTEX_INITIALIZER;
+AST_MUTEX_DEFINE_STATIC(list_lock);
 static struct ast_translator *list = NULL;
 
 struct ast_translator_dir {
diff --git a/utils.c b/utils.c
index a1ecb139bd3a5c9a084dde979ea01fa1410f7f02..37ffcb0bd2ec13d1197acbd6605005ed489cc1ff 100755 (executable)
--- a/utils.c
+++ b/utils.c
 #define ERANGE 34
 #undef gethostbyname
 
+AST_MUTEX_DEFINE_STATIC(__mutex);
+
 int gethostbyname_r (const char *name, struct hostent *ret, char *buf,
                        size_t buflen, struct hostent **result, 
                        int *h_errnop) 
 {
        int hsave;
        struct hostent *ph;
-       static ast_mutex_t __mutex = AST_MUTEX_INITIALIZER;
        ast_mutex_lock(&__mutex); /* begin critical area */
        hsave = h_errno;