This source file includes following definitions.
- fpm_shm_alloc
- fpm_shm_free
- fpm_shm_get_size_allocated
1
2
3
4
5 #include <sys/mman.h>
6 #include <errno.h>
7 #include <string.h>
8
9 #include "fpm_shm.h"
10 #include "zlog.h"
11
12
13
14 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
15 #define MAP_ANONYMOUS MAP_ANON
16 #endif
17
18 static size_t fpm_shm_size = 0;
19
20 void *fpm_shm_alloc(size_t size)
21 {
22 void *mem;
23
24 mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
25
26 #ifdef MAP_FAILED
27 if (mem == MAP_FAILED) {
28 zlog(ZLOG_SYSERROR, "unable to allocate %zu bytes in shared memory: %s", size, strerror(errno));
29 return NULL;
30 }
31 #endif
32
33 if (!mem) {
34 zlog(ZLOG_SYSERROR, "unable to allocate %zu bytes in shared memory", size);
35 return NULL;
36 }
37
38 memset(mem, 0, size);
39 fpm_shm_size += size;
40 return mem;
41 }
42
43
44 int fpm_shm_free(void *mem, size_t size)
45 {
46 if (!mem) {
47 zlog(ZLOG_ERROR, "mem is NULL");
48 return 0;
49 }
50
51 if (munmap(mem, size) == -1) {
52 zlog(ZLOG_SYSERROR, "Unable to free shm");
53 return 0;
54 }
55
56 if (fpm_shm_size - size > 0) {
57 fpm_shm_size -= size;
58 } else {
59 fpm_shm_size = 0;
60 }
61
62 return 1;
63 }
64
65
66 size_t fpm_shm_get_size_allocated()
67 {
68 return fpm_shm_size;
69 }
70