23 ClassImp(TPosixThread);
30 Int_t TPosixThread::Run(TThread *th)
34 pthread_attr_t *attr =
new pthread_attr_t;
36 pthread_attr_init(attr);
39 det = (th->fDetached) ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE;
41 pthread_attr_setdetachstate(attr, det);
45 const size_t requiredStackSize = 1024*1024*2;
47 if (!pthread_attr_getstacksize(attr, &stackSize)
48 && stackSize < requiredStackSize) {
49 pthread_attr_setstacksize(attr, requiredStackSize);
51 int ierr = pthread_create(&
id, attr, &TThread::Function, th);
52 if (!ierr) th->fId = (Long_t)
id;
54 pthread_attr_destroy(attr);
66 Int_t TPosixThread::Join(TThread *th,
void **ret)
68 return pthread_join((pthread_t) th->fId, ret);
74 Int_t TPosixThread::Exit(
void *ret)
85 Int_t TPosixThread::Kill(TThread *th)
87 return pthread_cancel((pthread_t) th->fId);
94 Int_t TPosixThread::SetCancelOff()
96 return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
103 Int_t TPosixThread::SetCancelOn()
105 return pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
113 Int_t TPosixThread::SetCancelAsynchronous()
115 return pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
123 Int_t TPosixThread::SetCancelDeferred()
125 return pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, 0);
131 Int_t TPosixThread::CancelPoint()
134 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &istate);
135 pthread_testcancel();
136 pthread_setcancelstate(istate, 0);
144 Int_t TPosixThread::CleanUpPush(
void **main,
void *free,
void *arg)
147 if (!free) Error(
"CleanUpPush",
"cleanup rountine = 0");
148 new TPosixThreadCleanUp(main, free, arg);
155 Int_t TPosixThread::CleanUpPop(
void **main,Int_t exe)
159 if (!main || !*main)
return 1;
160 TPosixThreadCleanUp *l = (TPosixThreadCleanUp*)(*main);
161 if (!l->fRoutine) Error(
"CleanUpPop",
"cleanup routine = 0");
162 if (exe && l->fRoutine) ((void (*)(
void*))(l->fRoutine))(l->fArgument);
163 *main = l->fNext;
delete l;
170 Int_t TPosixThread::CleanUp(
void **main)
173 Info(
"Cleanup",
"cleanup 0x%lx", (Long_t)*main);
174 while (!CleanUpPop(main, 1)) { }
181 Long_t TPosixThread::SelfId()
183 return (Long_t) pthread_self();
193 TPosixThreadCleanUp::TPosixThreadCleanUp(
void **main,
void *routine,
void *arg)
195 fNext = (TPosixThreadCleanUp*)*main;
196 fRoutine = routine; fArgument = arg;