Changeset 11 for trunk/mmap.c
- Timestamp:
- 05/24/2006 09:52:48 AM (7 years ago)
- Files:
-
- 1 modified
-
trunk/mmap.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/mmap.c
r1 r11 7 7 #include <string.h> 8 8 #include <stdlib.h> 9 9 10 /* mmap */ 10 #include <unistd.h> 11 #ifdef ZEND_WIN32 12 # define ftruncate chsize 13 # define getuid() 0 14 # define XcacheCreateFileMapping(size, perm, name) \ 15 CreateFileMapping(INVALID_HANDLE_VALUE, NULL, perm, (sizeof(xc_shmsize_t) > 4) ? size >> 32 : 0, size & 0xffffffff, name) 16 # define XCACHE_MAP_FAILED NULL 17 # define munmap(p, s) UnmapViewOfFile(p) 18 #else 19 # include <unistd.h> 20 # define XCACHE_MAP_FAILED MAP_FAILED 21 #endif 22 11 23 #include <sys/types.h> 12 24 #include <sys/stat.h> 13 25 #include <fcntl.h> 26 27 #ifndef ZEND_WIN32 14 28 #include <sys/mman.h> 29 #endif 15 30 16 31 #include "php.h" … … 27 42 long diff; 28 43 xc_shmsize_t size; 44 char *name; 45 #ifdef ZEND_WIN32 46 HANDLE hmap; 47 HANDLE hmap_ro; 48 #endif 29 49 }; 30 50 51 #undef NDEBUG 31 52 #ifdef ALLOC_DEBUG 32 # undef NDEBUG33 53 # define inline 34 54 #else … … 38 58 /* }}} */ 39 59 #define CHECK(x, e) do { if ((x) == NULL) { zend_error(E_ERROR, "XCache: " e); goto err; } } while (0) 60 #define PTR_ADD(ptr, v) (((char *) (ptr)) + (v)) 61 #define PTR_SUB(ptr, v) (((char *) (ptr)) - (v)) 40 62 41 63 int xc_shm_can_readonly(xc_shm_t *shm) /* {{{ */ … … 58 80 if (shm->diff) { 59 81 assert(xc_shm_is_readonly(p)); 60 p = p - shm->diff;82 p = PTR_SUB(p, -shm->diff); 61 83 } 62 84 assert(xc_shm_is_readwrite(p)); … … 68 90 assert(xc_shm_is_readwrite(p)); 69 91 if (shm->diff) { 70 p = p + shm->diff;92 p = PTR_ADD(p, shm->diff); 71 93 assert(xc_shm_is_readonly(p)); 72 94 } … … 90 112 */ 91 113 } 114 #ifdef ZEND_WIN32 115 if (shm->hmap) { 116 CloseHandle(shm->hmap); 117 } 118 if (shm->hmap_ro) { 119 CloseHandle(shm->hmap_ro); 120 } 121 #endif 122 123 if (shm->name) { 124 #ifdef __CYGWIN__ 125 unlink(shm->name); 126 #endif 127 free(shm->name); 128 } 92 129 /* 93 130 shm->size = NULL; … … 102 139 { 103 140 xc_shm_t *shm = NULL; 104 int fd ;141 int fd = -1; 105 142 int ro_ok; 106 143 volatile void *romem; 107 int created = 0;144 char tmpname[sizeof("/tmp/xcache") - 1 + 100]; 108 145 109 146 CHECK(shm = calloc(1, sizeof(xc_shm_t)), "shm OOM"); 110 147 shm->size = size; 148 111 149 if (path == NULL || !path[0]) { 112 path = "/tmp/xcache"; 113 } 114 fd = open(path, O_RDWR, S_IRUSR | S_IWUSR); 150 static int inc = 0; 151 snprintf(tmpname, sizeof(tmpname) - 1, "/tmp/xcache.%d.%d.%d", (int) getuid(), inc ++, rand()); 152 path = tmpname; 153 } 154 155 shm->name = strdup(path); 156 157 #ifndef ZEND_WIN32 158 # define XCACHE_MMAP_PERMISSION (S_IRUSR | S_IWUSR) 159 fd = open(shm->name, O_RDWR, XCACHE_MMAP_PERMISSION); 115 160 if (fd == -1) { 116 created = 1; 117 fd = open(path, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); 161 fd = open(shm->name, O_CREAT | O_RDWR, XCACHE_MMAP_PERMISSION); 118 162 if (fd == -1) { 119 if (created) {120 unlink(path);121 }122 163 goto err; 123 164 } 124 165 } 125 166 ftruncate(fd, size); 126 167 #endif 168 169 #ifdef ZEND_WIN32 170 shm->hmap = XcacheCreateFileMapping(size, PAGE_READWRITE, shm->name); 171 shm->ptr = (LPSTR) MapViewOfFile(shm->hmap, FILE_MAP_WRITE, 0, 0, 0); 172 #else 127 173 shm->ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 128 if (shm->ptr == MAP_FAILED) { 174 #endif 175 176 if (shm->ptr == XCACHE_MAP_FAILED) { 129 177 shm->ptr = NULL; 130 close(fd);131 if (created) {132 unlink(path);133 }134 178 goto err; 135 179 } … … 137 181 ro_ok = 0; 138 182 if (readonly_protection) { 183 #ifdef ZEND_WIN32 184 shm->hmap_ro = XcacheCreateFileMapping(size, PAGE_READONLY, shm->name); 185 shm->ptr_ro = (LPSTR) MapViewOfFile(shm->hmap_ro, FILE_MAP_READ, 0, 0, 0); 186 #else 139 187 shm->ptr_ro = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); 188 #endif 140 189 romem = shm->ptr_ro; 141 190 142 191 /* {{{ check if ptr_ro works */ 143 192 do { 144 if (shm->ptr_ro == MAP_FAILED || shm->ptr_ro == shm->ptr) {193 if (shm->ptr_ro == XCACHE_MAP_FAILED || shm->ptr_ro == shm->ptr) { 145 194 break; 146 195 } … … 158 207 159 208 if (ro_ok) { 160 shm->diff = shm->ptr_ro - shm->ptr;209 shm->diff = PTR_SUB(shm->ptr_ro, (char *) shm->ptr); 161 210 assert(abs(shm->diff) >= size); 162 211 } 163 212 else { 164 if (shm->ptr_ro != MAP_FAILED) {213 if (shm->ptr_ro != XCACHE_MAP_FAILED) { 165 214 munmap(shm->ptr_ro, size); 166 215 } … … 171 220 172 221 close(fd); 173 if (created) { 174 unlink(path);175 } 222 #ifndef __CYGWIN__ 223 unlink(shm->name); 224 #endif 176 225 177 226 return shm; 178 227 179 228 err: 229 if (fd != -1) { 230 close(fd); 231 } 180 232 if (shm) { 181 233 xc_shm_destroy(shm);

