Line data Source code
1 : /*
2 : +----------------------------------------------------------------------+
3 : | COLOPL PHP TimeShifter. |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) COLOPL, Inc. |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to the BSD-3-Clause license that is |
8 : | bundled with this package in the file LICENSE. |
9 : +----------------------------------------------------------------------+
10 : | Author: Go Kudo <g-kudo@colopl.co.jp> |
11 : +----------------------------------------------------------------------+
12 : */
13 :
14 : #include "php.h"
15 : #include "shared_memory.h"
16 :
17 164 : bool sm_init(sm_t *sm, size_t size) {
18 164 : sm->size = size;
19 :
20 164 : if ((sm->data = mmap(NULL, sm->size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) {
21 0 : return false;
22 : }
23 :
24 164 : if (sem_init(&sm->semaphore, 1, 1) != 0) {
25 0 : return false;
26 : }
27 :
28 164 : return sm;
29 : }
30 :
31 1772 : void sm_read(sm_t *sm, void *dest) {
32 1772 : memcpy(dest, sm->data, sm->size);
33 1772 : }
34 :
35 388 : bool sm_write(sm_t *sm, void *src) {
36 388 : if (!sm->data) {
37 0 : return false;
38 : }
39 :
40 388 : if (sem_wait(&sm->semaphore) != 0) {
41 0 : return false;
42 : }
43 :
44 388 : memcpy(sm->data, src, sm->size);
45 :
46 388 : if (sem_post(&sm->semaphore) != 0) {
47 0 : return false;
48 : }
49 :
50 388 : return true;
51 : }
52 :
53 164 : bool sm_free(sm_t *sm) {
54 164 : if (!sm->data) {
55 0 : return false;
56 : }
57 :
58 164 : if (munmap(sm->data, sm->size) != 0) {
59 0 : return false;
60 : }
61 :
62 164 : if (sem_destroy(&sm->semaphore) != 0) {
63 0 : return false;
64 : }
65 :
66 164 : return true;
67 : }
|