00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "TPosixThread.h"
00021
00022
00023 ClassImp(TPosixThread)
00024
00025
00026
00027 Int_t TPosixThread::Run(TThread *th)
00028 {
00029
00030
00031 int det;
00032 pthread_t id;
00033 pthread_attr_t *attr = new pthread_attr_t;
00034
00035 pthread_attr_init(attr);
00036
00037
00038 det = (th->fDetached) ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE;
00039
00040 pthread_attr_setdetachstate(attr, det);
00041 int ierr = pthread_create(&id, attr, &TThread::Function, th);
00042 if (!ierr) th->fId = (Long_t) id;
00043
00044 pthread_attr_destroy(attr);
00045 delete attr;
00046
00047 return ierr;
00048 }
00049
00050
00051 Int_t TPosixThread::Join(TThread *th, void **ret)
00052 {
00053
00054
00055
00056
00057 return pthread_join((pthread_t) th->fId, ret);
00058 }
00059
00060
00061 Int_t TPosixThread::Exit(void *ret)
00062 {
00063
00064
00065 pthread_exit(ret);
00066 return 0;
00067 }
00068
00069
00070 Int_t TPosixThread::Kill(TThread *th)
00071 {
00072
00073
00074
00075 return pthread_cancel((pthread_t) th->fId);
00076 }
00077
00078
00079 Int_t TPosixThread::SetCancelOff()
00080 {
00081
00082
00083 return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
00084 }
00085
00086
00087 Int_t TPosixThread::SetCancelOn()
00088 {
00089
00090
00091 return pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
00092 }
00093
00094
00095 Int_t TPosixThread::SetCancelAsynchronous()
00096 {
00097
00098
00099
00100
00101 return pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
00102 }
00103
00104
00105 Int_t TPosixThread::SetCancelDeferred()
00106 {
00107
00108
00109
00110 return pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, 0);
00111 }
00112
00113
00114 Int_t TPosixThread::CancelPoint()
00115 {
00116
00117
00118 int istate;
00119 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &istate);
00120 pthread_testcancel();
00121 pthread_setcancelstate(istate, 0);
00122
00123 return 0;
00124 }
00125
00126
00127 Int_t TPosixThread::CleanUpPush(void **main, void *free, void *arg)
00128 {
00129
00130
00131
00132 if (!free) Error("CleanUpPush", "cleanup rountine = 0");
00133 new TPosixThreadCleanUp(main, free, arg);
00134 return 0;
00135 }
00136
00137
00138 Int_t TPosixThread::CleanUpPop(void **main,Int_t exe)
00139 {
00140
00141
00142
00143
00144 if (!main || !*main) return 1;
00145 TPosixThreadCleanUp *l = (TPosixThreadCleanUp*)(*main);
00146 if (!l->fRoutine) Error("CleanUpPop", "cleanup routine = 0");
00147 if (exe && l->fRoutine) ((void (*)(void*))(l->fRoutine))(l->fArgument);
00148 *main = l->fNext; delete l;
00149 return 0;
00150 }
00151
00152
00153 Int_t TPosixThread::CleanUp(void **main)
00154 {
00155
00156
00157 if (gDebug > 0)
00158 Info("Cleanup", "cleanup 0x%lx", (Long_t)*main);
00159 while (!CleanUpPop(main, 1)) { }
00160 return 0;
00161 }
00162
00163
00164 Long_t TPosixThread::SelfId()
00165 {
00166
00167
00168 return (Long_t) pthread_self();
00169 }
00170
00171
00172
00173
00174
00175
00176 TPosixThreadCleanUp::TPosixThreadCleanUp(void **main, void *routine, void *arg)
00177 {
00178
00179 fNext = (TPosixThreadCleanUp*)*main;
00180 fRoutine = routine; fArgument = arg;
00181 *main = this;
00182 }