Index: /trunk/xc_malloc.c
===================================================================
--- /trunk/xc_malloc.c	(revision 381)
+++ /trunk/xc_malloc.c	(revision 386)
@@ -16,13 +16,43 @@
 };
 
+/* {{{ _xc_malloc_shm_t */
+struct _xc_malloc_shm_t {
+	xc_shm_handlers_t *handlers;
+	xc_shmsize_t       size;
+	xc_shmsize_t       memoffset;
+#ifdef HAVE_XCACHE_TEST
+	HashTable blocks;
+#endif
+};
+/* }}} */
+
 #define CHECK(x, e) do { if ((x) == NULL) { zend_error(E_ERROR, "XCache: " e); goto err; } } while (0)
 
+static void *xc_add_to_blocks(xc_mem_t *mem, void *p, size_t size) /* {{{ */
+{
+#ifdef HAVE_XCACHE_TEST
+	if (p) {
+		zend_hash_add(&mem->shm->blocks, (void *) &p, sizeof(p), (void *) &size, sizeof(size), NULL);
+	}
+#endif
+	return p;
+}
+/* }}} */
+static void xc_del_from_blocks(xc_mem_t *mem, void *p) /* {{{ */
+{
+#ifdef HAVE_XCACHE_TEST
+	zend_hash_del(&mem->shm->blocks, (void *) &p, sizeof(p));
+#endif
+}
+/* }}} */
+
 static XC_MEM_MALLOC(xc_malloc_malloc) /* {{{ */
 {
-	return malloc(size);
+	return xc_add_to_blocks(mem, malloc(size), size);
 }
 /* }}} */
 static XC_MEM_FREE(xc_malloc_free) /* {{{ return block size freed */
 {
+	xc_del_from_blocks(mem, (void *) p);
 	free((void *) p);
 	return 0;
@@ -31,15 +61,15 @@
 static XC_MEM_CALLOC(xc_malloc_calloc) /* {{{ */
 {
-	return calloc(memb, size);
+	return xc_add_to_blocks(mem, calloc(memb, size), size);
 }
 /* }}} */
 static XC_MEM_REALLOC(xc_malloc_realloc) /* {{{ */
 {
-	return realloc((void *) p, size);
+	return xc_add_to_blocks(mem, realloc((void *) p, size), size);
 }
 /* }}} */
 static XC_MEM_STRNDUP(xc_malloc_strndup) /* {{{ */
 {
-	char *p = malloc(len);
+	char *p = xc_add_to_blocks(mem, malloc(len), len);
 	if (!p) {
 		return NULL;
@@ -107,12 +137,4 @@
 /* }}} */
 
-/* {{{ _xc_malloc_shm_t */
-struct _xc_malloc_shm_t {
-	xc_shm_handlers_t *handlers;
-	xc_shmsize_t       size;
-	xc_shmsize_t       memoffset;
-};
-/* }}} */
-
 static XC_SHM_CAN_READONLY(xc_malloc_can_readonly) /* {{{ */
 {
@@ -122,4 +144,17 @@
 static XC_SHM_IS_READWRITE(xc_malloc_is_readwrite) /* {{{ */
 {
+	HashPosition pos;
+	size_t *psize;
+	char **ptr;
+
+	zend_hash_internal_pointer_reset_ex(&shm->blocks, &pos);
+	while (zend_hash_get_current_data_ex(&shm->blocks, (void **) &psize, &pos) == SUCCESS) {
+		zend_hash_get_current_key_ex(&shm->blocks, (void *) &ptr, NULL, NULL, 0, &pos);
+		if ((char *) p >= *ptr && (char *) p < *ptr + *psize) {
+			return 1;
+		}
+		zend_hash_move_forward_ex(&shm->blocks, &pos);
+	}
+
 	return 0;
 }
@@ -144,4 +179,7 @@
 {
 	free(shm);
+#ifdef HAVE_XCACHE_TEST
+	zend_hash_destroy(&shm->blocks);
+#endif
 	return;
 }
@@ -153,4 +191,7 @@
 	shm->size = size;
 
+#ifdef HAVE_XCACHE_TEST
+	zend_hash_init(&shm->blocks, 64, NULL, NULL, 1);
+#endif
 	return shm;
 err:
