41 #ifndef CRL_MULTISENSE_THREAD_HH
42 #define CRL_MULTISENSE_THREAD_HH
50 #include <linux/futex.h>
51 #include <sys/syscall.h>
82 int32_t priority=0) :
m_flags(flags) {
85 pthread_attr_init(&tattr);
90 if (-1 != scheduler) {
91 struct sched_param sattr = {0};
96 if (0 != pthread_attr_setschedpolicy(&tattr, scheduler))
97 CRL_EXCEPTION(
"pthread_attr_setschedpolicy(scheduler=%d) failed: %s",
98 scheduler, strerror(errno));
102 sattr.sched_priority = priority;
103 if (0 != pthread_attr_setschedparam(&tattr, &sattr))
104 CRL_EXCEPTION(
"pthread_attr_setschedparam(pri=%d) failed: %s",
105 priority, strerror(errno));
110 if (0 != pthread_attr_setinheritsched(&tattr, PTHREAD_EXPLICIT_SCHED))
111 CRL_EXCEPTION(
"pthread_attr_setinheritsched(explicit) failed: %s",
119 0 != pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED))
120 CRL_EXCEPTION(
"pthread_attr_setdetachstate() failed: %s", strerror(errno));
125 if (0 != pthread_create(&
m_id, &tattr, functionP, contextP))
126 CRL_EXCEPTION(
"pthread_create() failed: %s", strerror(errno));
131 0 !=pthread_join(
m_id, NULL))
132 CRL_DEBUG(
"pthread_join() failed: %s\n", strerror(errno));
149 if (0 != pthread_mutex_init(&
m_mutex, NULL))
155 pthread_mutex_destroy(&
m_mutex);
187 void lock(pthread_mutex_t *lockP) {
224 ts.tv_nsec = (timeout - ts.tv_sec) * 1e9;
227 int32_t ret =
wait_(&ts);
231 else if (ETIMEDOUT == ret)
249 const int32_t nval = __sync_add_and_fetch(&
m_avail, 1);
251 syscall(__NR_futex, &
m_avail, FUTEX_WAKE, nval, NULL, 0, 0);
264 return __sync_bool_compare_and_swap(&
m_avail, val, 0);
286 inline int32_t
wait_(
const struct timespec *tsP=NULL) {
292 if (val >= 1 && __sync_bool_compare_and_swap(&
m_avail, val, val - 1))
300 const int32_t ret = syscall(__NR_futex, &
m_avail, FUTEX_WAIT, val, tsP, 0, 0);
307 if (ETIMEDOUT == ret || -1 == ret)
344 const double& timeout) {