00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _QORE_QORERWLOCK_H
00026 #define _QORE_QORERWLOCK_H
00027
00028 #include <pthread.h>
00029
00031
00034 class QoreRWLock {
00035 protected:
00037 pthread_rwlock_t m;
00038
00040 DLLLOCAL QoreRWLock& operator=(const QoreRWLock&);
00041
00042 public:
00044 DLLLOCAL QoreRWLock() {
00045 #ifndef NDEBUG
00046 int rc =
00047 #endif
00048 pthread_rwlock_init(&m, 0);
00049 assert(!rc);
00050 }
00051
00053 DLLLOCAL ~QoreRWLock() {
00054 #ifndef NDEBUG
00055 int rc =
00056 #endif
00057 pthread_rwlock_destroy(&m);
00058 assert(!rc);
00059 }
00060
00062 DLLLOCAL int rdlock() {
00063 return pthread_rwlock_rdlock(&m);
00064 }
00065
00067 DLLLOCAL int wrlock() {
00068 return pthread_rwlock_wrlock(&m);
00069 }
00070
00072 DLLLOCAL int tryrdlock() {
00073 return pthread_rwlock_tryrdlock(&m);
00074 }
00075
00077 DLLLOCAL int trywrlock() {
00078 return pthread_rwlock_trywrlock(&m);
00079 }
00080
00082 DLLLOCAL int unlock() {
00083 return pthread_rwlock_unlock(&m);
00084 }
00085 };
00086
00088
00093 class QoreAutoRWReadLocker {
00094 private:
00096 DLLLOCAL QoreAutoRWReadLocker(const QoreAutoRWReadLocker&);
00097
00099 DLLLOCAL QoreAutoRWReadLocker& operator=(const QoreAutoRWReadLocker&);
00100
00102 DLLLOCAL void *operator new(size_t);
00103
00104 protected:
00106 QoreRWLock *l;
00107
00108 public:
00110 DLLLOCAL QoreAutoRWReadLocker(QoreRWLock &n_l) : l(&n_l) {
00111 l->rdlock();
00112 }
00113
00115 DLLLOCAL QoreAutoRWReadLocker(QoreRWLock *n_l) : l(n_l) {
00116 l->rdlock();
00117 }
00118
00120 DLLLOCAL ~QoreAutoRWReadLocker() {
00121 l->unlock();
00122 }
00123 };
00124
00125 class QoreAutoRWWriteLocker {
00126 private:
00128 DLLLOCAL QoreAutoRWWriteLocker(const QoreAutoRWWriteLocker&);
00129
00131 DLLLOCAL QoreAutoRWWriteLocker& operator=(const QoreAutoRWWriteLocker&);
00132
00134 DLLLOCAL void *operator new(size_t);
00135
00136 protected:
00138 QoreRWLock *l;
00139
00140 public:
00142 DLLLOCAL QoreAutoRWWriteLocker(QoreRWLock &n_l) : l(&n_l) {
00143 l->wrlock();
00144 }
00145
00147 DLLLOCAL QoreAutoRWWriteLocker(QoreRWLock *n_l) : l(n_l) {
00148 l->wrlock();
00149 }
00150
00152 DLLLOCAL ~QoreAutoRWWriteLocker() {
00153 l->unlock();
00154 }
00155 };
00156
00157 #endif // #ifndef _QORE_QORERWLOCK_H