30 #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);
145 pthread_attr_destroy(&attrs);
164 F *tmp =
new F(thunk);
166 if(pthread_create(&tid, &a.attrs, &thread::bootstrap<F>, tmp) != 0)
185 int rval = pthread_join(tid, NULL);
259 pthread_mutexattr_t attrs;
266 pthread_mutexattr_init(&attrs);
271 pthread_mutexattr_init(&attrs);
272 pthread_mutexattr_settype(&attrs, kind);
277 pthread_mutexattr_destroy(&attrs);
280 int settype(
int kind)
282 return pthread_mutexattr_settype(&attrs, kind);
288 pthread_mutexattr_gettype(&attrs, &rval);
309 :parent(_parent), locked(
false)
320 pthread_mutex_lock(&parent.m);
327 pthread_mutex_unlock(&parent.m);
331 bool get_locked()
const
339 pthread_mutex_unlock(&parent.m);
364 pthread_mutex_unlock(&parent.m);
372 locked = pthread_mutex_trylock(&parent.m);
377 pthread_mutex_unlock(&parent.m);
381 bool get_locked()
const
389 pthread_mutex_init(&m, NULL);
394 pthread_mutex_init(&m, &a.attrs);
399 pthread_mutex_destroy(&m);
425 pthread_cond_init(&cond, NULL);
431 pthread_cond_broadcast(&cond);
432 pthread_cond_destroy(&cond);
437 pthread_cond_signal(&cond);
442 pthread_cond_broadcast(&cond);
451 template<
typename Lock>
457 pthread_cleanup_push((
void (*)(
void*))pthread_mutex_unlock, &l.parent.m);
458 pthread_cond_wait(&cond, &l.parent.m);
459 pthread_cleanup_pop(0);
470 template<
typename Lock,
typename Pred>
471 void wait(
const Lock &l, Pred p)
495 template<
typename Lock>
503 pthread_cleanup_push((
void(*)(
void *))&pthread_mutex_unlock, &l.parent.m);
504 while((rval = pthread_cond_timedwait(&cond, &l.parent.m, &until)) == EINTR)
506 pthread_cleanup_pop(0);
508 return rval != ETIMEDOUT;
521 template<
typename Lock,
typename Pred>
522 bool timed_wait(
const Lock &l,
const timespec &until,
const Pred &p)
558 box &operator=(
const box &other);
568 :val(_val), filled(true)
614 template<
typename Mutator>
649 template<
typename Mutator>
650 void update(
const Mutator &m)
677 bool operator()()
const
693 bool operator()()
const
872 template<
typename Mutator>
900 void operator()()
const