Re: [APC-DEV] refcount/is_ref commit

[email protected] (Brian Shire) Thu, 28 Dec 2006 07:33:21 -0800
Newsgroups php.apc.dev
Message-ID <[email protected]>
On Dec 28, 2006, at 2:16 AM, Gopal V wrote:

> Hi,
>
> Looking at (http://news.php.net/php.pecl.cvs/6820)
>
> -    /* deep-copying ensures that there is only one reference to  
> this in memory */
> -    (*dst)->refcount = 1;
> -    (*dst)->is_ref = 0;
> +    (*dst)->refcount = (*src)->refcount;
> +    (*dst)->is_ref = (*src)->is_ref;
>
> That could be a problem.
>
> When you copy *from* shm land, the zval->refcount used to be
> 1 because we never had circular references before. So this *might*
> leak (need more time to debug this), but there's another inconsistent
> part that might be more important.

Are we talking about memory leaks in PHP due to no cycle detection?  
(ie: any $a[] = &$a; type reference will leak in php), or something  
else?  I don't believe we should have an APC shared memory leak, but  
that's something I should verify.  Thanks for looking at this,  
definitely part of the commit that I was a bit unsure about.

>
> Because you call my_copy_zval() before you reset this, the
> refcount++ inside that function is over-written with the
> src->refcount.
>

Thanks for pointing it out, I wish I had seen it.  Also looking at it  
now it seems like I shouldn't be excluding the reset of the  
refcount.   Wonder if the preferred solution is something more along  
the lines of (saying this without testing it out *too* much):

--- a/apc_compile.c
+++ b/apc_compile.c
@@ -257,10 +257,9 @@ static zval** my_copy_zval_ptr(zval** ds
      if(dst_new != *dst) {
          deallocate(*dst);
          *dst = dst_new;
+    } else {
+        (*dst)->refcount = 1;
      }
-
-    (*dst)->refcount = (*src)->refcount;
-    (*dst)->is_ref = (*src)->is_ref;

      return dst;
}


> Cheers,
> Gopal
> PS: every time *I* start working on apc, something like this ruins my
>     day too :)

"If I learn from my mistakes, pretty soon I'll know everything."  :-)

> -- 
> You can't teach people to be lazy - either they have it, or they  
> don't.

-Brian Shire
  [email protected]
  [email protected]