1 #ifndef __SYS_PTHREAD__
2 #define __SYS_PTHREAD__
34 #define HAVE_STRUCT_TIMESPEC 1
41 #include <semaphore.h>
57 inline void Lock() {pthread_mutex_lock(&
cmut);}
60 pthread_cond_signal(&
cvar);
65 pthread_cond_broadcast(&
cvar);
77 ) {pthread_cond_init(&
cvar, NULL);
78 pthread_mutex_init(&
cmut, NULL);
82 pthread_mutex_destroy(&
cmut);
119 {
if (CndVar) CndVar->Lock();
145 {
if (pthread_mutex_trylock( &
cs ))
return 0;
151 struct timespec wait, cur, dur;
152 clock_gettime(CLOCK_REALTIME, &wait);
153 wait.tv_nsec += wait_ms * 100000;
154 wait.tv_sec += (wait.tv_nsec / 100000000);
155 wait.tv_nsec = wait.tv_nsec % 100000000;
158 while( ( rc = pthread_mutex_trylock( &
cs ) ) == EBUSY )
160 clock_gettime( CLOCK_REALTIME, &cur );
161 if( ( cur.tv_sec > wait.tv_sec ) ||
162 ( ( cur.tv_sec == wait.tv_sec ) && ( cur.tv_nsec >= wait.tv_nsec ) ) )
165 dur.tv_sec = wait.tv_sec - cur.tv_sec;
166 dur.tv_nsec = wait.tv_nsec - cur.tv_nsec;
167 if( dur.tv_nsec < 0 )
170 dur.tv_nsec += 1000000000;
173 if( ( dur.tv_sec != 0 ) || ( dur.tv_nsec > 1000000 ) )
176 dur.tv_nsec = 1000000;
179 nanosleep( &dur, 0 );
186 {
struct timespec wait;
187 clock_gettime(CLOCK_REALTIME, &wait);
188 wait.tv_nsec += wait_ms * 100000;
189 wait.tv_sec += (wait.tv_nsec / 100000000);
190 wait.tv_nsec = wait.tv_nsec % 100000000;
191 return !pthread_mutex_timedlock(&
cs, &wait);
195 inline void Lock() {pthread_mutex_lock(&
cs);}
250 {
if (mutex) mutex->Lock();
275 {
if (pthread_rwlock_tryrdlock( &
lock ))
return 0;
279 {
if (pthread_rwlock_trywrlock( &
lock ))
return 0;
286 inline void ReadLock(
int &status ) {status = pthread_rwlock_rdlock(&
lock);}
287 inline void WriteLock(
int &status ) {status = pthread_rwlock_wrlock(&
lock);}
296 pthread_rwlock_destroy(&
lock);
297 pthread_rwlock_init(&
lock, NULL);
327 {
if (l) {
if (rd) l->ReadLock();
363 static void CleanUp(
void *semVar);
366 {semVal = semval; semWait = 0;}
384 {
if (errno == EAGAIN)
return 0;
385 if (errno != EINTR) {
throw "sem_CondWait() failed";}
391 {
throw "sem_post() failed";}
396 {
throw "sem_wait() failed";}
402 {
throw "sem_init() failed";}
428 #define XRDSYSTHREAD_BIND 0x001
433 #define XRDSYSTHREAD_HOLD 0x002
439 static int Cancel(pthread_t tid) {
return pthread_cancel(tid);}
441 static int Detach(pthread_t tid) {
return pthread_detach(tid);}
445 return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
448 static int Join(pthread_t tid,
void **ret) {
449 return pthread_join(tid, ret);
453 return pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
457 return pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
461 return pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, 0);
465 pthread_testcancel();
469 static pthread_t
ID(
void) {
return pthread_self();}
471 static int Kill(pthread_t tid) {
return pthread_cancel(tid);}
473 static unsigned long Num(
void);
475 static int Run(pthread_t *,
void *(*proc)(
void *),
void *arg,
476 int opts=0,
const char *desc = 0);
478 static int Same(pthread_t t1, pthread_t t2)
479 {
return pthread_equal(t1, t2);}
485 static int Signal(pthread_t tid,
int snum)
486 {
return pthread_kill(tid, snum);}
488 static int Wait(pthread_t tid);
XrdSysRWLockHelper(XrdSysRWLock &l, bool rd=1)
Definition: XrdSysPthread.hh:332
void UnLock()
Definition: XrdSysPthread.hh:116
XrdSysMutex * mtx
Definition: XrdSysPthread.hh:260
Definition: XrdSysPthread.hh:214
XrdSysCondVar(int relm=1, const char *cid=0)
Definition: XrdSysPthread.hh:75
pthread_cond_t cvar
Definition: XrdSysPthread.hh:86
void UnLock()
Definition: XrdSysPthread.hh:324
void ReadLock(int &status)
Definition: XrdSysPthread.hh:286
Definition: XrdSysPthread.hh:270
sem_t h_semaphore
Definition: XrdSysPthread.hh:410
pthread_rwlock_t lock
Definition: XrdSysPthread.hh:302
XrdSysRWLock * lck
Definition: XrdSysPthread.hh:340
int CondWait()
Definition: XrdSysPthread.hh:382
static void setDebug(XrdSysError *erp)
Definition: XrdSysPthread.hh:481
static int Kill(pthread_t tid)
Definition: XrdSysPthread.hh:471
void ReInitialize()
Definition: XrdSysPthread.hh:294
void UnLock()
Definition: XrdSysPthread.hh:247
static int Detach(pthread_t tid)
Definition: XrdSysPthread.hh:441
void ReadLock()
Definition: XrdSysPthread.hh:283
void Signal()
Definition: XrdSysPthread.hh:59
void Wait()
Definition: XrdSysPthread.hh:394
XrdSysRWLock()
Definition: XrdSysPthread.hh:291
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
int relMutex
Definition: XrdSysPthread.hh:88
Definition: XrdSysPthread.hh:435
Definition: XrdSysError.hh:89
pthread_mutex_t cmut
Definition: XrdSysPthread.hh:87
static int Cancel(pthread_t tid)
Definition: XrdSysPthread.hh:439
~XrdSysMutex()
Definition: XrdSysPthread.hh:200
static int Signal(pthread_t tid, int snum)
Definition: XrdSysPthread.hh:485
Definition: XrdSysPthread.hh:140
void Lock(XrdSysMutex *Mutex)
Definition: XrdSysPthread.hh:239
void Lock(XrdSysRWLock *lock, bool rd=1)
Definition: XrdSysPthread.hh:315
void WriteLock()
Definition: XrdSysPthread.hh:284
Definition: XrdSysPthread.hh:311
XrdSysRWLockHelper(XrdSysRWLock *l=0, bool rd=1)
Definition: XrdSysPthread.hh:326
static void setStackSize(size_t stsz)
Definition: XrdSysPthread.hh:483
static int Wait(pthread_t tid)
Definition: XrdSysPthread.hh:53
void Post()
Definition: XrdSysPthread.hh:390
int CondReadLock()
Definition: XrdSysPthread.hh:274
pthread_mutex_t cs
Definition: XrdSysPthread.hh:204
Definition: XrdSysPthread.hh:378
static void CancelPoint()
Definition: XrdSysPthread.hh:464
int CondWriteLock()
Definition: XrdSysPthread.hh:278
static pthread_t ID(void)
Definition: XrdSysPthread.hh:469
~XrdSysThread()
Definition: XrdSysPthread.hh:491
~XrdSysRWLock()
Definition: XrdSysPthread.hh:292
void Lock(XrdSysCondVar *CndVar)
Definition: XrdSysPthread.hh:108
static int SetCancelDeferred()
Definition: XrdSysPthread.hh:460
void Broadcast()
Definition: XrdSysPthread.hh:64
Definition: XrdSysPthread.hh:104
~XrdSysCondVarHelper()
Definition: XrdSysPthread.hh:127
XrdSysThread()
Definition: XrdSysPthread.hh:490
static int Join(pthread_t tid, void **ret)
Definition: XrdSysPthread.hh:448
void Lock()
Definition: XrdSysPthread.hh:195
static int SetCancelAsynchronous()
Definition: XrdSysPthread.hh:456
~XrdSysMutexHelper()
Definition: XrdSysPthread.hh:258
~XrdSysRWLockHelper()
Definition: XrdSysPthread.hh:338
~XrdSysSemaphore()
Definition: XrdSysPthread.hh:404
XrdSysCondVarHelper(XrdSysCondVar &CndVar)
Definition: XrdSysPthread.hh:122
int TimedLock(int wait_ms)
Definition: XrdSysPthread.hh:185
const char * condID
Definition: XrdSysPthread.hh:89
int CondLock()
Definition: XrdSysPthread.hh:144
void WriteLock(int &status)
Definition: XrdSysPthread.hh:287
void UnLock()
Definition: XrdSysPthread.hh:69
static int Same(pthread_t t1, pthread_t t2)
Definition: XrdSysPthread.hh:478
XrdSysMutex()
Definition: XrdSysPthread.hh:199
static int SetCancelOn()
Definition: XrdSysPthread.hh:452
XrdSysSemaphore(int semval=1, const char *=0)
Definition: XrdSysPthread.hh:400
static int SetCancelOff()
Definition: XrdSysPthread.hh:444
void UnLock()
Definition: XrdSysPthread.hh:197
static XrdSysError * eDest
Definition: XrdSysPthread.hh:494
XrdSysCondVarHelper(XrdSysCondVar *CndVar=0)
Definition: XrdSysPthread.hh:118
XrdSysMutexHelper(XrdSysMutex *mutex=0)
Definition: XrdSysPthread.hh:249
XrdSysMutexHelper(XrdSysMutex &mutex)
Definition: XrdSysPthread.hh:253
void UnLock()
Definition: XrdSysPthread.hh:289
static size_t stackSize
Definition: XrdSysPthread.hh:495
Definition: XrdSysPthread.hh:235
~XrdSysCondVar()
Definition: XrdSysPthread.hh:81
void Lock()
Definition: XrdSysPthread.hh:57
XrdSysCondVar * cnd
Definition: XrdSysPthread.hh:129
static unsigned long Num(void)