summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-11-27 17:54:25 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-11-27 17:54:25 +0000
commitdc653e09bb2c9835c429c8a2162a9af11bc81362 (patch)
tree9770ddc57d6a7d6978356f78fe18afddfa5f662c
parent588e90a4d9ca1bdda152faa04a661af5e68aad8b (diff)
Made AST_LIST_REMOVE() simpler and use better names.
* Update doxygen of AST_LIST_REMOVE(). ........ Merged revisions 376627 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 376628 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 376629 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@376630 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--include/asterisk/linkedlists.h60
1 files changed, 32 insertions, 28 deletions
diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h
index 215df74b8..8715cf1ad 100644
--- a/include/asterisk/linkedlists.h
+++ b/include/asterisk/linkedlists.h
@@ -848,34 +848,38 @@ struct { \
* \param elm This is a pointer to the entry to be removed.
* \param field This is the name of the field (declared using AST_LIST_ENTRY())
* used to link entries of this list together.
- * \warning The removed entry is \b not freed nor modified in any way.
- */
-#define AST_LIST_REMOVE(head, elm, field) ({ \
- __typeof(elm) __res = NULL; \
- __typeof(elm) __tmp = elm; \
- if (!__tmp) { \
- __res = NULL; \
- } else if ((head)->first == (elm)) { \
- __res = (head)->first; \
- (head)->first = (elm)->field.next; \
- if ((head)->last == (elm)) \
- (head)->last = NULL; \
- } else { \
- typeof(elm) curelm = (head)->first; \
- while (curelm && (curelm->field.next != (elm))) \
- curelm = curelm->field.next; \
- if (curelm) { \
- __res = (elm); \
- curelm->field.next = (elm)->field.next; \
- if ((head)->last == (elm)) \
- (head)->last = curelm; \
- } \
- } \
- if (__res) { \
- (__res)->field.next = NULL; \
- } \
- (__res); \
-})
+ * \retval elm if elm was in the list.
+ * \retval NULL if elm was not in the list or elm was NULL.
+ * \warning The removed entry is \b not freed.
+ */
+#define AST_LIST_REMOVE(head, elm, field) \
+ ({ \
+ __typeof(elm) __elm = (elm); \
+ if (__elm) { \
+ if ((head)->first == __elm) { \
+ (head)->first = __elm->field.next; \
+ __elm->field.next = NULL; \
+ if ((head)->last == __elm) { \
+ (head)->last = NULL; \
+ } \
+ } else { \
+ typeof(elm) __prev = (head)->first; \
+ while (__prev && __prev->field.next != __elm) { \
+ __prev = __prev->field.next; \
+ } \
+ if (__prev) { \
+ __prev->field.next = __elm->field.next; \
+ __elm->field.next = NULL; \
+ if ((head)->last == __elm) { \
+ (head)->last = __prev; \
+ } \
+ } else { \
+ __elm = NULL; \
+ } \
+ } \
+ } \
+ __elm; \
+ })
#define AST_RWLIST_REMOVE AST_LIST_REMOVE