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