Index: /trunk/xcache.c
===================================================================
--- /trunk/xcache.c	(revision 136)
+++ /trunk/xcache.c	(revision 137)
@@ -149,5 +149,5 @@
 }
 /* }}} */
-static void xc_entry_free_dmz(volatile xc_entry_t *xce) /* {{{ */
+static void xc_entry_free_real_dmz(volatile xc_entry_t *xce) /* {{{ */
 {
 	xc_mem_free(xce->cache->mem, (xc_entry_t *)xce);
@@ -180,10 +180,9 @@
 }
 /* }}} */
-static void xc_entry_remove_real_dmz(xc_entry_t *xce, xc_entry_t **pp TSRMLS_DC) /* {{{ */
-{
-	*pp = xce->next;
+static void xc_entry_free_dmz(xc_entry_t *xce TSRMLS_DC) /* {{{ */
+{
 	xce->cache->entries_count --;
 	if (xce->refcount == 0) {
-		xc_entry_free_dmz(xce);
+		xc_entry_free_real_dmz(xce);
 	}
 	else {
@@ -202,5 +201,7 @@
 	for (p = *pp; p; pp = &(p->next), p = p->next) {
 		if (xc_entry_equal_dmz(xce, p)) {
-			xc_entry_remove_real_dmz(xce, pp TSRMLS_CC);
+			/* unlink */
+			*pp = p->next;
+			xc_entry_free_dmz(xce, pp TSRMLS_CC);
 			return;
 		}
@@ -249,11 +250,14 @@
 {
 	xc_entry_t *p, **pp;
+	xc_entry_t *next;
 	int i, c;
 
 	for (i = 0, c = cache->hentry->size; i < c; i ++) {
 		pp = &(cache->entries[i]);
-		for (p = *pp; p; p = p->next) {
+		for (p = *pp; p; p = *pp) {
 			if (apply_func(p TSRMLS_CC)) {
-				xc_entry_remove_real_dmz(p, pp TSRMLS_CC);
+				/* unlink */
+				*pp = p->next;
+				xc_entry_free_dmz(p, pp TSRMLS_CC);
 			}
 			else {
@@ -342,7 +346,8 @@
 		}
 		if (p->refcount == 0) {
+			/* unlink */
 			*pp = p->next;
 			cache->deletes_count --;
-			xc_entry_free_dmz(p);
+			xc_entry_free_real_dmz(p);
 		}
 		else {
