Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib/intern/BLI_linklist_lockfree.c')
-rw-r--r--source/blender/blenlib/intern/BLI_linklist_lockfree.c74
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;
}