1 #ifndef __SYS_PTHREAD__
2 #define __SYS_PTHREAD__
34 #define HAVE_STRUCT_TIMESPEC 1
41 #include <semaphore.h>
45 #ifndef CLOCK_REALTIME
46 #include <mach/clock.h>
47 #include <mach/mach.h>
51 template<
typename TYPE >
52 void get_apple_realtime( TYPE & wait )
55 clock_gettime(CLOCK_REALTIME, &wait);
59 host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
60 clock_get_time(cclock, &mts);
61 mach_port_deallocate(mach_task_self(), cclock);
62 wait.tv_sec = mts.tv_sec;
63 wait.tv_nsec = mts.tv_nsec;
82 inline void Lock() {pthread_mutex_lock(&
cmut);}
85 pthread_cond_signal(&
cvar);
90 pthread_cond_broadcast(&
cvar);
102 ) {pthread_cond_init(&
cvar, NULL);
103 pthread_mutex_init(&
cmut, NULL);
107 pthread_mutex_destroy(&
cmut);
143 {
if (CndVar) CndVar->Lock();
170 {
if (pthread_mutex_trylock( &
cs ))
return 0;
176 struct timespec wait, cur, dur;
177 get_apple_realtime(wait);
178 wait.tv_sec += (wait_ms / 1000);
179 wait.tv_nsec += (wait_ms % 1000) * 1000000;
180 wait.tv_sec += (wait.tv_nsec / 1000000000);
181 wait.tv_nsec = wait.tv_nsec % 1000000000;
184 while( ( rc = pthread_mutex_trylock( &
cs ) ) == EBUSY )
186 get_apple_realtime(cur);
187 if( ( cur.tv_sec > wait.tv_sec ) ||
188 ( ( cur.tv_sec == wait.tv_sec ) && ( cur.tv_nsec >= wait.tv_nsec ) ) )
191 dur.tv_sec = wait.tv_sec - cur.tv_sec;
192 dur.tv_nsec = wait.tv_nsec - cur.tv_nsec;
193 if( dur.tv_nsec < 0 )
196 dur.tv_nsec += 1000000000;
199 if( ( dur.tv_sec != 0 ) || ( dur.tv_nsec > 1000000 ) )
202 dur.tv_nsec = 1000000;
205 nanosleep( &dur, 0 );
212 {
struct timespec wait;
213 clock_gettime(CLOCK_REALTIME, &wait);
214 wait.tv_sec += (wait_ms / 1000);
215 wait.tv_nsec += (wait_ms % 1000) * 1000000;
216 wait.tv_sec += (wait.tv_nsec / 1000000000);
217 wait.tv_nsec = wait.tv_nsec % 1000000000;
218 return !pthread_mutex_timedlock(&
cs, &wait);
222 inline void Lock() {pthread_mutex_lock(&
cs);}
277 {
if (mutex) mutex->Lock();
312 {pthread_cond_init(&
cvar, NULL);}
334 {
if (pthread_rwlock_tryrdlock( &
lock ))
return 0;
338 {
if (pthread_rwlock_trywrlock( &
lock ))
return 0;
345 inline void ReadLock(
int &status ) {status = pthread_rwlock_rdlock(&
lock);}
346 inline void WriteLock(
int &status ) {status = pthread_rwlock_wrlock(&
lock);}
355 pthread_rwlockattr_t attr;
356 pthread_rwlockattr_setkind_np(&attr,
357 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
358 pthread_rwlock_init(&
lock, &attr);
360 pthread_rwlock_init(&
lock, NULL);
369 pthread_rwlock_destroy(&
lock);
371 pthread_rwlockattr_t attr;
372 pthread_rwlockattr_setkind_np(&attr,
373 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
374 pthread_rwlock_init(&
lock, &attr);
376 pthread_rwlock_init(&
lock, NULL);
382 pthread_rwlock_destroy(&
lock);
383 pthread_rwlock_init(&
lock, NULL);
413 {
if (l) {
if (rd) l->ReadLock();
467 #if defined(__APPLE__) || defined(__GNU__)
478 static void CleanUp(
void *semVar);
481 {semVal = semval; semWait = 0;}
499 {
if (errno == EAGAIN)
return 0;
500 if (errno != EINTR) {
throw "sem_CondWait() failed";}
506 {
throw "sem_post() failed";}
511 {
throw "sem_wait() failed";}
517 {
throw "sem_init() failed";}
543 #define XRDSYSTHREAD_BIND 0x001
548 #define XRDSYSTHREAD_HOLD 0x002
554 static int Cancel(pthread_t tid) {
return pthread_cancel(tid);}
556 static int Detach(pthread_t tid) {
return pthread_detach(tid);}
560 return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
563 static int Join(pthread_t tid,
void **ret) {
564 return pthread_join(tid, ret);
568 return pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
572 return pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
576 return pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, 0);
580 pthread_testcancel();
584 static pthread_t
ID(
void) {
return pthread_self();}
586 static int Kill(pthread_t tid) {
return pthread_cancel(tid);}
588 static unsigned long Num(
void);
590 static int Run(pthread_t *,
void *(*proc)(
void *),
void *arg,
591 int opts=0,
const char *desc = 0);
593 static int Same(pthread_t t1, pthread_t t2)
594 {
return pthread_equal(t1, t2);}
598 static void setStackSize(
size_t stsz,
bool force=
false);
600 static int Signal(pthread_t tid,
int snum)
601 {
return pthread_kill(tid, snum);}
603 static int Wait(pthread_t tid);
XrdSysRWLockHelper(XrdSysRWLock &l, bool rd=1)
Definition: XrdSysPthread.hh:418
void UnLock()
Definition: XrdSysPthread.hh:140
pthread_mutex_t * mtxP
Definition: XrdSysPthread.hh:319
XrdSysMutex * mtx
Definition: XrdSysPthread.hh:287
Definition: XrdSysPthread.hh:241
Definition: XrdSysPthread.hh:350
XrdSysCondVar(int relm=1, const char *cid=0)
Definition: XrdSysPthread.hh:100
pthread_cond_t cvar
Definition: XrdSysPthread.hh:111
void UnLock()
Definition: XrdSysPthread.hh:410
void ReadLock(int &status)
Definition: XrdSysPthread.hh:345
Definition: XrdSysPthread.hh:329
sem_t h_semaphore
Definition: XrdSysPthread.hh:525
pthread_rwlock_t lock
Definition: XrdSysPthread.hh:388
XrdSysRWLock * lck
Definition: XrdSysPthread.hh:426
void ReadLock()
Definition: XrdSysPthread.hh:439
int CondWait()
Definition: XrdSysPthread.hh:497
static void setStackSize(size_t stsz, bool force=false)
static void setDebug(XrdSysError *erp)
Definition: XrdSysPthread.hh:596
static int Kill(pthread_t tid)
Definition: XrdSysPthread.hh:586
void ReInitialize()
Definition: XrdSysPthread.hh:380
void UnLock()
Definition: XrdSysPthread.hh:274
static int Detach(pthread_t tid)
Definition: XrdSysPthread.hh:556
void ReadLock()
Definition: XrdSysPthread.hh:342
void Signal()
Definition: XrdSysPthread.hh:84
void Wait()
Definition: XrdSysPthread.hh:509
XrdSysRWLock()
Definition: XrdSysPthread.hh:364
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
int relMutex
Definition: XrdSysPthread.hh:113
Definition: XrdSysPthread.hh:550
Definition: XrdSysError.hh:89
void UnLock()
Definition: XrdSysPthread.hh:443
pthread_mutex_t cmut
Definition: XrdSysPthread.hh:112
void WriteLock()
Definition: XrdSysPthread.hh:441
static int Cancel(pthread_t tid)
Definition: XrdSysPthread.hh:554
~XrdSysMutex()
Definition: XrdSysPthread.hh:227
Definition: XrdSysPthread.hh:433
static int Signal(pthread_t tid, int snum)
Definition: XrdSysPthread.hh:600
Definition: XrdSysPthread.hh:164
bool isRW
Definition: XrdSysPthread.hh:455
void Lock(XrdSysMutex *Mutex)
Definition: XrdSysPthread.hh:266
bool Wait(int sec)
Definition: XrdSysPthread.hh:308
void Lock(XrdSysRWLock *lock, bool rd=1)
Definition: XrdSysPthread.hh:401
void WriteLock()
Definition: XrdSysPthread.hh:343
pthread_cond_t cvar
Definition: XrdSysPthread.hh:318
Definition: XrdSysPthread.hh:397
XrdSysRWLockHelper(XrdSysRWLock *l=0, bool rd=1)
Definition: XrdSysPthread.hh:412
static int Wait(pthread_t tid)
Definition: XrdSysPthread.hh:78
void Post()
Definition: XrdSysPthread.hh:505
int CondReadLock()
Definition: XrdSysPthread.hh:333
pthread_mutex_t cs
Definition: XrdSysPthread.hh:231
void Signal()
Definition: XrdSysPthread.hh:303
Definition: XrdSysPthread.hh:493
static void CancelPoint()
Definition: XrdSysPthread.hh:579
XrdSysFusedMutex(XrdSysMutex &mtx)
Definition: XrdSysPthread.hh:448
int CondWriteLock()
Definition: XrdSysPthread.hh:337
Definition: XrdSysPthread.hh:299
static pthread_t ID(void)
Definition: XrdSysPthread.hh:584
void Lock()
Definition: XrdSysPthread.hh:437
~XrdSysThread()
Definition: XrdSysPthread.hh:606
~XrdSysRWLock()
Definition: XrdSysPthread.hh:365
void Lock(XrdSysCondVar *CndVar)
Definition: XrdSysPthread.hh:132
static int SetCancelDeferred()
Definition: XrdSysPthread.hh:575
void Broadcast()
Definition: XrdSysPthread.hh:89
XrdSysFusedMutex(XrdSysRWLock &mtx)
Definition: XrdSysPthread.hh:445
Definition: XrdSysPthread.hh:128
PrefType
Definition: XrdSysPthread.hh:350
~XrdSysCondVarHelper()
Definition: XrdSysPthread.hh:151
~XrdSysCondVar2()
Definition: XrdSysPthread.hh:314
XrdSysThread()
Definition: XrdSysPthread.hh:605
~XrdSysFusedMutex()
Definition: XrdSysPthread.hh:451
XrdSysMutex * mutex
Definition: XrdSysPthread.hh:454
XrdSysRWLock(PrefType ptype)
Definition: XrdSysPthread.hh:352
static int Join(pthread_t tid, void **ret)
Definition: XrdSysPthread.hh:563
void Lock()
Definition: XrdSysPthread.hh:222
static int SetCancelAsynchronous()
Definition: XrdSysPthread.hh:571
~XrdSysMutexHelper()
Definition: XrdSysPthread.hh:285
~XrdSysRWLockHelper()
Definition: XrdSysPthread.hh:424
~XrdSysSemaphore()
Definition: XrdSysPthread.hh:519
XrdSysCondVarHelper(XrdSysCondVar &CndVar)
Definition: XrdSysPthread.hh:146
int TimedLock(int wait_ms)
Definition: XrdSysPthread.hh:211
const char * condID
Definition: XrdSysPthread.hh:114
int CondLock()
Definition: XrdSysPthread.hh:169
XrdSysRWLock * rwLok
Definition: XrdSysPthread.hh:454
void WriteLock(int &status)
Definition: XrdSysPthread.hh:346
void ReInitialize(PrefType ptype)
Definition: XrdSysPthread.hh:367
void UnLock()
Definition: XrdSysPthread.hh:94
static int Same(pthread_t t1, pthread_t t2)
Definition: XrdSysPthread.hh:593
XrdSysCondVar2(XrdSysMutex &mtx)
Definition: XrdSysPthread.hh:311
XrdSysMutex()
Definition: XrdSysPthread.hh:226
static int SetCancelOn()
Definition: XrdSysPthread.hh:567
XrdSysSemaphore(int semval=1, const char *=0)
Definition: XrdSysPthread.hh:515
int Wait()
Definition: XrdSysPthread.hh:307
void Broadcast()
Definition: XrdSysPthread.hh:305
static int SetCancelOff()
Definition: XrdSysPthread.hh:559
void UnLock()
Definition: XrdSysPthread.hh:224
static XrdSysError * eDest
Definition: XrdSysPthread.hh:609
XrdSysCondVarHelper(XrdSysCondVar *CndVar=0)
Definition: XrdSysPthread.hh:142
XrdSysMutexHelper(XrdSysMutex *mutex=0)
Definition: XrdSysPthread.hh:276
XrdSysMutexHelper(XrdSysMutex &mutex)
Definition: XrdSysPthread.hh:280
void UnLock()
Definition: XrdSysPthread.hh:348
static size_t stackSize
Definition: XrdSysPthread.hh:610
Definition: XrdSysPthread.hh:262
~XrdSysCondVar()
Definition: XrdSysPthread.hh:106
void Lock()
Definition: XrdSysPthread.hh:82
XrdSysCondVar * cnd
Definition: XrdSysPthread.hh:153
static unsigned long Num(void)