29 #include <cwidget/generic/util/exception.h>
59 int get_errnum()
const {
return errnum; }
61 std::string errmsg()
const;
73 int get_errnum()
const {
return errnum; }
74 std::string errmsg()
const;
85 std::string errmsg()
const;
92 std::string errmsg()
const;
112 static void *bootstrap(
void *p)
134 pthread_attr_t attrs;
140 pthread_attr_init(&attrs);
146 void set_inherit_sched(
int i)
148 pthread_attr_setinheritsched(&attrs, i);
151 int get_inherit_sched()
const
154 pthread_attr_getinheritsched(&attrs, &rval);
158 void set_sched_param(
const sched_param &sp)
160 pthread_attr_setschedparam(&attrs, &sp);
163 sched_param get_sched_param()
const
166 pthread_attr_getschedparam(&attrs, &rval);
170 void set_sched_policy(
int p)
172 pthread_attr_setschedpolicy(&attrs, p);
175 int get_sched_policy()
const
178 pthread_attr_getschedpolicy(&attrs, &rval);
182 void set_scope(
int p)
184 pthread_attr_setscope(&attrs, p);
187 int get_scope()
const
190 pthread_attr_getscope(&attrs, &rval);
196 pthread_attr_destroy(&attrs);
215 F *tmp =
new F(thunk);
217 if(pthread_create(&tid, &a.attrs, &thread::bootstrap<F>, tmp) != 0)
236 int rval = pthread_join(tid, NULL);
310 pthread_mutexattr_t attrs;
317 pthread_mutexattr_init(&attrs);
322 pthread_mutexattr_init(&attrs);
323 pthread_mutexattr_settype(&attrs, kind);
328 pthread_mutexattr_destroy(&attrs);
331 int settype(
int kind)
333 return pthread_mutexattr_settype(&attrs, kind);
339 pthread_mutexattr_gettype(&attrs, &rval);
360 :parent(_parent), locked(
false)
371 pthread_mutex_lock(&parent.m);
378 pthread_mutex_unlock(&parent.m);
382 bool get_locked()
const
390 pthread_mutex_unlock(&parent.m);
415 pthread_mutex_unlock(&parent.m);
423 locked = pthread_mutex_trylock(&parent.m);
428 pthread_mutex_unlock(&parent.m);
432 bool get_locked()
const
440 pthread_mutex_init(&m, NULL);
445 pthread_mutex_init(&m, &a.attrs);
450 pthread_mutex_destroy(&m);
476 pthread_cond_init(&cond, NULL);
482 pthread_cond_broadcast(&cond);
483 pthread_cond_destroy(&cond);
488 pthread_cond_signal(&cond);
493 pthread_cond_broadcast(&cond);
502 template<
typename Lock>
508 pthread_cleanup_push((
void (*)(
void*))pthread_mutex_unlock, &l.parent.m);
509 pthread_cond_wait(&cond, &l.parent.m);
510 pthread_cleanup_pop(0);
521 template<
typename Lock,
typename Pred>
522 void wait(
const Lock &l, Pred p)
546 template<
typename Lock>
554 pthread_cleanup_push((
void(*)(
void *))&pthread_mutex_unlock, &l.parent.m);
555 while((rval = pthread_cond_timedwait(&cond, &l.parent.m, &until)) == EINTR)
557 pthread_cleanup_pop(0);
559 return rval != ETIMEDOUT;
572 template<
typename Lock,
typename Pred>
573 bool timed_wait(
const Lock &l,
const timespec &until,
const Pred &p)
609 box &operator=(
const box &other);
619 :val(_val), filled(true)
631 void put(
const T &t);
654 bool timed_take(T &out,
const timespec &until);
659 bool timed_put(
const T &t,
const timespec &until);
665 template<
typename Mutator>
666 void update(
const Mutator &m);
700 template<
typename Mutator>
701 void update(
const Mutator &m)
728 bool operator()()
const
744 bool operator()()
const
923 template<
typename Mutator>
967 bool try_take(
const T * &out)
972 bool timed_take(
const T * &out,
const timespec &until)
977 void put(
const T *in)
982 bool try_put(
const T *in)
987 bool timed_put(
const T *in,
const timespec &until)
1007 void operator()()
const
1013 template<
typename F>