Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_shmem.c
Go to the documentation of this file.
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 
11 
12 #if (NGX_HAVE_MAP_ANON)
13 
16 {
17  shm->addr = (u_char *) mmap(NULL, shm->size,
18  PROT_READ|PROT_WRITE,
19  MAP_ANON|MAP_SHARED, -1, 0);
20 
21  if (shm->addr == MAP_FAILED) {
23  "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
24  return NGX_ERROR;
25  }
26 
27  return NGX_OK;
28 }
29 
30 
31 void
33 {
34  if (munmap((void *) shm->addr, shm->size) == -1) {
36  "munmap(%p, %uz) failed", shm->addr, shm->size);
37  }
38 }
39 
40 #elif (NGX_HAVE_MAP_DEVZERO)
41 
44 {
45  ngx_fd_t fd;
46 
47  fd = open("/dev/zero", O_RDWR);
48 
49  if (fd == -1) {
51  "open(\"/dev/zero\") failed");
52  return NGX_ERROR;
53  }
54 
55  shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE,
56  MAP_SHARED, fd, 0);
57 
58  if (shm->addr == MAP_FAILED) {
60  "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size);
61  }
62 
63  if (close(fd) == -1) {
65  "close(\"/dev/zero\") failed");
66  }
67 
68  return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK;
69 }
70 
71 
72 void
74 {
75  if (munmap((void *) shm->addr, shm->size) == -1) {
77  "munmap(%p, %uz) failed", shm->addr, shm->size);
78  }
79 }
80 
81 #elif (NGX_HAVE_SYSVSHM)
82 
83 #include <sys/ipc.h>
84 #include <sys/shm.h>
85 
86 
89 {
90  int id;
91 
92  id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));
93 
94  if (id == -1) {
96  "shmget(%uz) failed", shm->size);
97  return NGX_ERROR;
98  }
99 
100  ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id);
101 
102  shm->addr = shmat(id, NULL, 0);
103 
104  if (shm->addr == (void *) -1) {
105  ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed");
106  }
107 
108  if (shmctl(id, IPC_RMID, NULL) == -1) {
110  "shmctl(IPC_RMID) failed");
111  }
112 
113  return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK;
114 }
115 
116 
117 void
119 {
120  if (shmdt(shm->addr) == -1) {
122  "shmdt(%p) failed", shm->addr);
123  }
124 }
125 
126 #endif