diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2009-04-18 19:27:28 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2009-04-18 19:27:28 +0000 |
| commit | f7a08d5f9ab224c7d3751693c1ba159a5d6d5900 (patch) | |
| tree | 09afd5284fde0f9f2b015164f334a81b9a9e00b8 /src/os/win32/ngx_shmem.c | |
| parent | 6ac68bcc4c3cbc2711fccbc78d6df3164c6dbde3 (diff) | |
| download | nginx-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.c | 41 |
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; } |
