mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-08 19:08:14 +00:00
Commiting bugfix 5310. added functions to astobj
for queue like structure. astobj_container_link_end astobj_container_link_start astobj_conatiner_unlink_start git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7867 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -571,6 +571,76 @@ extern "C" {
|
|||||||
found; \
|
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.
|
/*! \brief Prune marked objects from a container.
|
||||||
*
|
*
|
||||||
* \param container A pointer to the container to prune.
|
* \param container A pointer to the container to prune.
|
||||||
|
|||||||
Reference in New Issue
Block a user