Annotation of wikisrc/projects/project/atomic_fifo_lifo_queues.mdwn, revision 1.2
1.1 jmmv 1: [[!template id=project
2:
3: title="Lockless, atomic FIFO/LIFO queues"
4:
5: contact="""
6: [tech-kern](mailto:tech-kern@NetBSD.org),
7: [board](mailto:board@NetBSD.org),
8: [core](mailto:core@NetBSD.org)
9: """
10:
11: category="kernel"
12: difficulty="hard"
13:
14: description="""
1.2 ! riastrad 15: This project proposal is a subtask of [[smp_networking]].
1.1 jmmv 16:
17: The goal of this project is to implement lockless and atomic FIFO/LIFO
18: queues in the kernel. The routines to be implemented allow for commonly
19: typed items to be locklessly inserted at either the head or tail of a queue
20: for either last-in, first-out (LIFO) or first-in, first-out (FIFO)
21: behavior, respectively. However, a queue is not instrinsicly LIFO or FIFO.
22: Its behavior is determined solely by which method each item was pushed onto
23: the queue.
24:
25: It is only possible for an item to removed from the head of queue. This
26: removal is also performed in a lockless manner.
27:
28: All items in the queue must share a `atomic_queue_link_t` member at the
29: same offset from the beginning of item. This offset is passed to
30: `atomic_qinit`.
31:
32: The proposed interface looks like this:
33:
34: * `void atomic_qinit(atomic_queue_t *q, size_t offset);`
35:
36: Initializes the atomic_queue_t queue at `q`. `offset` is the offset to
37: the `atomic_queue_link_t` inside the data structure where the pointer to
38: the next item in this queue will be placed. It should be obtained using
39: `offsetof`.
40:
41: * `void *atomic_qpeek(atomic_queue_t *q);`
42:
43: Returns a pointer to the item at the head of the supplied queue `q`. If
44: there was no item because the queue was empty, `NULL` is returned. No
45: item is removed from the queue. Given this is an unlocked operation, it
46: should only be used as a hint as whether the queue is empty or not.
47:
48: * `void *atomic_qpop(atomic_queue_t *q);`
49:
50: Removes the item (if present) at the head of the supplied queue `q` and
51: returns a pointer to it. If there was no item to remove because the
52: queue was empty, `NULL` is returned. Because this routine uses atomic
53: Compare-And-Store operations, the returned item should stay accessible
54: for some indeterminate time so that other interrupted or concurrent
55: callers to this function with this `q` can continue to deference it
56: without trapping.
57:
58: * `void atomic_qpush_fifo(atomic_queue_t *q, void *item);`
59:
60: Places `item` at the tail of the `atomic_queue_t` queue at `q`.
61:
62: * `void atomic_qpush_lifo(atomic_queue_t *q, void *item);`
63:
64: Places `item` at the head of the `atomic_queue_t` queue at `q`.
65: """
66: ]]
67:
68: [[!tag smp_networking]]
CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb