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