blob: 80b5f601f7053f4ee82b23f3212bdde578dba9cf [file] [log] [blame] [raw]
Igor Sysoev7d66b1f2004-10-05 15:39:18 +00001
2/*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7#include <ngx_config.h>
8#include <ngx_core.h>
9
10
Igor Sysoeva9c1bbe2004-11-25 14:10:55 +000011#if (NGX_HAVE_MAP_ANON)
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000012
13void *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,
Igor Sysoev34657fc2004-11-11 14:00:51 +000021 "mmap(MAP_ANON|MAP_SHARED, %uz) failed", size);
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000022 return NULL;
23 }
24
25 return p;
26}
27
Igor Sysoeva9c1bbe2004-11-25 14:10:55 +000028#elif (NGX_HAVE_MAP_DEVZERO)
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000029
30void *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,
Igor Sysoev48232562004-11-20 19:57:08 +000039 "open(\"/dev/zero\") failed");
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000040 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,
Igor Sysoev34657fc2004-11-11 14:00:51 +000047 "mmap(/dev/zero, MAP_SHARED, %uz) failed", size);
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000048 p = NULL;
49 }
50
51 if (close(fd) == -1) {
Igor Sysoev48232562004-11-20 19:57:08 +000052 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
53 "close(\"/dev/zero\") failed");
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000054 }
55
56 return p;
57}
58
Igor Sysoeva9c1bbe2004-11-25 14:10:55 +000059#elif (NGX_HAVE_SYSVSHM)
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000060
61#include <sys/ipc.h>
62#include <sys/shm.h>
63
64
65void *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,
Igor Sysoev34657fc2004-11-11 14:00:51 +000074 "shmget(%uz) failed", size);
Igor Sysoev7d66b1f2004-10-05 15:39:18 +000075 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