1 #ifndef __PTHREAD_EXTRA_H__
2 #define __PTHREAD_EXTRA_H__
10 #define PTHREAD_XTIME_NOBLOCK (&(struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
11 #define PTHREAD_XTIME_FOREVER NULL
15 #define PTHREAD_XSIG_STOP (SIGRTMIN+0)
16 #define PTHREAD_XSIG_CONT (SIGRTMIN+1)
17 #define PTHREAD_XSIGRTMIN (SIGRTMIN+2) //First unused RT signal
19 #define pthread_pause(t) (pthread_kill((t), PTHREAD_XSIG_STOP));
20 #define pthread_unpause(t) (pthread_kill((t), PTHREAD_XSIG_CONT));
22 void pthread_unpause_handler();
23 void pthread_pause_handler();
24 void pthread_pause_enable();
28 #define PTHREAD_XMQ_FRONT true
29 #define PTHREAD_XMQ_BACK false
31 #define PTHREAD_XMQ_RECV false
32 #define PTHREAD_XMQ_PEEK true
34 typedef struct pthread_mq_t
{
36 pthread_cond_t cond_readable
;
37 pthread_cond_t cond_writable
;
46 bool pthread_mq_init(pthread_mq_t
*mq
, size_t msg_size
, size_t msg_count_max
);
47 void pthread_mq_free(pthread_mq_t
*mq
);
48 size_t pthread_mq_waiting(pthread_mq_t
*mq
);
49 bool pthread_mq_reset(pthread_mq_t
*mq
);
50 bool pthread_mq_send_generic(pthread_mq_t
*mq
, void * data
, bool to_front
, const struct timespec
*restrict abs_timeout
);
51 bool pthread_mq_receive_generic(pthread_mq_t
*mq
, void * data
, bool peek
, const struct timespec
*restrict abs_timeout
);
53 // Multi mutex locking
55 #define pthread_mutex_swap(a, b) { pthread_mutex_t *s; s = (a); a = (b); b = s; }
57 #define pthread_mutex_lock_two(a,b) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, true, NULL)
58 #define pthread_mutex_timedlock_two(a,b,tm) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, true, (tm))
59 #define pthread_mutex_trylock_two(a,b) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, false, NULL)
61 #define pthread_mutex_lock_multi(lcks,cnt) pthread_mutex_timedlock_multi_generic((lcks),(cnt),true,NULL)
62 #define pthread_mutex_timedlock_multi(lcks,cnt,tm) pthread_mutex_timedlock_multi_generic((lcks),(cnt),true,(tm))
63 #define pthread_mutex_trylock_multi(lcks,cnt) pthread_mutex_timedlock_multi_generic((lcks),(cnt),false,NULL)
65 int pthread_mutex_timedlock_multi_generic(pthread_mutex_t
**lck
, int cnt
, bool block
, const struct timespec
*restrict abs_timeout
);
68 #endif //__PTHREAD_EXTRA_H__