-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathshm.c
More file actions
116 lines (95 loc) · 2.72 KB
/
shm.c
File metadata and controls
116 lines (95 loc) · 2.72 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "shm.h"
char* RDDA_DATA = (char *)"/rdda_data";
/** Acuqire robust mutex
*
* @param[in] mutex = mutex lock
* return 0 if owener died, return -1 on error, return 1 on success.
*/
int mutex_lock(pthread_mutex_t *mutex) {
int err = pthread_mutex_lock(mutex);
if (err == 0) {
return 1; /* Acuqire mutex success */
}
else if (err == EOWNERDEAD) {
pthread_mutex_consistent(mutex);
return 0; /* Mutex dead */
}
else {
perror("pthread_mutex_lock");
return 0;
}
}
/** Release robust mutex
*
* @param[in] mutex = mutex lock
* return -1 on error, return 0 on success.
*/
int mutex_unlock(pthread_mutex_t *mutex) {
int err = pthread_mutex_unlock(mutex);
if (!err) return 0; /* Mutex unlock success */
perror("pthread_mutex_unlock");
return -1;
}
/** Initialise mutex lock and condition variable.
*
* @param[in] mutex = mutex lock.
* return 1 on success.
*/
static int
mutex_init(pthread_mutex_t *mutex) {
/* Initialise mutex */
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);
pthread_mutex_init(mutex, &mattr);
pthread_mutexattr_destroy(&mattr);
return 1;
}
/** Open and map a shared memory file.
*
* @param[in] shm_name = Shared memory file name.
* @param[in] p = Intermediate pointer.
* return 0 on success.
*/
static int
openSharedMemory(char *shm_name, void **p) {
int fd = 0, ret = 0, err = 0; /* error detector*/
/* Create or open a POSIX shared memory object */
mode_t old_umask = umask(0);
fd = shm_open(shm_name, OPEN_FLAG, MODE_FLAG); /* return 0 on success, -1 on error */
err = fd < 0;
/* Resize the shared memory file */
if (!err) {
ret = ftruncate(fd, SHM_SIZE); /* return 0 on success, -1 on error */
err = ret < 0;
}
/* Map shared memory to process virtual memory space */
if (!err) {
*p = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); /* return pointer on success, (void*)-1 on error */
err = (*p == (void *)-1);
}
/* Close the file descriptor */
if (!err) {
err = close(fd);
}
umask(old_umask);
return err;
}
/** Initialize jointCommands to shared memory and robust mutex.
*
* @return jointCommands pointer.
*/
Rdda *initRdda() {
Rdda *rdda;
void *p;
if (!openSharedMemory(RDDA_DATA, &p)) {
rdda = (Rdda *) p;
} else {
fprintf(stderr, "open(RDDA_DATA)\n");
return NULL;
}
/* initialise mutex lock */
mutex_init(&rdda->mutex);
return rdda;
}