(file) Return to slist.c CVS log (file) (dir) Up to [OMI] / omi / pal

 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) */

ViewCVS 0.9.2