annotate src/os/win32/ngx_shmem.c @ 2720:b3b8c66bd520

support attaching to an existent Win32 shared memory
author Igor Sysoev <igor@sysoev.ru>
date Sat, 18 Apr 2009 19:27:28 +0000
parents d5896f6608e8
children d52cf82d0d77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 ngx_int_t
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 ngx_shm_alloc(ngx_shm_t *shm)
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 {
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
14 u_char *name;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
15
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
16 name = ngx_alloc(shm->name.len + 2 + sizeof(NGX_INT32_LEN), shm->log);
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
17 if (name == NULL) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
18 return NGX_ERROR;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
19 }
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
20
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
21 ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
22
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
23 ngx_set_errno(0);
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
24
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
26 0, shm->size, (char *) name);
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 if (shm->handle == NULL) {
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
2716
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 605
diff changeset
30 "CreateFileMapping(%uz, %s) failed",
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 605
diff changeset
31 shm->size, shm->name.data);
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
32 goto failed;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
33 }
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
34
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
35 if (ngx_errno == ERROR_ALREADY_EXISTS) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
36 shm->exists = 1;
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 }
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
41 if (shm->addr != NULL) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
42 return NGX_OK;
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 }
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
45 ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
46 "MapViewOfFile(%uz) failed", shm->size);
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
47
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
48 if (CloseHandle(shm->handle) == 0) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
49 ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
50 "CloseHandle() failed");
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
51 }
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
52
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
53 failed:
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
54
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
55 ngx_free(name);
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
56
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
57 return NGX_ERROR;
605
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 }
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 void
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 ngx_shm_free(ngx_shm_t *shm)
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 {
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 if (UnmapViewOfFile(shm->addr) == 0) {
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 "UnmapViewOfFile(%p) failed", shm->addr);
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 }
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 if (CloseHandle(shm->handle) == 0) {
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 "CloseHandle() failed");
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 }
5dac8c7fb71b nginx-0.3.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 }