41 #include <Carbon/Carbon.h>
45 class LockFreeFIFOWithFree
47 LockFreeFIFOWithFree();
49 LockFreeFIFOWithFree(UInt32 inMaxSize)
50 : mReadIndex(0), mWriteIndex(0), mFreeIndex(0)
53 mItems =
new ITEM[inMaxSize];
54 mMask = inMaxSize - 1;
57 ~LockFreeFIFOWithFree()
75 UInt32 nextWriteIndex = (mWriteIndex + 1) & mMask;
76 if (nextWriteIndex == mFreeIndex)
return NULL;
77 return &mItems[mWriteIndex];
83 if (mReadIndex == mWriteIndex)
return NULL;
84 return &mItems[mReadIndex];
89 void AdvanceWritePtr() { CompareAndSwap(mWriteIndex, (mWriteIndex + 1) & mMask, (UInt32*)&mWriteIndex); }
90 void AdvanceReadPtr() { CompareAndSwap(mReadIndex, (mReadIndex + 1) & mMask, (UInt32*)&mReadIndex); }
95 if (mFreeIndex == mReadIndex)
return NULL;
96 return &mItems[mFreeIndex];
98 void AdvanceFreePtr() { CompareAndSwap(mFreeIndex, (mFreeIndex + 1) & mMask, (UInt32*)&mFreeIndex); }
103 while ((item = FreeItem()) != NULL)
110 volatile UInt32 mReadIndex, mWriteIndex, mFreeIndex;
119 template <
class ITEM>
124 LockFreeFIFO(UInt32 inMaxSize)
125 : mReadIndex(0), mWriteIndex(0)
128 mItems =
new ITEM[inMaxSize];
129 mMask = inMaxSize - 1;
145 UInt32 nextWriteIndex = (mWriteIndex + 1) & mMask;
146 if (nextWriteIndex == mReadIndex)
return NULL;
147 return &mItems[mWriteIndex];
152 if (mReadIndex == mWriteIndex)
return NULL;
153 return &mItems[mReadIndex];
158 void AdvanceWritePtr() { CompareAndSwap(mWriteIndex, (mWriteIndex + 1) & mMask, (UInt32*)&mWriteIndex); }
159 void AdvanceReadPtr() { CompareAndSwap(mReadIndex, (mReadIndex + 1) & mMask, (UInt32*)&mReadIndex); }
163 volatile UInt32 mReadIndex, mWriteIndex;