Index: /trunk/xcache.c
===================================================================
--- /trunk/xcache.c	(revision 1172)
+++ /trunk/xcache.c	(revision 1177)
@@ -564,4 +564,5 @@
 	{ "the ionCube PHP Loader", NULL }
 };
+zend_llist_element **xc_zend_extension_elements;
 
 static xc_incompatible_zend_extension_info_t *xc_get_incompatible_zend_extension_info(const char *name)
@@ -579,4 +580,16 @@
 }
 /* }}} */
+static void xc_zend_llist_add_element(zend_llist *list, zend_llist_element *element) /* {{{ */
+{
+	if (!zend_extensions.head) {
+		zend_extensions.head = zend_extensions.tail = element;
+	}
+	else {
+		zend_extensions.tail->next = element;
+		element->prev = zend_extensions.tail;
+		zend_extensions.tail = element;
+	}
+}
+/* }}} */
 static int xc_incompatible_zend_extension_startup_hook(zend_extension *extension) /* {{{ */
 {
@@ -584,9 +597,8 @@
 	int status;
 	zend_bool catched = 0;
-	zend_llist old_zend_extensions = zend_extensions;
-#if TODO
-	zend_llist_position lpos;
+	zend_llist old_zend_extensions;
 	zend_extension *ext;
-#endif
+	size_t i;
+	zend_llist_element *element;
 	TSRMLS_FETCH();
 
@@ -596,20 +608,28 @@
 	assert(extension->startup);
 
-	/* hide all extensions from it */
+	/* save */
+	assert(!xc_zend_extension_elements);
+	old_zend_extensions = zend_extensions;
+	xc_zend_extension_elements = malloc(sizeof(zend_llist_element *) * old_zend_extensions.count);
+	for (i = 0, element = old_zend_extensions.head; element; ++i, element = element->next) {
+		xc_zend_extension_elements[i] = element;
+	}
+
+	/* hide all XCache extensions from it */
 	zend_extensions.head = NULL;
 	zend_extensions.tail = NULL;
 	zend_extensions.count = 0;
-	zend_extensions.dtor = NULL;
-#if TODO
-	for (ext = (zend_extension *) zend_llist_get_first_ex(&old_zend_extensions, &lpos);
-			ext;
-			ext = (zend_extension *) zend_llist_get_next_ex(&old_zend_extensions, &lpos)) {
+
+	for (i = 0; i < old_zend_extensions.count; ++i) {
+		element = xc_zend_extension_elements[i];
+		element->next = element->prev = NULL;
+
+		ext = (zend_extension *) element->data;
+
 		if (!(strcmp(ext->name, XCACHE_NAME) == 0 || strncmp(ext->name, XCACHE_NAME " ", sizeof(XCACHE_NAME " ") - 1) == 0)) {
-			zend_llist_add_element(&zend_extensions, ext);
-		}
-	}
-#endif
-	zend_llist_add_element(&zend_extensions, extension);
-	extension = zend_get_extension(extension->name);
+			xc_zend_llist_add_element(&zend_extensions, element);
+			++zend_extensions.count;
+		}
+	}
 
 	assert(extension->startup != xc_incompatible_zend_extension_startup_hook);
@@ -621,6 +641,19 @@
 
 	/* restore */
-	zend_llist_destroy(&zend_extensions);
 	zend_extensions = old_zend_extensions;
+	zend_extensions.head = NULL;
+	zend_extensions.tail = NULL;
+	zend_extensions.count = 0;
+	for (i = 0; i < old_zend_extensions.count; ++i) {
+		element = xc_zend_extension_elements[i];
+		element->next = element->prev = NULL;
+
+		xc_zend_llist_add_element(&zend_extensions, element);
+		++zend_extensions.count;
+	}
+
+	free(xc_zend_extension_elements);
+	xc_zend_extension_elements = NULL;
+
 	if (catched) {
 		zend_bailout();
