[asterisk-commits] trunk - r7867 /trunk/include/asterisk/astobj.h

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sun Jan 8 11:24:54 CST 2006


Author: mogorman
Date: Sun Jan  8 11:24:54 2006
New Revision: 7867

URL: http://svn.digium.com/view/asterisk?rev=7867&view=rev
Log:
Commiting bugfix 5310.  added functions to astobj
for queue like structure. astobj_container_link_end
astobj_container_link_start 
astobj_conatiner_unlink_start

Modified:
    trunk/include/asterisk/astobj.h

Modified: trunk/include/asterisk/astobj.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/astobj.h?rev=7867&r1=7866&r2=7867&view=diff
==============================================================================
--- trunk/include/asterisk/astobj.h (original)
+++ trunk/include/asterisk/astobj.h Sun Jan  8 11:24:54 2006
@@ -571,6 +571,76 @@
 		found; \
 	})
 
+/*! \brief Add an object to the end of a container.
+ *
+ * \param container A pointer to the container to operate on.
+ * \param newobj A pointer to the object to be added.
+ *
+ * This macro adds an object to the end of a container.
+ */
+#define ASTOBJ_CONTAINER_LINK_END(container,newobj) \
+	do { \
+		typeof((container)->head) iterator; \
+		typeof((container)->head) next; \
+		typeof((container)->head) prev; \
+		ASTOBJ_CONTAINER_RDLOCK(container); \
+		prev = NULL; \
+		next = (container)->head; \
+		while((iterator = next)) { \
+			next = iterator->next[0]; \
+			prev = iterator; \
+		} \
+		if(prev) { \
+			ASTOBJ_CONTAINER_WRLOCK((container)); \
+			prev->next[0] = ASTOBJ_REF(newobj); \
+			(newobj)->next[0] = NULL; \
+			ASTOBJ_CONTAINER_UNLOCK((container)); \
+		} else { \
+			ASTOBJ_CONTAINER_LINK_START((container),(newobj)); \
+		} \
+		ASTOBJ_CONTAINER_UNLOCK((container)); \
+	} while(0)
+
+/*! \brief Add an object to the front of a container.
+ *
+ * \param container A pointer to the container to operate on.
+ * \param newobj A pointer to the object to be added.
+ *
+ * This macro adds an object to the start of a container.
+ */
+#define ASTOBJ_CONTAINER_LINK_START(container,newobj) \
+	do { \
+		ASTOBJ_CONTAINER_WRLOCK(container); \
+		(newobj)->next[0] = (container)->head; \
+		(container)->head = ASTOBJ_REF(newobj); \
+		ASTOBJ_CONTAINER_UNLOCK(container); \
+	} while(0)
+
+/*! \brief Remove an object from the front of a container.
+ *
+ * \param container A pointer to the container to operate on.
+ *
+ * This macro removes the first object in a container.
+ *
+ * \note This macro does not destroy any objects, it simply unlinks
+ * them from the list.  No destructors are called.
+ *
+ * \return The container's reference to the removed object or NULL if no
+ * matching object was found.
+ */
+#define ASTOBJ_CONTAINER_UNLINK_START(container) \
+	({ \
+		typeof((container)->head) found = NULL; \
+		ASTOBJ_CONTAINER_WRLOCK(container); \
+	 	if((container)->head) { \
+	 		found = (container)->head; \
+	 		(container)->head = (container)->head->next[0]; \
+	 		found->next[0] = NULL; \
+	 	} \
+		ASTOBJ_CONTAINER_UNLOCK(container); \
+	 	found; \
+	})
+
 /*! \brief Prune marked objects from a container.
  *
  * \param container A pointer to the container to prune.



More information about the asterisk-commits mailing list