18 #ifndef UTHREADS_BLOKING_SYNC_H 19 #define UTHREADS_BLOKING_SYNC_H 21 #include "../generic/IntrusiveContainers.h" 43 IntrusiveList<uThread> queue;
91 return signal(lock, dummy);
108 static void postSwitchFunc(
void* ut,
void* args){
109 assert(args !=
nullptr);
110 assert(ut !=
nullptr);
113 auto bqp = (std::pair<T*, BlockingQueue*>*)args;
114 bqp->second->queue.push_back(*utt);
115 bqp->first->unlock();
142 bool internalAcquire(mword timeout) {
148 assert(OL || owner != bq.getCurrentUThread());
149 if(fastpath(owner !=
nullptr && (!OL || owner != bq.getCurrentUThread()))) {
159 owner = bq.getCurrentUThread();
165 void internalRelease() {
167 if (fastpath(bq.
signal(lock, owner)))
return;
173 Mutex() : owner(
nullptr) {}
181 template<
bool OL=false>
182 bool acquire() {
return internalAcquire<OL>(0);}
193 assert(owner == bq.getCurrentUThread());
197 void unlock(){release();}
222 if (internalAcquire<true>(0))
238 assert(owner == bq.getCurrentUThread());
300 bool internalP(mword timeout) {
301 if(fastpath(counter < 1)) {
323 return internalP<false>(0);
337 if (fastpath(bq.
signal(mutex)))
return;
an Owner Mutex where owner can recursively acquire the Mutex
Definition: BlockingSync.h:204
void signalAll(Mutex &mutex)
unblock all uThreads waiting on the condition variable
Definition: BlockingSync.h:278
void release()
release the Mutex
Definition: BlockingSync.h:191
const BlockingQueue & operator=(const BlockingQueue &)=delete
BlockingQueue cannot be copied or assigned.
void signalAll(Mutex &)
unblock all blocked uThreads, used for Condition Variable
Definition: BlockingSync.cpp:65
A user-level Semaphore.
Definition: BlockingSync.h:294
bool P()
Decrement the value of the Semaphore.
Definition: BlockingSync.h:321
A user-level Mutex.
Definition: BlockingSync.h:123
OwnerLock()
Create a new OwnerLock.
Definition: BlockingSync.h:214
bool acquire()
acquire the mutex
Definition: BlockingSync.h:182
mword release()
Release the OwnerLock once.
Definition: BlockingSync.h:236
bool empty()
Whether the waiting list is empty or not.
Definition: BlockingSync.h:284
mword acquire()
Acquire the OwnerLock.
Definition: BlockingSync.h:221
void V()
increment the value of the Semaphore
Definition: BlockingSync.h:334
user-level threads (fiber)
Definition: uThread.h:63
bool empty() const
Whether the queue is empty or not.
Definition: BlockingSync.h:58
A queue used to keep track of blocked uThreads.
Definition: BlockingSync.h:36
void wait(Mutex &mutex)
Block uThread on the condition variable using the provided mutex.
Definition: BlockingSync.h:262
bool signal(std::mutex &lock)
unblock one blocked, used for Mutex
Definition: BlockingSync.h:89
A user level condition variable.
Definition: BlockingSync.h:254
bool signal(std::mutex &lock, uThread *&owner)
Unblock one blocked uThread, used for OwnerLock.
Definition: BlockingSync.cpp:38
bool suspend(std::mutex &lock)
Suspends the uThread and add it to the queue.
Definition: BlockingSync.cpp:21
Semaphore(mword c=0)
Create a new Semaphore.
Definition: BlockingSync.h:315
void signal(Mutex &mutex)
Unblock one uThread waiting on the condition variable.
Definition: BlockingSync.h:271