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);
144 pthread_attr_destroy(&attrs);
163 F *tmp =
new F(thunk);
165 if(pthread_create(&tid, &a.attrs, &thread::bootstrap<F>, tmp) != 0)
184 int rval = pthread_join(tid, NULL);
258 pthread_mutexattr_t attrs;
265 pthread_mutexattr_init(&attrs);
270 pthread_mutexattr_init(&attrs);
271 pthread_mutexattr_settype(&attrs, kind);
276 pthread_mutexattr_destroy(&attrs);
279 int settype(
int kind)
281 return pthread_mutexattr_settype(&attrs, kind);
287 pthread_mutexattr_gettype(&attrs, &rval);
308 :parent(_parent), locked(
false)
319 pthread_mutex_lock(&parent.m);
326 pthread_mutex_unlock(&parent.m);
330 bool get_locked()
const 338 pthread_mutex_unlock(&parent.m);
363 pthread_mutex_unlock(&parent.m);
371 locked = pthread_mutex_trylock(&parent.m);
376 pthread_mutex_unlock(&parent.m);
380 bool get_locked()
const 388 pthread_mutex_init(&m, NULL);
393 pthread_mutex_init(&m, &a.attrs);
398 pthread_mutex_destroy(&m);
424 pthread_cond_init(&cond, NULL);
430 pthread_cond_broadcast(&cond);
431 pthread_cond_destroy(&cond);
436 pthread_cond_signal(&cond);
441 pthread_cond_broadcast(&cond);
450 template<
typename Lock>
456 pthread_cleanup_push((
void (*)(
void*))pthread_mutex_unlock, &l.parent.m);
457 pthread_cond_wait(&cond, &l.parent.m);
458 pthread_cleanup_pop(0);
469 template<
typename Lock,
typename Pred>
470 void wait(
const Lock &l, Pred p)
494 template<
typename Lock>
502 pthread_cleanup_push((
void(*)(
void *))&pthread_mutex_unlock, &l.parent.m);
503 while((rval = pthread_cond_timedwait(&cond, &l.parent.m, &until)) == EINTR)
505 pthread_cleanup_pop(0);
507 return rval != ETIMEDOUT;
520 template<
typename Lock,
typename Pred>
521 bool timed_wait(
const Lock &l,
const timespec &until,
const Pred &p)
528 if(!timed_wait(l, until))
557 box &operator=(
const box &other);
567 :val(_val), filled(true)
579 void put(
const T &t);
587 bool try_take(T &out);
597 bool try_put(
const T &t);
602 bool timed_take(T &out,
const timespec &until);
607 bool timed_put(
const T &t,
const timespec &until);
613 template<
typename Mutator>
614 void update(
const Mutator &m);
645 bool timed_take(
const timespec &until);
646 bool timed_put(
const timespec &until);
648 template<
typename Mutator>
649 void update(
const Mutator &m)
676 bool operator()()
const 692 bool operator()()
const 871 template<
typename Mutator>
899 void operator()()
const