2023-08-15 16:20:26 +02:00
|
|
|
/* SPDX-FileCopyrightText: 2018 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2018-04-13 13:31:55 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2019-02-17 22:08:12 +01:00
|
|
|
/** \file
|
|
|
|
* \ingroup bli
|
2018-04-13 13:31:55 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct LockfreeLinkNode {
|
|
|
|
struct LockfreeLinkNode *next;
|
|
|
|
/* NOTE: "Subclass" this structure to add custom-defined data. */
|
|
|
|
} LockfreeLinkNode;
|
|
|
|
|
|
|
|
typedef struct LockfreeLinkList {
|
|
|
|
/* We keep a dummy node at the beginning of the list all the time.
|
|
|
|
* This allows us to make sure head and tail pointers are always
|
|
|
|
* valid, and saves from annoying exception cases in insert().
|
|
|
|
*/
|
|
|
|
LockfreeLinkNode dummy_node;
|
|
|
|
/* NOTE: This fields might point to a dummy node. */
|
|
|
|
LockfreeLinkNode *head, *tail;
|
|
|
|
} LockfreeLinkList;
|
|
|
|
|
|
|
|
typedef void (*LockfreeeLinkNodeFreeFP)(void *link);
|
|
|
|
|
|
|
|
/* ************************************************************************** */
|
|
|
|
/* NOTE: These functions are NOT safe for use from threads. */
|
|
|
|
/* NOTE: !!! I REPEAT: DO NOT USE THEM WITHOUT EXTERNAL LOCK !!! */
|
|
|
|
|
2021-12-20 09:01:14 +01:00
|
|
|
/** Make list ready for lock-free access. */
|
2018-04-13 13:31:55 +02:00
|
|
|
void BLI_linklist_lockfree_init(LockfreeLinkList *list);
|
|
|
|
|
2021-12-20 09:01:14 +01:00
|
|
|
/** Completely free the whole list, it is NOT re-usable after this. */
|
2018-04-13 13:31:55 +02:00
|
|
|
void BLI_linklist_lockfree_free(LockfreeLinkList *list, LockfreeeLinkNodeFreeFP free_func);
|
|
|
|
|
2021-12-20 09:01:14 +01:00
|
|
|
/**
|
|
|
|
* Remove all the elements from the list, keep it usable for further inserts.
|
2018-04-13 13:31:55 +02:00
|
|
|
*/
|
|
|
|
void BLI_linklist_lockfree_clear(LockfreeLinkList *list, LockfreeeLinkNodeFreeFP free_func);
|
|
|
|
|
2021-12-20 09:01:14 +01:00
|
|
|
/**
|
|
|
|
* Begin iteration of lock-free linked list, starting with a
|
2018-04-13 13:31:55 +02:00
|
|
|
* first user=defined node. Will ignore the dummy node.
|
|
|
|
*/
|
|
|
|
LockfreeLinkNode *BLI_linklist_lockfree_begin(LockfreeLinkList *list);
|
|
|
|
|
|
|
|
/* ************************************************************************** */
|
|
|
|
/* NOTE: These functions are safe for use from threads. */
|
|
|
|
|
|
|
|
void BLI_linklist_lockfree_insert(LockfreeLinkList *list, LockfreeLinkNode *node);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|