pthread_pause pthread_unpause
[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>
5#include <time.h>
6#include <stdbool.h>
7#include <stdint.h>
a8e71e8f 8#include <signal.h>
3aac2619
TM
9
10#define PTHREAD_XTIME_NOBLOCK (&(struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
11#define PTHREAD_XTIME_FOREVER NULL
12
a8e71e8f
TM
13//Pausing
14
15#define PTHREAD_XSIG_STOP (SIGRTMIN+0)
16#define PTHREAD_XSIG_CONT (SIGRTMIN+1)
17#define PTHREAD_XSIGRTMIN (SIGRTMIN+2) //First unused RT signal
18
19#define pthread_pause(t) (pthread_kill((t), PTHREAD_XSIG_STOP));
20#define pthread_unpause(t) (pthread_kill((t), PTHREAD_XSIG_CONT));
21
22void pthread_unpause_handler();
23void pthread_pause_handler();
24void pthread_pause_enable();
25
3aac2619
TM
26// Message queues
27
28#define PTHREAD_XMQ_FRONT true
29#define PTHREAD_XMQ_BACK false
30
31#define PTHREAD_XMQ_RECV false
32#define PTHREAD_XMQ_PEEK true
33
34typedef struct pthread_mq_t {
35 pthread_mutex_t lock;
36 pthread_cond_t cond_readable;
37 pthread_cond_t cond_writable;
5251b63c 38 uint8_t * data;
3aac2619
TM
39 size_t msg_size;
40 size_t msg_count;
41 size_t msg_count_max;
42 size_t head_idx;
43 char * name;
44} pthread_mq_t;
45
46bool pthread_mq_init(pthread_mq_t *mq, size_t msg_size, size_t msg_count_max);
47void pthread_mq_free(pthread_mq_t *mq);
48size_t pthread_mq_waiting(pthread_mq_t *mq);
49bool pthread_mq_reset(pthread_mq_t *mq);
50bool pthread_mq_send_generic(pthread_mq_t *mq, void * data, bool to_front, const struct timespec *restrict abs_timeout);
51bool pthread_mq_receive_generic(pthread_mq_t *mq, void * data, bool peek, const struct timespec *restrict abs_timeout);
52
53// Multi mutex locking
54
5251b63c 55#define pthread_mutex_swap(a, b) { pthread_mutex_t *s; s = (a); a = (b); b = s; }
3aac2619
TM
56
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)
60
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)
64
65int pthread_mutex_timedlock_multi_generic(pthread_mutex_t **lck, int cnt, bool block, const struct timespec *restrict abs_timeout);
66
67
68#endif //__PTHREAD_EXTRA_H__
This page took 0.164881 seconds and 4 git commands to generate.