/* */ #ifndef D_LOCK_H #define D_LOCK_H #if defined(_WIN32) #include #elif defined(ENABLE_PTHREAD) #include #endif namespace aria2 { class Lock { private: #if defined(_WIN32) ::CRITICAL_SECTION section_; #elif defined(ENABLE_PTHREAD) ::pthread_mutex_t mutex_; #endif public: Lock() { #if defined(_WIN32) ::InitializeCriticalSection(§ion_); #elif defined(ENABLE_PTHREAD) mutex_ = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; #endif } ~Lock() { #if defined(_WIN32) ::DeleteCriticalSection(§ion_); #elif defined(ENABLE_PTHREAD) ::pthread_mutex_destroy(&mutex_); #endif } inline void aquire() { #if defined(_WIN32) ::EnterCriticalSection(§ion_); #elif defined(ENABLE_PTHREAD) ::pthread_mutex_lock(&mutex_); #endif } inline bool tryAquire() { #if defined(_WIN32) return ::TryEnterCriticalSection(§ion_) == TRUE; #elif defined(ENABLE_PTHREAD) return ::pthread_mutex_trylock(&mutex_) == 0; #else return true; #endif } inline void release() { #if defined(_WIN32) ::LeaveCriticalSection(§ion_); #elif defined(ENABLE_PTHREAD) ::pthread_mutex_unlock(&mutex_); #endif } }; class LockGuard { private: Lock& lock_; public: inline LockGuard(Lock& lock) : lock_(lock) { lock_.aquire(); } inline ~LockGuard() { lock_.release(); } }; } // namespace aria2 #endif // D_LOCK_H