#include "../context.h" #interface "Atomic.h" #interface "Lock.h" Lock* createSpinLock(struct Context* context) { struct Lock* lock = new Lock(); struct SpinLock* spinLock = new SpinLock(); spinLock->lock = NULL; spinLock->atomic = createAtomicReference(context); lock->lock = (union Data*)spinLock; lock->doLock = C_doLockSpinLock; lock->doUnlock = C_doUnlockSpinLock; return lock; } __code doLockSpinLock(struct SpinLock* lock, __code next(...)) { struct Atomic* atomic = lock->atomic; goto atomic->checkAndSet(&lock->lock, NULL, 1, doLockSpinLock1, doLockSpinLock); } __code doLockSpinLock1(struct SpinLock* lock, __code next(...)) { lock->lockContext = context; goto next(...); } __code doUnlockSpinLock(struct SpinLock* lock, __code next(...)) { if (lock->lockContext == context) { struct Atomic* atomic = lock->atomic; goto atomic->checkAndSet(&lock->lock, 1, NULL, next(...), doUnlockSpinLock); } goto next(...); }