Hello internals@,

I'm new to this list, so let me first introduce myself.
My name is Martijn van Duren and I work for a webhosting company in the
Netherlands. Apart from that I'm also an OpenBSD h^Hslacker.

tl;dr:
How do I properly use Z_REFCOUNT on a zval?

I'm faced with the following issue:
I've build a framework which allows to talk to a remote interface over
a persistent connection. This interface can return variables of
arbitrary types. When an object is returned it is stored locally in an
array accompanied by its id. This way I can ensure that the same object
(and not an identical object) is returned on multiple requests.

The problem I'm facing is that because this interface holds a reference
of the object it's never truly released and thus a memory leak. For the
application I use it for this is not an issue, but that might change in
the future.

To solve this I was thinking of creating a small extension which exports
a function that gives me the active reference count. This way I could
check in certain parts of the code if there's more than 1 variables
linked to the object and if not, remove it from the internal array.
This would not give a 100% result, but it's still better than hanging on
to everything all the time.

When playing with the extension I made the following function:
PHP_FUNCTION(refcount)
{
    zval var;
    zend_long refcount;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &var) == FAILURE) {
        return;
    }

    refcount = (zend_long) Z_REFCOUNT(var);

    RETURN_LONG(refcount);
}

Which didn't returned what I expected:
$ php -r 'dl("refcount.so"); for ($a = 0; $a < 4; $a++)
    echo refcount($a)."\n";'                                         
0
1
2
3

Could someone point me to what I'm doing wrong with Z_REFCOUNT?
If there is a better way to solve my actual problem I would be all ears
of course.

Sincerely,

Martijn van Duren

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to