From 32126398efc396889bdfff7363bbe910768bbb4f Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Wed, 6 Oct 2004 04:30:16 +0000 Subject: [PATCH] Locking updates for debug mode, fix SIP MWI (bug #2582) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3918 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 4 ++-- include/asterisk/lock.h | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 3b65a3d7fb..75f9c60424 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -3943,8 +3943,8 @@ static int transmit_notify_with_mwi(struct sip_pvt *p, int newmsgs, int oldmsgs) add_header(&req, "Event", "message-summary"); add_header(&req, "Content-Type", notifymime); - snprintf(tmp, sizeof(tmp), "Messages-Waiting: %s\n", newmsgs ? "yes" : "no"); - snprintf(tmp2, sizeof(tmp2), "Voicemail: %d/%d\n", newmsgs, oldmsgs); + snprintf(tmp, sizeof(tmp), "Messages-Waiting: %s\r\n", newmsgs ? "yes" : "no"); + snprintf(tmp2, sizeof(tmp2), "Voicemail: %d/%d\r\n", newmsgs, oldmsgs); snprintf(clen, sizeof(clen), "%d", (int)(strlen(tmp) + strlen(tmp2))); add_header(&req, "Content-Length", clen); add_line(&req, tmp); diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index 059bc89c6c..7d2807d858 100755 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -3,9 +3,9 @@ * * General Asterisk channel definitions. * - * Copyright (C) 1999, Mark Spencer + * Copyright (C) 1999-2004, Digium, Inc. * - * Mark Spencer + * Mark Spencer * * This program is free software, distributed under the terms of * the GNU General Public License @@ -65,6 +65,7 @@ struct ast_mutex_info { pthread_mutex_t mutex; char *file; int lineno; + int reentrancy; char *func; pthread_t thread; }; @@ -91,6 +92,7 @@ static inline int __ast_pthread_mutex_init_attr(char *filename, int lineno, char t->lineno = lineno; t->func = func; t->thread = 0; + t->reentrancy = 0; return pthread_mutex_init(&t->mutex, attr); } @@ -210,6 +212,7 @@ static inline int __ast_pthread_mutex_lock(char *filename, int lineno, char *fun res = pthread_mutex_lock(&t->mutex); #endif /* DETECT_DEADLOCKS */ if (!res) { + t->reentrancy++; t->file = filename; t->lineno = lineno; t->func = func; @@ -241,6 +244,7 @@ static inline int __ast_pthread_mutex_trylock(char *filename, int lineno, char * #endif /* definded(AST_MUTEX_INIT_W_CONSTRUCTORS) || defined(AST_MUTEX_INIT_ON_FIRST_USE) */ res = pthread_mutex_trylock(&t->mutex); if (!res) { + t->reentrancy++; t->file = filename; t->lineno = lineno; t->func = func; @@ -260,11 +264,18 @@ static inline int __ast_pthread_mutex_unlock(char *filename, int lineno, char *f filename, lineno, func, mutex_name); } #endif - /* Assumes lock is actually held */ - t->file = NULL; - t->lineno = 0; - t->func = NULL; - t->thread = 0; + --t->reentrancy; + if (t->reentrancy < 0) { + fprintf(stderr, "%s line %d (%s): Freed more times than we've locked!\n", + filename, lineno, func, mutex_name); + t->reentrancy = 0; + } + if (!t->rentrancy) { + t->file = NULL; + t->lineno = 0; + t->func = NULL; + t->thread = 0; + } res = pthread_mutex_unlock(&t->mutex); if (res) { fprintf(stderr, "%s line %d (%s): Error releasing mutex: %s\n",