class MutexLock : boost::noncopyable {
public:
MutexLock() : holder_(0) {
pthread_mutex_init(&mutex_,NULL);
}
~MutexLock(){
assert(holder_ == 0);
pthread_mutex_destory(&mutex_);
}
bool isLockedByThisThread() {
return holder_ == CurrentThread::tid();
}
void asswetLocked() {
assert(isLockedByThisThread());
}
void lock() {
pthread_mutex_lock(&mutex_);
holder_ = CurrentThread::tid();
}
void unlock() {
holder_ = 0;
pthread_mutex_unlock(&mutex_);
}
pthread_mutex_t* getPthreadMutex() {
return *mutex_;
}
private:
pthread_mutex_t mutex_;
pid_t holder_;
};
class MutexLockGuard(MutexLock& mutex) {
public:
explicit MutexLockGuard(MutexLock& mutex) :mutex_(mutex) {
mutex_.lock();
}
~MutexLockGuard() {
mutex_.unlock();
}
private:
MutexLock& mutex_;
};
#define MutexLockGuard(x) static_assert(false,"missing mutex guard var name")
class Condition {
public:
explicit Condition(MutexLock& mutex):mutex_(mutex){
pthread_cond_init(&pcond_,Null);
}
~Condition() {
pthread_cond_destory(&pcond_);
}
void wait() { pthread_cond_wait(&pcond_,mutex_.getPthreadMutex());}
void notify() { pthread_cond_signal(&pcond_);}
void notifyall() {pthread_cond_sbroadcast(&pcond_);}
private:
MutexLock& mutex_;
pthread_cond_t pcond_;
};