29 #include <cwidget/generic/util/exception.h> 58 int get_errnum()
const {
return errnum; }
60 std::string errmsg()
const;
72 int get_errnum()
const {
return errnum; }
73 std::string errmsg()
const;
84 std::string errmsg()
const;
91 std::string errmsg()
const;
111 static void *bootstrap(
void *p)
133 pthread_attr_t attrs;
139 pthread_attr_init(&attrs);
145 void set_inherit_sched(
int i)
147 pthread_attr_setinheritsched(&attrs, i);
150 int get_inherit_sched()
const 153 pthread_attr_getinheritsched(&attrs, &rval);
157 void set_sched_param(
const sched_param &sp)
159 pthread_attr_setschedparam(&attrs, &sp);
162 sched_param get_sched_param()
const 165 pthread_attr_getschedparam(&attrs, &rval);
169 void set_sched_policy(
int p)
171 pthread_attr_setschedpolicy(&attrs, p);
174 int get_sched_policy()
const 177 pthread_attr_getschedpolicy(&attrs, &rval);
181 void set_scope(
int p)
183 pthread_attr_setscope(&attrs, p);
186 int get_scope()
const 189 pthread_attr_getscope(&attrs, &rval);
195 pthread_attr_destroy(&attrs);
214 F *tmp =
new F(thunk);
216 if(pthread_create(&tid, &a.attrs, &thread::bootstrap<F>, tmp) != 0)
235 int rval = pthread_join(tid, NULL);
309 pthread_mutexattr_t attrs;
316 pthread_mutexattr_init(&attrs);
321 pthread_mutexattr_init(&attrs);
322 pthread_mutexattr_settype(&attrs, kind);
327 pthread_mutexattr_destroy(&attrs);
330 int settype(
int kind)
332 return pthread_mutexattr_settype(&attrs, kind);
338 pthread_mutexattr_gettype(&attrs, &rval);
359 :parent(_parent), locked(
false)
370 pthread_mutex_lock(&parent.m);
377 pthread_mutex_unlock(&parent.m);
381 bool get_locked()
const 389 pthread_mutex_unlock(&parent.m);
414 pthread_mutex_unlock(&parent.m);
422 locked = pthread_mutex_trylock(&parent.m);
427 pthread_mutex_unlock(&parent.m);
431 bool get_locked()
const 439 pthread_mutex_init(&m, NULL);
444 pthread_mutex_init(&m, &a.attrs);
449 pthread_mutex_destroy(&m);
475 pthread_cond_init(&cond, NULL);
481 pthread_cond_broadcast(&cond);
482 pthread_cond_destroy(&cond);
487 pthread_cond_signal(&cond);
492 pthread_cond_broadcast(&cond);
501 template<
typename Lock>
507 pthread_cleanup_push((
void (*)(
void*))pthread_mutex_unlock, &l.parent.m);
508 pthread_cond_wait(&cond, &l.parent.m);
509 pthread_cleanup_pop(0);
520 template<
typename Lock,
typename Pred>
521 void wait(
const Lock &l, Pred p)
545 template<
typename Lock>
553 pthread_cleanup_push((
void(*)(
void *))&pthread_mutex_unlock, &l.parent.m);
554 while((rval = pthread_cond_timedwait(&cond, &l.parent.m, &until)) == EINTR)
556 pthread_cleanup_pop(0);
558 return rval != ETIMEDOUT;
571 template<
typename Lock,
typename Pred>
572 bool timed_wait(
const Lock &l,
const timespec &until,
const Pred &p)
579 if(!timed_wait(l, until))
608 box &operator=(
const box &other);
618 :val(_val), filled(true)
630 void put(
const T &t);
638 bool try_take(T &out);
648 bool try_put(
const T &t);
653 bool timed_take(T &out,
const timespec &until);
658 bool timed_put(
const T &t,
const timespec &until);
664 template<
typename Mutator>
665 void update(
const Mutator &m);
696 bool timed_take(
const timespec &until);
697 bool timed_put(
const timespec &until);
699 template<
typename Mutator>
700 void update(
const Mutator &m)
727 bool operator()()
const 743 bool operator()()
const 922 template<
typename Mutator>
966 bool try_take(
const T * &out)
971 bool timed_take(
const T * &out,
const timespec &until)
976 void put(
const T *in)
981 bool try_put(
const T *in)
986 bool timed_put(
const T *in,
const timespec &until)
1006 void operator()()
const 1012 template<
typename F>