From 14bda69d0d1830e94a4b534e63e0a97a447a186e Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Mon, 10 May 2010 12:21:51 +0000 Subject: Optimized xml_document::destroy git-svn-id: http://pugixml.googlecode.com/svn/trunk@402 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixml.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/pugixml.cpp b/src/pugixml.cpp index c97c56b..73b5271 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -4084,20 +4084,34 @@ namespace pugi void xml_document::destroy() { + // destroy static storage if (_buffer) { global_deallocate(_buffer); _buffer = 0; } - // unoptimized deallocation, for verification purposes + // destroy dynamic storage, leave sentinel page and next page (if any) if (_root) { - _root->destroy(get_allocator(), sizeof(xml_document_struct)); - assert(_memory.next); - assert(!_memory.next->next); - assert(_memory.next->busy_size == 0 && _memory.next->freed_size == 0); + + // destroy all pages + for (xml_memory_page* page = _memory.next->next; page; ) + { + xml_memory_page* next = page->next; + + xml_allocator::deallocate_page(page); + + page = next; + } + + // cleanup next page + _memory.next->allocator = 0; + _memory.next->next = 0; + _memory.next->busy_size = _memory.next->freed_size = 0; + + _root = 0; } else { -- cgit v1.2.3