]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
make the counting of ingress, outgress, and total frames thread-safe
authorRussell Bryant <russell@russellbryant.com>
Mon, 31 Jul 2006 17:27:42 +0000 (17:27 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 31 Jul 2006 17:27:42 +0000 (17:27 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@38587 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/iax2-parser.c

index b8d979cda7fe89ee53ad6f2a50ba08fbb4034a40..67341fc5e609f5c1f946df08a50bb7f5c945de50 100644 (file)
@@ -39,6 +39,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/frame.h"
 #include "asterisk/utils.h"
 #include "asterisk/unaligned.h"
+#include "asterisk/lock.h"
+
 #include "iax2.h"
 #include "iax2-parser.h"
 #include "iax2-provision.h"
@@ -929,11 +931,11 @@ struct iax_frame *iax_frame_new(int direction, int datalen)
        if (fr) {
                fr->direction = direction;
                fr->retrans = -1;
-               frames++;
+               ast_atomic_fetchadd_int(&frames, 1);
                if (fr->direction == DIRECTION_INGRESS)
-                       iframes++;
+                       ast_atomic_fetchadd_int(&iframes, 1);
                else
-                       oframes++;
+                       ast_atomic_fetchadd_int(&oframes, 1);
        }
        return fr;
 }
@@ -942,16 +944,16 @@ void iax_frame_free(struct iax_frame *fr)
 {
        /* Note: does not remove from scheduler! */
        if (fr->direction == DIRECTION_INGRESS)
-               iframes--;
+               ast_atomic_fetchadd_int(&iframes, -1);
        else if (fr->direction == DIRECTION_OUTGRESS)
-               oframes--;
+               ast_atomic_fetchadd_int(&oframes, -1);
        else {
                errorf("Attempt to double free frame detected\n");
                return;
        }
        fr->direction = 0;
        free(fr);
-       frames--;
+       ast_atomic_fetchadd_int(&frames, -1);
 }
 
 int iax_get_frames(void) { return frames; }