pollita         Mon Jan  8 20:01:23 2007 UTC

  Modified files:              
    /php-src/ext/libxml libxml.c php_libxml.h 
  Log:
  Allow libxml DomNodes to remain persistent when requested by other extensions
  
http://cvs.php.net/viewvc.cgi/php-src/ext/libxml/libxml.c?r1=1.56&r2=1.57&diff_format=u
Index: php-src/ext/libxml/libxml.c
diff -u php-src/ext/libxml/libxml.c:1.56 php-src/ext/libxml/libxml.c:1.57
--- php-src/ext/libxml/libxml.c:1.56    Mon Jan  1 09:29:25 2007
+++ php-src/ext/libxml/libxml.c Mon Jan  8 20:01:23 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: libxml.c,v 1.56 2007/01/01 09:29:25 sebastian Exp $ */
+/* $Id: libxml.c,v 1.57 2007/01/08 20:01:23 pollita Exp $ */
 
 #define IS_EXT_MODULE
 
@@ -947,7 +947,9 @@
                ret_refcount = object->document->refcount;
        } else if (docp != NULL) {
                ret_refcount = 1;
-               object->document = emalloc(sizeof(php_libxml_ref_obj));
+               object->document = pemalloc(sizeof(php_libxml_ref_obj), 0);
+               object->document->persistent = 0;
+               object->document->external_owner = 0;
                object->document->ptr = docp;
                object->document->refcount = ret_refcount;
                object->document->doc_props = NULL;
@@ -972,9 +974,23 @@
                                }
                                efree(object->document->doc_props);
                        }
-                       efree(object->document);
+                       pefree(object->document, object->document->persistent);
                        object->document = NULL;
-               }
+               } else if (ret_refcount == 1 && 
object->document->external_owner) {
+                       /* PHP is done with this object, but someone else owns 
the DomNodes,
+                        * Kill the non-persistent bits, but leave the 
persistable php_libxml_ref_obj around */
+                       if (object->document->doc_props != NULL) {
+                               if (object->document->doc_props->classmap) {
+                                       
zend_hash_destroy(object->document->doc_props->classmap);
+                                       
FREE_HASHTABLE(object->document->doc_props->classmap);
+                               }
+                               efree(object->document->doc_props);
+                               object->document->doc_props = NULL;
+                       }
+                       /* Don't worry about the fact that this memory is left 
unfreed,
+                        * Whoever else owns it has the pointer stored 
somewhere */
+                       object->document = NULL;
+               }                       
        }
 
        return ret_refcount;
http://cvs.php.net/viewvc.cgi/php-src/ext/libxml/php_libxml.h?r1=1.23&r2=1.24&diff_format=u
Index: php-src/ext/libxml/php_libxml.h
diff -u php-src/ext/libxml/php_libxml.h:1.23 
php-src/ext/libxml/php_libxml.h:1.24
--- php-src/ext/libxml/php_libxml.h:1.23        Mon Jan  1 09:29:25 2007
+++ php-src/ext/libxml/php_libxml.h     Mon Jan  8 20:01:23 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_libxml.h,v 1.23 2007/01/01 09:29:25 sebastian Exp $ */
+/* $Id: php_libxml.h,v 1.24 2007/01/08 20:01:23 pollita Exp $ */
 
 #ifndef PHP_LIBXML_H
 #define PHP_LIBXML_H
@@ -58,6 +58,8 @@
        void *ptr;
        int   refcount;
        libxml_doc_props *doc_props;
+       zend_bool persistent;
+       zend_bool external_owner;
 } php_libxml_ref_obj;
 
 typedef struct _php_libxml_node_ptr {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to