X-Git-Url: http://git.harvie.cz/?a=blobdiff_plain;f=c%2Fpthread_extra%2Fpthread_extra.h;h=ca5de70c6ae121025b2935e74345c1fa107fbc78;hb=70bd1c94dee46dac0885831ccce3d1840388656e;hp=e1fe782cec638133d401592152c7c582644e7a59;hpb=5251b63c80878b87d8cb808efd3978bd819c4f8b;p=mirrors%2FPrograms.git diff --git a/c/pthread_extra/pthread_extra.h b/c/pthread_extra/pthread_extra.h index e1fe782..ca5de70 100644 --- a/c/pthread_extra/pthread_extra.h +++ b/c/pthread_extra/pthread_extra.h @@ -2,20 +2,67 @@ #define __PTHREAD_EXTRA_H__ #include -#include #include #include +#include +//#include #define PTHREAD_XTIME_NOBLOCK (&(struct timespec){ .tv_sec = 0, .tv_nsec = 0 }) #define PTHREAD_XTIME_FOREVER NULL -// Message queues +// User data + +#define PTHREAD_XTHREADS_MAX 65535 +#define PTHREAD_XNULL ((pthread_t)NULL) + +#ifdef __PTHREAD_EXTRA_INTERNAL +typedef struct pthread_user_data_internal_t { + pthread_t tid; //Thread ID + void *usr; //User pointer + //Internaly used members: + sig_atomic_t running; //pthread_pause +} pthread_user_data_internal_t; + +pthread_user_data_internal_t* pthread_user_data_internal(pthread_t thread); +int pthread_user_data_lock(); +int pthread_user_data_unlock(); +#endif //__PTHREAD_EXTRA_INTERNAL -#define PTHREAD_XMQ_FRONT true -#define PTHREAD_XMQ_BACK false +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); -#define PTHREAD_XMQ_RECV false -#define PTHREAD_XMQ_PEEK true +// Pausing + +//GDB: handle SIG34 nostop noprint +#define PTHREAD_XSIG_STOP (SIGRTMIN+0) +#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(); +void pthread_pause_disable(); +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 + +//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; @@ -31,10 +78,13 @@ typedef struct pthread_mq_t { 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