diff options
Diffstat (limited to 'source/blender/blenlib/intern/BLI_linklist_lockfree.c')
-rw-r--r-- | source/blender/blenlib/intern/BLI_linklist_lockfree.c | 74 |
1 files changed, 35 insertions, 39 deletions
diff --git a/source/blender/blenlib/intern/BLI_linklist_lockfree.c b/source/blender/blenlib/intern/BLI_linklist_lockfree.c index d5dca86ae50..d27e65af778 100644 --- a/source/blender/blenlib/intern/BLI_linklist_lockfree.c +++ b/source/blender/blenlib/intern/BLI_linklist_lockfree.c @@ -30,56 +30,52 @@ void BLI_linklist_lockfree_init(LockfreeLinkList *list) { - list->dummy_node.next = NULL; - list->head = list->tail = &list->dummy_node; + list->dummy_node.next = NULL; + list->head = list->tail = &list->dummy_node; } -void BLI_linklist_lockfree_free(LockfreeLinkList *list, - LockfreeeLinkNodeFreeFP free_func) +void BLI_linklist_lockfree_free(LockfreeLinkList *list, LockfreeeLinkNodeFreeFP free_func) { - if (free_func != NULL) { - /* NOTE: We start from a first user-added node. */ - LockfreeLinkNode *node = list->head->next; - while (node != NULL) { - LockfreeLinkNode *node_next = node->next; - free_func(node); - node = node_next; - } - } + if (free_func != NULL) { + /* NOTE: We start from a first user-added node. */ + LockfreeLinkNode *node = list->head->next; + while (node != NULL) { + LockfreeLinkNode *node_next = node->next; + free_func(node); + node = node_next; + } + } } -void BLI_linklist_lockfree_clear(LockfreeLinkList *list, - LockfreeeLinkNodeFreeFP free_func) +void BLI_linklist_lockfree_clear(LockfreeLinkList *list, LockfreeeLinkNodeFreeFP free_func) { - BLI_linklist_lockfree_free(list, free_func); - BLI_linklist_lockfree_init(list); + BLI_linklist_lockfree_free(list, free_func); + BLI_linklist_lockfree_init(list); } -void BLI_linklist_lockfree_insert(LockfreeLinkList *list, - LockfreeLinkNode *node) +void BLI_linklist_lockfree_insert(LockfreeLinkList *list, LockfreeLinkNode *node) { - /* Based on: - * - * John D. Valois - * Implementing Lock-Free Queues - * - * http://people.csail.mit.edu/bushl2/rpi/portfolio/lockfree-grape/documents/lock-free-linked-lists.pdf - */ - bool keep_working; - LockfreeLinkNode *tail_node; - node->next = NULL; - do { - tail_node = list->tail; - keep_working = - (atomic_cas_ptr((void **)&tail_node->next, NULL, node) != NULL); - if (keep_working) { - atomic_cas_ptr((void **)&list->tail, tail_node, tail_node->next); - } - } while (keep_working); - atomic_cas_ptr((void **)&list->tail, tail_node, node); + /* Based on: + * + * John D. Valois + * Implementing Lock-Free Queues + * + * http://people.csail.mit.edu/bushl2/rpi/portfolio/lockfree-grape/documents/lock-free-linked-lists.pdf + */ + bool keep_working; + LockfreeLinkNode *tail_node; + node->next = NULL; + do { + tail_node = list->tail; + keep_working = (atomic_cas_ptr((void **)&tail_node->next, NULL, node) != NULL); + if (keep_working) { + atomic_cas_ptr((void **)&list->tail, tail_node, tail_node->next); + } + } while (keep_working); + atomic_cas_ptr((void **)&list->tail, tail_node, node); } LockfreeLinkNode *BLI_linklist_lockfree_begin(LockfreeLinkList *list) { - return list->head->next; + return list->head->next; } |