pthreadex.c
2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
clsync - file tree sync utility based on inotify/kqueue
Copyright (C) 2013-2014 Dmitry Yu Okunev <dyokunev@ut.mephi.ru> 0x8E30679C
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include <pthread.h>
#include "pthreadex.h"
#include "malloc.h"
int pthread_mutex_init_shared(pthread_mutex_t **mutex_p) {
static pthread_mutex_t mutex_initial = PTHREAD_MUTEX_INITIALIZER;
*mutex_p = shm_malloc_try(sizeof(**mutex_p));
memcpy(*mutex_p, &mutex_initial, sizeof(mutex_initial));
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
return pthread_mutex_init(*mutex_p, &attr);
}
int pthread_mutex_destroy_shared(pthread_mutex_t *mutex_p) {
int rc;
rc = pthread_mutex_destroy(mutex_p);
shm_free(mutex_p);
return rc;
}
int pthread_cond_init_shared(pthread_cond_t **cond_p) {
static pthread_cond_t cond_initial = PTHREAD_COND_INITIALIZER;
*cond_p = shm_malloc(sizeof(**cond_p));
memcpy(*cond_p, &cond_initial, sizeof(cond_initial));
pthread_condattr_t attr;
pthread_condattr_init(&attr);
pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
return pthread_cond_init(*cond_p, &attr);
}
int pthread_cond_destroy_shared(pthread_cond_t *cond_p) {
int rc;
rc = pthread_cond_destroy(cond_p);
shm_free(cond_p);
return rc;
}
int pthread_mutex_reltimedlock(pthread_mutex_t *mutex_p, long tv_sec, long tv_nsec) {
struct timespec abs_time;
if (clock_gettime(CLOCK_REALTIME, &abs_time))
return -1;
abs_time.tv_sec += tv_sec;
abs_time.tv_nsec += tv_nsec;
if (abs_time.tv_nsec > 1000*1000*1000) {
abs_time.tv_sec++;
abs_time.tv_nsec -= 1000*1000*1000;
}
return pthread_mutex_timedlock(mutex_p, &abs_time);
}