1 #ifndef method_thread_h
2 #define method_thread_h
4 // method_thread(): start a thread that runs an object method.
5 // returns a pthread_t on success, and zero on error.
11 #include "lang/verify.h"
14 method_thread_parent(void *(*fn)(void *), void *arg, bool detach)
18 pthread_attr_init(&attr);
19 // set stack size to 100K, so we don't run out of memory
20 pthread_attr_setstacksize(&attr, 100*1024);
21 int err = pthread_create(&th, &attr, fn, arg);
22 pthread_attr_destroy(&attr);
24 fprintf(stderr, "pthread_create ret %d %s\n", err, strerror(err));
29 // don't keep thread state around after exit, to avoid
30 // running out of threads. set detach==false if you plan
32 VERIFY(pthread_detach(th) == 0);
41 // defer pthread_cancel() by default. check explicitly by
42 // enabling then pthread_testcancel().
43 int oldstate, oldtype;
44 VERIFY(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate) == 0);
45 VERIFY(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype) == 0);
48 template <class C> pthread_t
49 method_thread(C *o, bool detach, void (C::*m)())
55 static void *yyy(void *vvv) {
58 void (C::*m)() = x->m;
60 method_thread_child();
68 return method_thread_parent(&XXX::yyy, (void *) x, detach);
71 template <class C, class A> pthread_t
72 method_thread(C *o, bool detach, void (C::*m)(A), A a)
79 static void *yyy(void *vvv) {
82 void (C::*m)(A ) = x->m;
85 method_thread_child();
94 return method_thread_parent(&XXX::yyy, (void *) x, detach);
98 // ~xavid: this causes a bizzare compile error on OS X.5 when
99 // it's declared in the function, so I moved it out here.
100 template <class C, class A1, class A2>
104 void (C::*m)(A1 a1, A2 a2);
107 static void *yyy(void *vvv) {
110 void (C::*m)(A1 , A2 ) = x->m;
114 method_thread_child();
121 template <class C, class A1, class A2> pthread_t
122 method_thread(C *o, bool detach, void (C::*m)(A1 , A2 ), A1 a1, A2 a2)
124 XXX<C,A1,A2> *x = new XXX<C,A1,A2>;
129 return method_thread_parent(&XXX<C,A1,A2>::yyy, (void *) x, detach);
132 template <class C, class A1, class A2, class A3> pthread_t
133 method_thread(C *o, bool detach, void (C::*m)(A1 , A2, A3 ), A1 a1, A2 a2, A3 a3)
138 void (C::*m)(A1 a1, A2 a2, A3 a3);
142 static void *yyy(void *vvv) {
145 void (C::*m)(A1 , A2 , A3 ) = x->m;
150 method_thread_child();
161 return method_thread_parent(&XXX::yyy, (void *) x, detach);