From: Russell Bryant Date: Tue, 5 Jun 2007 20:53:28 +0000 (+0000) Subject: This bug has been hanging over my head ever since I wrote this SLA code. X-Git-Tag: 1.4.5~64 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fe9a3bef4eb028e6521e81c9bedb878768f8c3a2;p=thirdparty%2Fasterisk.git 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/branches/1.4@67492 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h index 0d17574de2..2c9a570c1d 100644 --- a/include/asterisk/linkedlists.h +++ b/include/asterisk/linkedlists.h @@ -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