1 krisbash 1.1 #include "slist.h"
2
3 #if !defined(_MSC_VER)
4
5 PAL_INLINE void Atomic_Lock(
6 _Inout_ volatile ptrdiff_t* dest)
7 {
8 while (Atomic_Swap(dest, 1) == 1)
9 while (*dest)
10 ;
11 }
12
13 PAL_INLINE void Atomic_Unlock(
14 _Inout_ volatile ptrdiff_t* dest)
15 {
16 Atomic_Swap(dest, 0);
17 }
18
19 SListEntry* SList_FlushAtomic(
20 _Inout_ SListHead* head)
21 {
22 krisbash 1.1 Atomic_Lock(&head->__private.lock);
23 SListEntry* p = head->__private.next;
24 head->__private.next = NULL;
25 Atomic_Unlock(&head->__private.lock);
26 return p;
27 }
28
29 SListEntry* SList_PushAtomic(
30 _Inout_ SListHead* head,
31 _Inout_ SListEntry* entry)
32 {
33 SListEntry* p;
34
35 Atomic_Lock(&head->__private.lock);
36
37 entry->__private.next = head->__private.next;
38 p = head->__private.next;
39 head->__private.next = entry;
40
41 Atomic_Unlock(&head->__private.lock);
42
43 krisbash 1.1 return p;
44 }
45
46 SListEntry* SList_PopAtomic(
47 _Inout_ SListHead* head)
48 {
49 Atomic_Lock(&head->__private.lock);
50
51 SListEntry* p = head->__private.next;
52
53 if (p)
54 {
55 head->__private.next = p->__private.next;
56 }
57
58 Atomic_Unlock(&head->__private.lock);
59
60 return p;
61 }
62
63 #endif /* !defined(_MSC_VER) */
|