int Ns_GetThreadLocalStorage(Ns_ThreadLocalStorage *tls, void **p) { *p = Ns_TlsGet((Ns_Tls *) tls); return NS_OK; }
Ns_Conn * Ns_GetConn(void) { ConnData *dataPtr; dataPtr = Ns_TlsGet(&ctdtls); return (dataPtr ? ((Ns_Conn *) dataPtr->connPtr) : NULL); }
static Thread * GetThread(void) { Thread *thrPtr; thrPtr = Ns_TlsGet(&key); if (thrPtr == NULL) { thrPtr = NewThread(NULL); } return thrPtr; }
gdbm_error * gdbm_perrno(void) { static Ns_Tls tls; gdbm_error *errPtr; if (tls == NULL) { Ns_MasterLock(); if (tls == NULL) { Ns_TlsAlloc(&tls, gdbm_free); } Ns_MasterUnlock(); } errPtr = Ns_TlsGet(&tls); if (errPtr == NULL) { errPtr = gdbm_malloc(sizeof(gdbm_error)); *errPtr = GDBM_NO_ERROR; Ns_TlsSet(&tls, errPtr); } return errPtr; }
void WorkThread(void *arg) { int i = (int) arg; int *ip; time_t now; Ns_Thread self; char name[32]; sprintf(name, "-work:%d-", i); Ns_ThreadSetName(name); if (i == 2) { Ns_RWLockWrLock(&rwlock); Msg("rwlock write aquired"); sleep(2); } else { Ns_RWLockRdLock(&rwlock); Msg("rwlock read aquired aquired"); sleep(1); } Ns_CsEnter(&cs); Msg("enter critical section once"); Ns_CsEnter(&cs); Msg("enter critical section twice"); Ns_CsLeave(&cs); Ns_CsLeave(&cs); Ns_ThreadSelf(&self); arg = Ns_TlsGet(&key); Ns_SemaWait(&sema); Msg("got semaphore posted from main"); if (arg == NULL) { arg = ns_malloc(sizeof(int)); Ns_TlsSet(&key, arg); } ip = arg; *ip = i; if (i == 5) { Ns_Time to; int st; Ns_GetTime(&to); Msg("time: %ld %ld", to.sec, to.usec); Ns_IncrTime(&to, 5, 0); Msg("time: %ld %ld", to.sec, to.usec); Ns_MutexLock(&lock); time(&now); Msg("timed wait starts: %s", ns_ctime(&now)); st = Ns_CondTimedWait(&cond, &lock, &to); Ns_MutexUnlock(&lock); time(&now); Msg("timed wait ends: %s - status: %d", ns_ctime(&now), st); } if (i == 9) { Msg("sleep 4 seconds start"); sleep(4); Msg("sleep 4 seconds done"); } time(&now); Ns_RWLockUnlock(&rwlock); Msg("rwlock unlocked"); Msg("exiting"); Ns_ThreadExit((void *) i); }