+static int apply_read_event_handler_ex(void *p, void *arg TSRMLS_DC)
+{
+ HashTable *rv = arg;
+ zval *zcb = php_pq_callback_to_zval(p);
+
+ zend_hash_next_index_insert(rv, &zcb, sizeof(zval *), NULL);
+
+ return ZEND_HASH_APPLY_KEEP;
+}
+
+static int apply_read_event_handlers(void *p TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
+{
+ HashTable *evhs = p, *rv = va_arg(argv, HashTable *);
+ zval *entry, **entry_ptr;
+
+ MAKE_STD_ZVAL(entry);
+ array_init_size(entry, zend_hash_num_elements(evhs));
+
+ if (key->nKeyLength) {
+ zend_hash_add(rv, key->arKey, key->nKeyLength, &entry, sizeof(zval *), (void *) &entry_ptr);
+ } else {
+ zend_hash_index_update(rv, key->h, &entry, sizeof(zval *), (void *) &entry_ptr);
+ }
+
+ zend_hash_apply_with_argument(evhs, apply_read_event_handler_ex, Z_ARRVAL_PP(entry_ptr) TSRMLS_CC);
+
+ return ZEND_HASH_APPLY_KEEP;
+}