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