0
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9
|
|
10
|
18
|
11 #if (NGX_HAVE_MAP_ANON)
|
0
|
12
|
|
13 void *ngx_create_shared_memory(size_t size, ngx_log_t *log)
|
|
14 {
|
|
15 void *p;
|
|
16
|
|
17 p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
|
|
18
|
|
19 if (p == MAP_FAILED) {
|
|
20 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
10
|
21 "mmap(MAP_ANON|MAP_SHARED, %uz) failed", size);
|
0
|
22 return NULL;
|
|
23 }
|
|
24
|
|
25 return p;
|
|
26 }
|
|
27
|
18
|
28 #elif (NGX_HAVE_MAP_DEVZERO)
|
0
|
29
|
|
30 void *ngx_create_shared_memory(size_t size, ngx_log_t *log)
|
|
31 {
|
|
32 void *p;
|
|
33 ngx_fd_t fd;
|
|
34
|
|
35 fd = open("/dev/zero", O_RDWR);
|
|
36
|
|
37 if (fd == -1) {
|
|
38 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
16
|
39 "open(\"/dev/zero\") failed");
|
0
|
40 return NULL;
|
|
41 }
|
|
42
|
|
43 p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
|
44
|
|
45 if (p == MAP_FAILED) {
|
|
46 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
10
|
47 "mmap(/dev/zero, MAP_SHARED, %uz) failed", size);
|
0
|
48 p = NULL;
|
|
49 }
|
|
50
|
|
51 if (close(fd) == -1) {
|
16
|
52 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
|
53 "close(\"/dev/zero\") failed");
|
0
|
54 }
|
|
55
|
|
56 return p;
|
|
57 }
|
|
58
|
18
|
59 #elif (NGX_HAVE_SYSVSHM)
|
0
|
60
|
|
61 #include <sys/ipc.h>
|
|
62 #include <sys/shm.h>
|
|
63
|
|
64
|
|
65 void *ngx_create_shared_memory(size_t size, ngx_log_t *log)
|
|
66 {
|
|
67 int id;
|
|
68 void *p;
|
|
69
|
|
70 id = shmget(IPC_PRIVATE, size, (SHM_R|SHM_W|IPC_CREAT));
|
|
71
|
|
72 if (id == -1) {
|
|
73 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
10
|
74 "shmget(%uz) failed", size);
|
0
|
75 return NULL;
|
|
76 }
|
|
77
|
|
78 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "shmget id: %d", id);
|
|
79
|
|
80 p = shmat(id, NULL, 0);
|
|
81
|
|
82 if (p == (void *) -1) {
|
|
83 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "shmat() failed");
|
|
84 p = NULL;
|
|
85 }
|
|
86
|
|
87 if (shmctl(id, IPC_RMID, NULL) == -1) {
|
|
88 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "shmctl(IPC_RMID) failed");
|
|
89 p = NULL;
|
|
90 }
|
|
91
|
|
92 return p;
|
|
93 }
|
|
94
|
|
95 #endif
|