44 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
45 #include <libkern/OSAtomic.h>
51 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
52 #include <CoreServices/CoreServices.h>
60 TAtomicStack() : mHead(NULL) { }
65 item->set_next(mHead);
73 mHead = result->get_next();
77 bool empty() {
return mHead == NULL; }
79 T * head() {
return mHead; }
82 void push_atomic(T *item)
88 }
while (!compare_and_swap(head, item, &mHead));
91 void push_multiple_atomic(T *item)
94 T *head, *p = item, *tail;
102 tail->set_next(head);
103 }
while (!compare_and_swap(head, item, &mHead));
106 T * pop_atomic_single_reader()
113 if ((result = mHead) == NULL)
115 }
while (!compare_and_swap(result, result->get_next(), &mHead));
124 T *result = pop_all();
126 T *next = result->get_next();
129 push_multiple_atomic(next);
138 if ((result = mHead) == NULL)
140 }
while (!compare_and_swap(result, NULL, &mHead));
144 T* pop_all_reversed()
146 TAtomicStack<T> reversed;
147 T *p = pop_all(), *next;
149 next = p->get_next();
153 return reversed.mHead;
156 static bool compare_and_swap(T *oldvalue, T *newvalue, T **pvalue)
160 return ::OSAtomicCompareAndSwap64Barrier(int64_t(oldvalue), int64_t(newvalue), (int64_t *)pvalue);
161 #elif MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
162 return ::OSAtomicCompareAndSwap32Barrier(int32_t(oldvalue), int32_t(newvalue), (int32_t *)pvalue);
164 return ::CompareAndSwap(UInt32(oldvalue), UInt32(newvalue), (UInt32 *)pvalue);
168 return CAAtomicCompareAndSwap32Barrier(SInt32(oldvalue), SInt32(newvalue), (SInt32*)pvalue);
176 #if ((MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) && !TARGET_OS_WIN32)
177 #include <libkern/OSAtomic.h>
179 class CAAtomicStack {
181 CAAtomicStack(
size_t nextPtrOffset) : mNextPtrOffset(nextPtrOffset) { mHead.opaque1 = 0; mHead.opaque2 = 0;
184 void push_atomic(
void *p) { OSAtomicEnqueue(&mHead, p, mNextPtrOffset); }
185 void push_NA(
void *p) { push_atomic(p); }
187 void * pop_atomic() {
return OSAtomicDequeue(&mHead, mNextPtrOffset); }
188 void * pop_atomic_single_reader() {
return pop_atomic(); }
189 void * pop_NA() {
return pop_atomic(); }
193 size_t mNextPtrOffset;
198 class TAtomicStack2 :
public CAAtomicStack {
200 TAtomicStack2(
size_t nextPtrOffset) : CAAtomicStack(nextPtrOffset) { }
202 T * pop_atomic() {
return (T *)CAAtomicStack::pop_atomic(); }
203 T * pop_atomic_single_reader() {
return pop_atomic(); }
204 T * pop_NA() {
return pop_atomic(); }
207 #endif // MAC_OS_X_VERSION_MAX_ALLOWED && !TARGET_OS_WIN32
209 #endif // __TStack_h__