void** pthread_user_data_ptr(pthread_t thread);
void* pthread_user_data_get(pthread_t thread);
void pthread_user_data_set(pthread_t thread, void *usr);
+void pthread_user_data_cleanup(void * arg);
// Pausing
#define PTHREAD_XSIG_CONT (SIGRTMIN+1)
#define PTHREAD_XSIGRTMIN (SIGRTMIN+2) //First unused RT signal
+int pthread_extra_create(pthread_t *restrict thread,
+ const pthread_attr_t *restrict attr,
+ void *(*start_routine)(void *),
+ void *restrict arg);
void pthread_unpause_handler();
void pthread_pause_handler();
void pthread_pause_enable();
int pthread_pause(pthread_t thread);
int pthread_unpause(pthread_t thread);
+int pthread_pause_reschedule(pthread_t thread);
+int pthread_extra_yield();
// Message queues
-#define PTHREAD_XMQ_FRONT true
-#define PTHREAD_XMQ_BACK false
-
-#define PTHREAD_XMQ_RECV false
-#define PTHREAD_XMQ_PEEK true
+//Flags
+typedef uint8_t pthread_mq_flags_t;
+#define PTHREAD_XMQ_NONE 0 ///< No flags specified (default behaviour)
+#define PTHREAD_XMQ_FRONT 1 ///< Send to front of the queue (scheduled for next receive)
+#define PTHREAD_XMQ_BACK PTHREAD_XMQ_NONE ///< Send to back of the queue (default)
+#define PTHREAD_XMQ_PEEK 2 ///< Only peek, do not remove received item
+#define PTHREAD_XMQ_RECV PTHREAD_XMQ_NONE ///< Remove received item from queue (default)
+#define PTHREAD_XMQ_OVERW 4 ///< Overwrite item if queue full
typedef struct pthread_mq_t {
pthread_mutex_t lock;
bool pthread_mq_init(pthread_mq_t *mq, size_t msg_size, size_t msg_count_max);
void pthread_mq_free(pthread_mq_t *mq);
-size_t pthread_mq_waiting(pthread_mq_t *mq);
+
bool pthread_mq_reset(pthread_mq_t *mq);
-bool pthread_mq_send_generic(pthread_mq_t *mq, void * data, bool to_front, const struct timespec *restrict abs_timeout);
-bool pthread_mq_receive_generic(pthread_mq_t *mq, void * data, bool peek, const struct timespec *restrict abs_timeout);
+bool pthread_mq_send_generic(pthread_mq_t *mq, void * data, pthread_mq_flags_t flags, const struct timespec *restrict abs_timeout);
+bool pthread_mq_receive_generic(pthread_mq_t *mq, void * data, pthread_mq_flags_t flags, const struct timespec *restrict abs_timeout);
+
+size_t pthread_mq_waiting(pthread_mq_t *mq);
+size_t pthread_mq_vacant(pthread_mq_t *mq);
// Multi mutex locking