Index: /trunk/mmap.c
===================================================================
--- /trunk/mmap.c	(revision 78)
+++ /trunk/mmap.c	(revision 79)
@@ -18,4 +18,5 @@
 #else
 #	include <unistd.h>
+/* make sure to mark(change) it to NULL to keep consistent */
 #	define XCACHE_MAP_FAILED MAP_FAILED
 #endif
@@ -192,6 +193,8 @@
 	}
 
-	ro_ok = 0;
+	/* {{{ readonly protection, mmap it readonly and check if ptr_ro works */
 	if (readonly_protection) {
+		ro_ok = 0;
+
 #ifdef ZEND_WIN32
 		shm->hmap_ro = XCacheCreateFileMapping(size, PAGE_READONLY, shm->name);
@@ -200,9 +203,11 @@
 		shm->ptr_ro = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
 #endif
+		if (shm->ptr_ro == XCACHE_MAP_FAILED) {
+			shm->ptr_ro = NULL;
+		}
 		romem = shm->ptr_ro;
 
-		/* {{{ check if ptr_ro works */
 		do {
-			if (shm->ptr_ro == XCACHE_MAP_FAILED || shm->ptr_ro == shm->ptr) {
+			if (romem == NULL || romem == shm->ptr) {
 				break;
 			}
@@ -217,17 +222,24 @@
 			ro_ok = 1;
 		} while (0);
-	}
-
-	if (ro_ok) {
-		shm->diff = PTR_SUB(shm->ptr_ro, (char *) shm->ptr);
-		assert(abs(shm->diff) >= size);
-	}
-	else {
-		if (shm->ptr_ro != XCACHE_MAP_FAILED) {
-			munmap(shm->ptr_ro, size);
-		}
-		shm->ptr_ro = NULL;
-		shm->diff = 0;
-	}
+
+		if (ro_ok) {
+			shm->diff = PTR_SUB(shm->ptr_ro, (char *) shm->ptr);
+			/* no overlap */
+			assert(abs(shm->diff) >= size);
+		}
+		else {
+			if (shm->ptr_ro) {
+				munmap(shm->ptr_ro, size);
+			}
+#ifdef ZEND_WIN32
+			if (shm->hmap_ro) {
+				CloseHandle(shm->hmap_ro);
+			}
+#endif
+			shm->ptr_ro = NULL;
+			shm->diff = 0;
+		}
+	}
+
 	/* }}} */
 
