Merged revisions 67492 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Tue, 5 Jun 2007 20:55:59 +0000 (20:55 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 5 Jun 2007 20:55:59 +0000 (20:55 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r67492 | russell | 2007-06-05 15:53:28 -0500 (Tue, 05 Jun 2007) | 16 lines

This bug has been hanging over my head ever since I wrote this SLA code.
Every time I tried to go debug it by adding some debug output, the behavior
would change.  It turns out I wasn't crazy.  I had the following piece of code:

   if (remove)
      AST_LIST_REMOVE_CURRENT(...);

Well, AST_LIST_REMOVE_CURRENT was not wrapped in braces, so my conditional
statement didn't do much good at all.  It always ran at least all of the
macro minus the first statement, so I was seeing list entries magically
disappear when they weren't supposed to.

After many hours of debugging, I have come to this extremely irritating fix. :)

(issues #9581, #9497)

........

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

include/asterisk/linkedlists.h

index 0d17574..2c9a570 100644 (file)
@@ -513,7 +513,7 @@ struct {                                                            \
   the list traversal (and without having to re-traverse the list to modify the
   previous entry, if any).
  */
-#define AST_LIST_REMOVE_CURRENT(head, field)                                           \
+#define AST_LIST_REMOVE_CURRENT(head, field) do { \
        __new_prev->field.next = NULL;                                                  \
        __new_prev = __list_prev;                                                       \
        if (__list_prev)                                                                \
@@ -521,7 +521,8 @@ struct {                                                            \
        else                                                                            \
                (head)->first = __list_next;                                            \
        if (!__list_next)                                                               \
-               (head)->last = __list_prev;
+               (head)->last = __list_prev; \
+       } while (0)
 
 #define AST_RWLIST_REMOVE_CURRENT AST_LIST_REMOVE_CURRENT