// file : cult/sched/lock.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2010 Boris Kolpackov // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef CULT_SCHED_LOCK_HXX #define CULT_SCHED_LOCK_HXX #include namespace Cult { namespace Sched { class Lock: public NonCopyable { public: ~Lock () { unlock (); } template Lock (X& x) : x_ (reinterpret_cast(&x)), unlock_ (&unlock), locked_ (true) { x.lock (); } Void unlock () { if (locked_) { unlock_ (x_); locked_ = false; } } private: template static Void unlock (Void* p) { reinterpret_cast (p)->unlock (); } private: Void* x_; Void (*unlock_) (Void*); Boolean locked_; }; } } #endif // CULT_SCHED_LOCK_HXX