Hi, Perhaps I'm missing something, but I noticed the current ZE2 implementation doesn't seem to correctly handle constants registered to internal classes. I tracked down the cause of this problem, and finally figured out that those constants are destroyed by the ordinary zval_ptr_dtor_wrapper() at the destruction of the constant hash after the deactivation of the memory manager. Then I'm putting forward the following ideas to avoid this.
1. Unify the calls of pefree() / efree() by a function pointer followed by the actual memory block which directs to the actual free() implementation the memory block should be freed by. Here's the example stuff I'm referring to: typedef struct _memblk_t { void (*free_fn)(void *ptr); byte blk[]; } memblk_t; void efree_impl(void *ptr) { ... } void pefree_impl(void *ptr) { free(ptr); } void *pemalloc_impl(size_t sz) { return malloc(sz); } void *pemalloc(size_t sz, int persistent) { void *ptr; if (persistent) { ptr = emalloc_impl(sz + sizeof(memblk_t)); ptr->free_fn = efree_impl; } else { ptr = pemalloc_impl(sz + sizeof(memblk_t)); ptr->free_fn = pefree_impl; } return (void *)ptr->blk; } void efree(void *ptr) { memblk_t *actual_head; actual_head = (memblk_t *)((byte *)ptr - &((memblk_t *)0)->blk); actual_head->free_fn((void *)actual_head); } 2. Add some new constructors / destructors dedicated to the persistent zvals, like ALLOC_INIT_PERSISTENT_ZVAL(), persistent_zval_dtor(), or persistent_zval_ptr_dtor(). I don't like this idea though. Any opinions? Moriyoshi -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php