On Tue, May 30, 2017 at 9:11 AM, Martijn van Duren <p...@list.imperialat.at>
wrote:

> 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
>

Since PHP 7 not all zval types are refcounted. Before accessing Z_REFCOUNT
you should first use Z_REFCOUNTED to check if a refcount exists. You are
testing with integers, which is one of the not reference counted types.
(Objects are always reference counted.)

>From your description, it sounds like you might be looking for the weakref
PECL extension.

Nikita

Reply via email to