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
On Tue, May 30, 2017 at 9:11 AM, Martijn van Duren php@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
3Could 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
On Tue, May 30, 2017 at 9:11 AM, Martijn van Duren php@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
3Could 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.)
Thanks for the explanation.
From your description, it sounds like you might be looking for the weakref
PECL extension.
That's even better than my original concept. Thanks.
Nikita