]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 375728 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Sun, 4 Nov 2012 00:26:10 +0000 (00:26 +0000)
committerAutomerge script <automerge@asterisk.org>
Sun, 4 Nov 2012 00:26:10 +0000 (00:26 +0000)
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

index 915bbd97dfe23addaef6692144cd37c9c72a8244..97d13f933cb230109aa41a76cb5082ec093d678a 100644 (file)
@@ -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)