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

Reply via email to