+
+static inline STATUS http_persistent_handle_list_find(http_persistent_handle_list parent_list, http_persistent_handle_list **ident_list, int create TSRMLS_DC)
+{
+ http_persistent_handle_list new_list;
+
+ if (SUCCESS == zend_hash_quick_find(parent_list, HTTP_G->persistent.handles.ident.s, HTTP_G->persistent.handles.ident.l, HTTP_G->persistent.handles.ident.h, (void *) ident_list)) {
+ return SUCCESS;
+ }
+
+ if (create) {
+ if ((new_list = pemalloc(sizeof(HashTable), 1))) {
+ if (SUCCESS == zend_hash_init(new_list, 0, NULL, NULL, 1)) {
+ if (SUCCESS == zend_hash_quick_add(parent_list, HTTP_G->persistent.handles.ident.s, HTTP_G->persistent.handles.ident.l, HTTP_G->persistent.handles.ident.h, (void *) &new_list, sizeof(http_persistent_handle_list), (void *) ident_list)) {
+ return SUCCESS;
+ }
+ zend_hash_destroy(new_list);
+ }
+ pefree(new_list, 1);
+ }
+ }
+
+ return FAILURE;
+}
+
+static inline void http_persistent_handle_list_dtor(http_persistent_handle_list list, http_persistent_handle_dtor dtor)
+{
+ HashPosition pos;
+ http_persistent_handle *handle;
+
+ FOREACH_HASH_VAL(pos, list, handle) {
+#if HTTP_DEBUG_PHANDLES
+ fprintf(stderr, "DESTROY: %p\n", handle->ptr);
+#endif
+
+ dtor(handle->ptr);
+ }
+ zend_hash_clean(list);
+}
+