summaryrefslogtreecommitdiffhomepage
path: root/src/os/win32/ngx_shmem.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-04-18 19:27:28 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-04-18 19:27:28 +0000
commitf7a08d5f9ab224c7d3751693c1ba159a5d6d5900 (patch)
tree09afd5284fde0f9f2b015164f334a81b9a9e00b8 /src/os/win32/ngx_shmem.c
parent6ac68bcc4c3cbc2711fccbc78d6df3164c6dbde3 (diff)
downloadnginx-f7a08d5f9ab224c7d3751693c1ba159a5d6d5900.tar.gz
nginx-f7a08d5f9ab224c7d3751693c1ba159a5d6d5900.tar.bz2
support attaching to an existent Win32 shared memory
Diffstat (limited to '')
-rw-r--r--src/os/win32/ngx_shmem.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/os/win32/ngx_shmem.c b/src/os/win32/ngx_shmem.c
index 62e8585d0..12837f74c 100644
--- a/src/os/win32/ngx_shmem.c
+++ b/src/os/win32/ngx_shmem.c
@@ -11,31 +11,50 @@
ngx_int_t
ngx_shm_alloc(ngx_shm_t *shm)
{
+ u_char *name;
+
+ name = ngx_alloc(shm->name.len + 2 + sizeof(NGX_INT32_LEN), shm->log);
+ if (name == NULL) {
+ return NGX_ERROR;
+ }
+
+ ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);
+
+ ngx_set_errno(0);
+
shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
- 0, shm->size, (char *) shm->name.data);
+ 0, shm->size, (char *) name);
if (shm->handle == NULL) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"CreateFileMapping(%uz, %s) failed",
shm->size, shm->name.data);
- return NGX_ERROR;
+ goto failed;
+ }
+
+ if (ngx_errno == ERROR_ALREADY_EXISTS) {
+ shm->exists = 1;
}
shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);
- if (shm->addr == NULL) {
- ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
- "MapViewOfFile(%uz) failed", shm->size);
+ if (shm->addr != NULL) {
+ return NGX_OK;
+ }
- if (CloseHandle(shm->handle) == 0) {
- ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
- "CloseHandle() failed");
- }
+ ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+ "MapViewOfFile(%uz) failed", shm->size);
- return NGX_ERROR;
+ if (CloseHandle(shm->handle) == 0) {
+ ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+ "CloseHandle() failed");
}
- return NGX_OK;
+failed:
+
+ ngx_free(name);
+
+ return NGX_ERROR;
}