Pthread pause based on pthread user data
[mirrors/Programs.git] / c / pthread_extra / pthread_extra.h
CommitLineData
3aac2619
TM
1#ifndef __PTHREAD_EXTRA_H__
2#define __PTHREAD_EXTRA_H__
3
4#include <pthread.h>
3aac2619
TM
5#include <stdbool.h>
6#include <stdint.h>
a8e71e8f 7#include <signal.h>
88342701 8//#include <time.h>
3aac2619
TM
9
10#define PTHREAD_XTIME_NOBLOCK (&(struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
11#define PTHREAD_XTIME_FOREVER NULL
12
88342701 13// User data
a8e71e8f 14
88342701
TM
15#define PTHREAD_XTHREADS_MAX 65535
16#define PTHREAD_XNULL ((pthread_t)NULL)
17
18#ifdef __PTHREAD_EXTRA_INTERNAL
19typedef struct pthread_user_data_internal_t {
20 pthread_t tid; //Thread ID
21 sig_atomic_t running; //Internaly used by pthread_pause
22 void *usr; //User pointer
23} pthread_user_data_internal_t;
24
25pthread_user_data_internal_t* pthread_user_data_internal(pthread_t thread);
26#endif //__PTHREAD_EXTRA_INTERNAL
27
28void** pthread_user_data_ptr(pthread_t thread);
29void* pthread_user_data_get(pthread_t thread);
30void pthread_user_data_set(pthread_t thread, void *usr);
31
32// Pausing
33
34//GDB: handle SIG34 nostop noprint
a8e71e8f
TM
35#define PTHREAD_XSIG_STOP (SIGRTMIN+0)
36#define PTHREAD_XSIG_CONT (SIGRTMIN+1)
37#define PTHREAD_XSIGRTMIN (SIGRTMIN+2) //First unused RT signal
38
a8e71e8f
TM
39void pthread_unpause_handler();
40void pthread_pause_handler();
41void pthread_pause_enable();
88342701
TM
42int pthread_pause(pthread_t thread);
43int pthread_unpause(pthread_t thread);
a8e71e8f 44
3aac2619
TM
45// Message queues
46
47#define PTHREAD_XMQ_FRONT true
48#define PTHREAD_XMQ_BACK false
49
50#define PTHREAD_XMQ_RECV false
51#define PTHREAD_XMQ_PEEK true
52
53typedef struct pthread_mq_t {
54 pthread_mutex_t lock;
55 pthread_cond_t cond_readable;
56 pthread_cond_t cond_writable;
5251b63c 57 uint8_t * data;
3aac2619
TM
58 size_t msg_size;
59 size_t msg_count;
60 size_t msg_count_max;
61 size_t head_idx;
62 char * name;
63} pthread_mq_t;
64
65bool pthread_mq_init(pthread_mq_t *mq, size_t msg_size, size_t msg_count_max);
66void pthread_mq_free(pthread_mq_t *mq);
67size_t pthread_mq_waiting(pthread_mq_t *mq);
68bool pthread_mq_reset(pthread_mq_t *mq);
69bool pthread_mq_send_generic(pthread_mq_t *mq, void * data, bool to_front, const struct timespec *restrict abs_timeout);
70bool pthread_mq_receive_generic(pthread_mq_t *mq, void * data, bool peek, const struct timespec *restrict abs_timeout);
71
72// Multi mutex locking
73
5251b63c 74#define pthread_mutex_swap(a, b) { pthread_mutex_t *s; s = (a); a = (b); b = s; }
3aac2619
TM
75
76#define pthread_mutex_lock_two(a,b) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, true, NULL)
77#define pthread_mutex_timedlock_two(a,b,tm) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, true, (tm))
78#define pthread_mutex_trylock_two(a,b) pthread_mutex_timedlock_multi_generic((pthread_mutex_t *[2]){(a), (b)}, 2, false, NULL)
79
80#define pthread_mutex_lock_multi(lcks,cnt) pthread_mutex_timedlock_multi_generic((lcks),(cnt),true,NULL)
81#define pthread_mutex_timedlock_multi(lcks,cnt,tm) pthread_mutex_timedlock_multi_generic((lcks),(cnt),true,(tm))
82#define pthread_mutex_trylock_multi(lcks,cnt) pthread_mutex_timedlock_multi_generic((lcks),(cnt),false,NULL)
83
84int pthread_mutex_timedlock_multi_generic(pthread_mutex_t **lck, int cnt, bool block, const struct timespec *restrict abs_timeout);
85
86
87#endif //__PTHREAD_EXTRA_H__
This page took 0.146223 seconds and 4 git commands to generate.