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