diff --git a/mmap.c b/mmap.c index 69c95ee..8aabeb7 100644 --- a/mmap.c +++ b/mmap.c @@ -11,7 +11,7 @@ #ifdef ZEND_WIN32 # define ftruncate chsize # define getuid() 0 -# define XcacheCreateFileMapping(size, perm, name) \ +# define XCacheCreateFileMapping(size, perm, name) \ CreateFileMapping(INVALID_HANDLE_VALUE, NULL, perm, (sizeof(xc_shmsize_t) > 4) ? size >> 32 : 0, size & 0xffffffff, name) # define XCACHE_MAP_FAILED NULL # define munmap(p, s) UnmapViewOfFile(p) @@ -42,6 +42,7 @@ struct _xc_shm_t { long diff; xc_shmsize_t size; char *name; + int newfile; #ifdef ZEND_WIN32 HANDLE hmap; HANDLE hmap_ro; @@ -122,7 +123,9 @@ void xc_shm_destroy(xc_shm_t *shm) /* {{{ */ if (shm->name) { #ifdef __CYGWIN__ - unlink(shm->name); + if (shm->newfile) { + unlink(shm->name); + } #endif free(shm->name); } @@ -164,15 +167,19 @@ xc_shm_t *xc_shm_init(const char *path, xc_shmsize_t size, zend_bool readonly_pr fd = open(shm->name, O_RDWR, XCACHE_MMAP_PERMISSION); if (fd == -1) { fd = open(shm->name, O_CREAT | O_RDWR, XCACHE_MMAP_PERMISSION); + shm->newfile = 1; if (fd == -1) { goto err; } } + if (strncmp(shm->name, "/tmp", 4) == 0) { + shm->newfile = 0; + } ftruncate(fd, size); #endif #ifdef ZEND_WIN32 - shm->hmap = XcacheCreateFileMapping(size, PAGE_READWRITE, shm->name); + shm->hmap = XCacheCreateFileMapping(size, PAGE_READWRITE, shm->name); shm->ptr = (LPSTR) MapViewOfFile(shm->hmap, FILE_MAP_WRITE, 0, 0, 0); #else shm->ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); @@ -186,7 +193,7 @@ xc_shm_t *xc_shm_init(const char *path, xc_shmsize_t size, zend_bool readonly_pr ro_ok = 0; if (readonly_protection) { #ifdef ZEND_WIN32 - shm->hmap_ro = XcacheCreateFileMapping(size, PAGE_READONLY, shm->name); + shm->hmap_ro = XCacheCreateFileMapping(size, PAGE_READONLY, shm->name); shm->ptr_ro = (LPSTR) MapViewOfFile(shm->hmap_ro, FILE_MAP_READ, 0, 0, 0); #else shm->ptr_ro = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); @@ -225,7 +232,9 @@ xc_shm_t *xc_shm_init(const char *path, xc_shmsize_t size, zend_bool readonly_pr close(fd); #ifndef __CYGWIN__ - unlink(shm->name); + if (shm->newfile) { + unlink(shm->name); + } #endif return shm;