summaryrefslogtreecommitdiff
path: root/ext/xsl/xsltprocessor.c
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2003-07-05 23:43:10 +0000
committerRob Richards <rrichards@php.net>2003-07-05 23:43:10 +0000
commit1688895f6b68bd7c4930004bd0efb54f6dee6308 (patch)
tree666526f6d474d0c9d88e4020bcc3f4928fb50730 /ext/xsl/xsltprocessor.c
parentf145b163a8281298872a73856238bc5ed0a14713 (diff)
downloadphp-git-1688895f6b68bd7c4930004bd0efb54f6dee6308.tar.gz
use common doc with ref counting rather than copy
Diffstat (limited to 'ext/xsl/xsltprocessor.c')
-rw-r--r--ext/xsl/xsltprocessor.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c
index cfe4fa3dc3..ad1ad7f4ca 100644
--- a/ext/xsl/xsltprocessor.c
+++ b/ext/xsl/xsltprocessor.c
@@ -126,7 +126,6 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet)
zval *id, *docp = NULL;
xmlDoc *doc = NULL;
xsltStylesheetPtr sheetp, oldsheetp;
- xmlDocPtr newdocp;
xsl_object *intern;
node_object *docobj;
@@ -135,15 +134,12 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet)
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
RETURN_FALSE;
}
+
DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj);
- /* copy the doc, so that it's not accessable from outside
- FIXME: and doubling memory consumption...
- */
- newdocp = xmlCopyDoc(doc, 1);
- sheetp = xsltParseStylesheetDoc(newdocp);
+
+ sheetp = xsltParseStylesheetDoc(doc);
if (!sheetp) {
- xmlFreeDoc(newdocp);
RETURN_FALSE;
}
@@ -154,10 +150,21 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet)
efree(((xsltStylesheetPtr) intern->ptr)->_private);
((xsltStylesheetPtr) intern->ptr)->_private = NULL;
}
- //FIXME: more non-thread safe stuff
+ if (intern->document != NULL) {
+ if (--intern->document->refcount == 0) {
+ xmlFreeDoc((xmlDocPtr) intern->document->ptr);
+ efree(intern->document);
+ }
+ ((xsltStylesheetPtr) intern->ptr)->doc = NULL;
+ intern->document = NULL;
+ }
xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr);
intern->ptr = NULL;
- }
+ }
+
+ intern->document = docobj->document;
+ intern->document->refcount++;
+
php_xsl_set_object(id, sheetp TSRMLS_CC);
}
/* }}} end xsl_xsltprocessor_import_stylesheet */