--- parser3/src/include/pa_threads.h 2001/01/29 11:17:49 1.1 +++ parser3/src/include/pa_threads.h 2001/03/19 16:44:00 1.8 @@ -1,5 +1,9 @@ -/* - $Id: pa_threads.h,v 1.1 2001/01/29 11:17:49 paf Exp $ +/** @file + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: pa_threads.h,v 1.8 2001/03/19 16:44:00 paf Exp $ */ #ifndef PA_THREADS_H @@ -14,24 +18,55 @@ #ifdef MULTITHREAD +/// simple semaphore object class Mutex { uint handle; public: Mutex(); ~Mutex(); - void lock(); - void unlock(); + void acquire(); + void release(); }; -#else +extern Mutex global_mutex; -class Mutex { - Mutex() {} - ~Mutex() {} - void lock() {} - void unlock() {} +/** + Helper to ensure paired Mutex::acquire() and Mutex::release(). + + Use it with SYNCHRONIZED macro +*/ +class AutoSYNCHRONIZED { + bool thread_safe; +public: + AutoSYNCHRONIZED(bool athread_safe) : thread_safe(athread_safe) { + if(thread_safe) + global_mutex.acquire(); + } + ~AutoSYNCHRONIZED() { + if(thread_safe) + global_mutex.release(); + } }; +/** + put it to first line of a function to ensure thread safety. + + @verbatim + void someclass::somefunc(...) { SYNCHRONIZED(thread_safe); + ... + } + @endverbatim + + considering \a thread_safe to be the object field to flag + whether safety is really needed in this particular object instance +*/ +#define SYNCHRONIZED(athread_safe) AutoSYNCHRONIZED autoSYNCHRONIZED(athread_safe) + +#else // not MULTITHREAD-ed + +#define SYNCHRONIZED(athread_safe) /* do nothing */ + #endif + #endif