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);
144 {
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_nsec += wait_ms * 100000;
179 wait.tv_sec += (wait.tv_nsec / 100000000);
180 wait.tv_nsec = wait.tv_nsec % 100000000;
183 while( ( rc = pthread_mutex_trylock( &
cs ) ) == EBUSY )
185 get_apple_realtime(cur);
186 if( ( cur.tv_sec > wait.tv_sec ) ||
187 ( ( cur.tv_sec == wait.tv_sec ) && ( cur.tv_nsec >= wait.tv_nsec ) ) )
190 dur.tv_sec = wait.tv_sec - cur.tv_sec;
191 dur.tv_nsec = wait.tv_nsec - cur.tv_nsec;
192 if( dur.tv_nsec < 0 )
195 dur.tv_nsec += 1000000000;
198 if( ( dur.tv_sec != 0 ) || ( dur.tv_nsec > 1000000 ) )
201 dur.tv_nsec = 1000000;
204 nanosleep( &dur, 0 );
211 {
struct timespec wait;
212 clock_gettime(CLOCK_REALTIME, &wait);
213 wait.tv_nsec += wait_ms * 100000;
214 wait.tv_sec += (wait.tv_nsec / 100000000);
215 wait.tv_nsec = wait.tv_nsec % 100000000;
216 return !pthread_mutex_timedlock(&
cs, &wait);
220 inline void Lock() {pthread_mutex_lock(&
cs);}
275 {
if (mutex) mutex->Lock();
300 {
if (pthread_rwlock_tryrdlock( &
lock ))
return 0;
304 {
if (pthread_rwlock_trywrlock( &
lock ))
return 0;
311 inline void ReadLock(
int &status ) {status = pthread_rwlock_rdlock(&
lock);}
312 inline void WriteLock(
int &status ) {status = pthread_rwlock_wrlock(&
lock);}
321 pthread_rwlock_destroy(&
lock);
322 pthread_rwlock_init(&
lock, NULL);
352 {
if (l) {
if (rd) l->ReadLock();
388 static void CleanUp(
void *semVar);
391 {semVal = semval; semWait = 0;}
409 {
if (errno == EAGAIN)
return 0;
410 if (errno != EINTR) {
throw "sem_CondWait() failed";}
416 {
throw "sem_post() failed";}
421 {
throw "sem_wait() failed";}
427 {
throw "sem_init() failed";}
453 #define XRDSYSTHREAD_BIND 0x001 458 #define XRDSYSTHREAD_HOLD 0x002 464 static int Cancel(pthread_t tid) {
return pthread_cancel(tid);}
466 static int Detach(pthread_t tid) {
return pthread_detach(tid);}
470 return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
473 static int Join(pthread_t tid,
void **ret) {
474 return pthread_join(tid, ret);
478 return pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
482 return pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
486 return pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, 0);
490 pthread_testcancel();
494 static pthread_t
ID(
void) {
return pthread_self();}
496 static int Kill(pthread_t tid) {
return pthread_cancel(tid);}
498 static unsigned long Num(
void);
500 static int Run(pthread_t *,
void *(*proc)(
void *),
void *arg,
501 int opts=0,
const char *desc = 0);
503 static int Same(pthread_t t1, pthread_t t2)
504 {
return pthread_equal(t1, t2);}
510 static int Signal(pthread_t tid,
int snum)
511 {
return pthread_kill(tid, snum);}
513 static int Wait(pthread_t tid);
XrdSysRWLockHelper(XrdSysRWLock &l, bool rd=1)
Definition: XrdSysPthread.hh:357
void UnLock()
Definition: XrdSysPthread.hh:141
XrdSysMutex * mtx
Definition: XrdSysPthread.hh:285
Definition: XrdSysPthread.hh:239
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:349
void ReadLock(int &status)
Definition: XrdSysPthread.hh:311
Definition: XrdSysPthread.hh:295
sem_t h_semaphore
Definition: XrdSysPthread.hh:435
pthread_rwlock_t lock
Definition: XrdSysPthread.hh:327
XrdSysRWLock * lck
Definition: XrdSysPthread.hh:365
int CondWait()
Definition: XrdSysPthread.hh:407
static void setDebug(XrdSysError *erp)
Definition: XrdSysPthread.hh:506
static int Kill(pthread_t tid)
Definition: XrdSysPthread.hh:496
void ReInitialize()
Definition: XrdSysPthread.hh:319
void UnLock()
Definition: XrdSysPthread.hh:272
static int Detach(pthread_t tid)
Definition: XrdSysPthread.hh:466
void ReadLock()
Definition: XrdSysPthread.hh:308
void Signal()
Definition: XrdSysPthread.hh:84
void Wait()
Definition: XrdSysPthread.hh:419
XrdSysRWLock()
Definition: XrdSysPthread.hh:316
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:460
Definition: XrdSysError.hh:89
pthread_mutex_t cmut
Definition: XrdSysPthread.hh:112
static int Cancel(pthread_t tid)
Definition: XrdSysPthread.hh:464
~XrdSysMutex()
Definition: XrdSysPthread.hh:225
static int Signal(pthread_t tid, int snum)
Definition: XrdSysPthread.hh:510
Definition: XrdSysPthread.hh:165
void Lock(XrdSysMutex *Mutex)
Definition: XrdSysPthread.hh:264
void Lock(XrdSysRWLock *lock, bool rd=1)
Definition: XrdSysPthread.hh:340
void WriteLock()
Definition: XrdSysPthread.hh:309
Definition: XrdSysPthread.hh:336
XrdSysRWLockHelper(XrdSysRWLock *l=0, bool rd=1)
Definition: XrdSysPthread.hh:351
static void setStackSize(size_t stsz)
Definition: XrdSysPthread.hh:508
static int Wait(pthread_t tid)
Definition: XrdSysPthread.hh:78
void Post()
Definition: XrdSysPthread.hh:415
int CondReadLock()
Definition: XrdSysPthread.hh:299
pthread_mutex_t cs
Definition: XrdSysPthread.hh:229
Definition: XrdSysPthread.hh:403
static void CancelPoint()
Definition: XrdSysPthread.hh:489
int CondWriteLock()
Definition: XrdSysPthread.hh:303
static pthread_t ID(void)
Definition: XrdSysPthread.hh:494
~XrdSysThread()
Definition: XrdSysPthread.hh:516
~XrdSysRWLock()
Definition: XrdSysPthread.hh:317
void Lock(XrdSysCondVar *CndVar)
Definition: XrdSysPthread.hh:133
static int SetCancelDeferred()
Definition: XrdSysPthread.hh:485
void Broadcast()
Definition: XrdSysPthread.hh:89
Definition: XrdSysPthread.hh:129
~XrdSysCondVarHelper()
Definition: XrdSysPthread.hh:152
XrdSysThread()
Definition: XrdSysPthread.hh:515
static int Join(pthread_t tid, void **ret)
Definition: XrdSysPthread.hh:473
void Lock()
Definition: XrdSysPthread.hh:220
static int SetCancelAsynchronous()
Definition: XrdSysPthread.hh:481
~XrdSysMutexHelper()
Definition: XrdSysPthread.hh:283
~XrdSysRWLockHelper()
Definition: XrdSysPthread.hh:363
~XrdSysSemaphore()
Definition: XrdSysPthread.hh:429
XrdSysCondVarHelper(XrdSysCondVar &CndVar)
Definition: XrdSysPthread.hh:147
int TimedLock(int wait_ms)
Definition: XrdSysPthread.hh:210
const char * condID
Definition: XrdSysPthread.hh:114
int CondLock()
Definition: XrdSysPthread.hh:169
void WriteLock(int &status)
Definition: XrdSysPthread.hh:312
void UnLock()
Definition: XrdSysPthread.hh:94
static int Same(pthread_t t1, pthread_t t2)
Definition: XrdSysPthread.hh:503
XrdSysMutex()
Definition: XrdSysPthread.hh:224
static int SetCancelOn()
Definition: XrdSysPthread.hh:477
XrdSysSemaphore(int semval=1, const char *=0)
Definition: XrdSysPthread.hh:425
static int SetCancelOff()
Definition: XrdSysPthread.hh:469
void UnLock()
Definition: XrdSysPthread.hh:222
static XrdSysError * eDest
Definition: XrdSysPthread.hh:519
XrdSysCondVarHelper(XrdSysCondVar *CndVar=0)
Definition: XrdSysPthread.hh:143
XrdSysMutexHelper(XrdSysMutex *mutex=0)
Definition: XrdSysPthread.hh:274
XrdSysMutexHelper(XrdSysMutex &mutex)
Definition: XrdSysPthread.hh:278
void UnLock()
Definition: XrdSysPthread.hh:314
static size_t stackSize
Definition: XrdSysPthread.hh:520
Definition: XrdSysPthread.hh:260
~XrdSysCondVar()
Definition: XrdSysPthread.hh:106
void Lock()
Definition: XrdSysPthread.hh:82
XrdSysCondVar * cnd
Definition: XrdSysPthread.hh:154
static unsigned long Num(void)