From ed4090fe465b48c3f44fd9adb36eb455c664dcc7 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Sat, 1 Apr 2006 08:00:14 +0000 Subject: [PATCH] Mutex-protect all of listRemoveNode (which includes listPopNode and listShiftNode macros) for complete thread-safety. --- src/xpdev/link_list.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/xpdev/link_list.c b/src/xpdev/link_list.c index fada2fbef8..7cc809de6e 100644 --- a/src/xpdev/link_list.c +++ b/src/xpdev/link_list.c @@ -629,17 +629,13 @@ link_list_t* DLLCALL listExtract(link_list_t* dest_list, const list_node_t* node return(list); } -void* DLLCALL listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_data) +static void* list_remove_node(link_list_t* list, list_node_t* node, BOOL free_data) { void* data; - if(list==NULL) - return(NULL); - - /* Should these lines be mutex protected? */ if(node==FIRST_NODE) node=list->first; - if(node==LAST_NODE) + else if(node==LAST_NODE) node=list->last; if(node==NULL) return(NULL); @@ -647,8 +643,6 @@ void* DLLCALL listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_dat if(node->flags&LINK_LIST_NODE_LOCKED) return(NULL); - MUTEX_LOCK(list); - if(node->prev!=NULL) node->prev->next = node->next; if(node->next!=NULL) @@ -668,6 +662,20 @@ void* DLLCALL listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_dat if(list->count) list->count--; + return(data); +} + +void* DLLCALL listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_data) +{ + void* data; + + if(list==NULL) + return(NULL); + + MUTEX_LOCK(list); + + data = list_remove_node(list, node, free_data); + MUTEX_UNLOCK(list); return(data); -- GitLab