blob: 163849ed664ca0437079d0e9ad6e63aa1fbd01ec [file] [log] [blame]
//===---------- CollectionRV.h - Rendez-vous for garbage collection -------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef _MVM_COLLECTIONRV_H_
#define _MVM_COLLECTIONRV_H_
#include "mvm/Threads/Cond.h"
#include "mvm/Threads/Locks.h"
#include "mvm/Threads/Thread.h"
namespace mvm {
class CollectionRV {
/// _lockRV - Lock for synchronization.
LockNormal _lockRV;
/// condEndRV - Condition for unlocking other tasks (write protect).
Cond condEndRV;
/// collectionCond - Condition for unblocking the initator.
Cond condInitiator;
/// nbJoined - Number of threads that joined the rendezvous.
unsigned nbJoined;
/// cooperative - Is the rendez-vous cooperative?
bool cooperative;
/// rendezvousNb - The identifier of the rendez-vous.
unsigned rendezvousNb;
public:
CollectionRV() {
rendezvousNb = 0;
nbJoined = 0;
#ifdef WITH_LLVM_GCC
cooperative = true;
#else
cooperative = false;
#endif
}
bool isCooperative() { return cooperative; }
void lockRV() { _lockRV.lock(); }
void unlockRV() { _lockRV.unlock(); }
void waitEndOfRV();
void waitRV();
void startRV() {
mvm::Thread::get()->inRV = true;
lockRV();
}
void cancelRV() {
unlockRV();
mvm::Thread::get()->inRV = false;
}
void finishRV();
void collectorGo() { condInitiator.broadcast(); }
void another_mark() { nbJoined++; }
void synchronize();
void join();
unsigned getNumber() { return rendezvousNb; }
};
}
#endif