From 7b42069837d9c42e6e9762816586b6c4f9ad3b92 Mon Sep 17 00:00:00 2001 From: Automerge script Date: Sun, 4 Nov 2012 00:26:10 +0000 Subject: [PATCH] Merged revisions 375728 via svnmerge from file:///srv/subversion/repos/asterisk/branches/10 ................ r375728 | mjordan | 2012-11-03 18:51:43 -0500 (Sat, 03 Nov 2012) | 16 lines Prevent multiple CDR batches from conflicting when scheduling the CDR write The Asterisk Test Suite caught an error condition where a scheduled CDR batch write can be deleted twice if two channels attempt to post their CDRs at the same time. The batch CDR mutex is locked while the CDRs are appended to the current batch list; however, it is unlocked prior to actually scheduling the CDR write. As such, two threads can attempt to remove the currently scheduled batch write at the same time, resulting in an assertion error. This patch extends the time that the mutex is locked to encompass actually scheduling the write. This prevents two threads from unscheduling the currently scheduled write at the same time. ........ Merged revisions 375727 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@375755 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/cdr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main/cdr.c b/main/cdr.c index 915bbd97df..97d13f933c 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -1364,11 +1364,13 @@ void ast_cdr_detach(struct ast_cdr *cdr) newtail->cdr = cdr; batch->tail = newtail; curr = batch->size++; - ast_mutex_unlock(&cdr_batch_lock); /* if we have enough stuff to post, then do it */ - if (curr >= (batchsize - 1)) + if (curr >= (batchsize - 1)) { submit_unscheduled_batch(); + } + + ast_mutex_unlock(&cdr_batch_lock); } static void *do_cdr(void *data) -- 2.47.2