- use symbolic constants and macros to play with the debug flag
authorLuigi Rizzo <rizzo@icir.org>
Fri, 21 Apr 2006 14:49:21 +0000 (14:49 +0000)
committerLuigi Rizzo <rizzo@icir.org>
Fri, 21 Apr 2006 14:49:21 +0000 (14:49 +0000)
  on the frame counters. Document it in the header file.
- provide a single exit point for a function;
- mark XXX some unclear parts of the code.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@21933 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dumpchan.c
channel.c
cli.c
include/asterisk/channel.h

index aa88546..5124cc2 100644 (file)
@@ -114,8 +114,8 @@ static int ast_serialize_showchan(struct ast_channel *c, char *buf, size_t size)
                         c->nativeformats,
                         c->writeformat,
                         c->readformat,
-                        c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "",
-                        c->fout & 0x7fffffff, (c->fout & 0x80000000) ? " (DEBUGGED)" : "", (long)c->whentohangup,
+                        c->fds[0], c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "",
+                        c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", (long)c->whentohangup,
                         hour,
                         min,
                         sec,
index 6a2d4f6..80b1109 100644 (file)
--- a/channel.c
+++ b/channel.c
@@ -2049,12 +2049,9 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
        }
 
        /* High bit prints debugging */
-       if (chan->fin & 0x80000000)
+       if (chan->fin & DEBUGCHAN_FLAG)
                ast_frame_dump(chan->name, f, "<<");
-       if ((chan->fin & 0x7fffffff) == 0x7fffffff)
-               chan->fin &= 0x80000000;
-       else
-               chan->fin++;
+       chan->fin = FRAMECOUNT_INC(chan->fin);
 
 done:
        ast_mutex_unlock(&chan->lock);
@@ -2272,30 +2269,28 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 
        /* Stop if we're a zombie or need a soft hangup */
        ast_channel_lock(chan);
-       if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))  {
-               ast_channel_unlock(chan);
-               return -1;
-       }
+       if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
+               goto done;
+
        /* Handle any pending masquerades */
        if (chan->masq && ast_do_masquerade(chan)) {
                ast_log(LOG_WARNING, "Failed to perform masquerade\n");
-               ast_channel_unlock(chan);
-               return -1;
+               goto done;
        }
        if (chan->masqr) {
-               ast_channel_unlock(chan);
-               return 0;
+               res = 0;        /* XXX explain, why 0 ? */
+               goto done;
        }
        if (chan->generatordata) {
                if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
                        ast_deactivate_generator(chan);
                else {
-                       ast_channel_unlock(chan);
-                       return 0;
+                       res = 0;        /* XXX explain, why 0 ? */
+                       goto done;
                }
        }
        /* High bit prints debugging */
-       if (chan->fout & 0x80000000)
+       if (chan->fout & DEBUGCHAN_FLAG)
                ast_frame_dump(chan->name, fr, ">>");
        CHECK_BLOCKING(chan);
        switch(fr->frametype) {
@@ -2348,6 +2343,7 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
                                queue_frame_to_spies(chan, f, SPY_WRITE);
 
                        if (chan->monitor && chan->monitor->write_stream) {
+                               /* XXX must explain this code */
 #ifndef MONITOR_CONSTANT_DELAY
                                int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
                                if (jump >= 0) {
@@ -2383,11 +2379,9 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
        if (res < 0)
                chan->_softhangup |= AST_SOFTHANGUP_DEV;
        else {
-               if ((chan->fout & 0x7fffffff) == 0x7fffffff)
-                       chan->fout &= 0x80000000;
-               else
-                       chan->fout++;
+               chan->fout = FRAMECOUNT_INC(chan->fout);
        }
+done:
        ast_channel_unlock(chan);
        return res;
 }
diff --git a/cli.c b/cli.c
index 591652d..8aa7b8a 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -626,7 +626,6 @@ static int handle_debuglevel(int fd, int argc, char *argv[])
        return RESULT_SUCCESS;
 }
 
-#define        DEBUGCHAN_FLAG  0x80000000
 /* XXX todo: merge next two functions!!! */
 static int handle_debugchan(int fd, int argc, char *argv[])
 {
@@ -756,8 +755,10 @@ static int handle_showchan(int fd, int argc, char *argv[])
                ast_getformatname_multiple(nf, sizeof(nf), c->nativeformats), 
                ast_getformatname_multiple(wf, sizeof(wf), c->writeformat), 
                ast_getformatname_multiple(rf, sizeof(rf), c->readformat),
-               c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "",
-               c->fout & 0x7fffffff, (c->fout & 0x80000000) ? " (DEBUGGED)" : "", (long)c->whentohangup,
+               c->fds[0],
+               c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "",
+               c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "",
+               (long)c->whentohangup,
                cdrtime, c->_bridge ? c->_bridge->name : "<none>", ast_bridged_channel(c) ? ast_bridged_channel(c)->name : "<none>", 
                c->context, c->exten, c->priority, c->callgroup, c->pickupgroup, ( c->appl ? c->appl : "(N/A)" ),
                ( c-> data ? S_OR(c->data, "(Empty)") : "(None)"),
index 3096d16..1fdec4e 100644 (file)
@@ -403,9 +403,13 @@ struct ast_channel {
        unsigned long insmpl;
        unsigned long outsmpl;
 
-       /* Frames in/out counters */
+       /* Frames in/out counters. The high bit is a debug mask, so
+        * the counter is only in the remaining bits
+        */
        unsigned int fin;
        unsigned int fout;
+#define        DEBUGCHAN_FLAG  0x80000000
+#define        FRAMECOUNT_INC(x)       ( ((x) & DEBUGCHAN_FLAG) | ((x++) & ~DEBUGCHAN_FLAG) )
 
        /* Why is the channel hanged up */
        int hangupcause;