summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArseny Kapoulkine <arseny.kapoulkine@gmail.com>2014-10-01 07:02:45 +0000
committerArseny Kapoulkine <arseny.kapoulkine@gmail.com>2014-10-01 07:02:45 +0000
commit89d19df43df8e7962bcf896a528d3214a3c28bbc (patch)
treee7d0a24bc1e44a890d9ada65fc9c132a4e945bd3
parent0c1a4f40feeb76ff4e22f20e7c2d7afb65cc88fc (diff)
Add header bit for 'name or value is shared' flag
This is required to make it possible to use a pointer to one of the buffers with the document data in nodes but keep offset_debug and (more importantly) XPath document order comparison optimization working. The change increases memory page alignment to 64 bytes (so requires +32 bytes for every page allocation, which should not be a problem - even with non-default 4k pages this is <1% extra cost, with default 32k pages the overhead is 0.1%) git-svn-id: https://pugixml.googlecode.com/svn/trunk@1031 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r--src/pugixml.cpp17
-rw-r--r--src/pugixml.hpp3
2 files changed, 12 insertions, 8 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index c9f29d7..8e61182 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -266,11 +266,14 @@ PUGI__NS_BEGIN
#endif
;
- static const uintptr_t xml_memory_page_alignment = 32;
+ static const uintptr_t xml_memory_page_alignment = 64;
static const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1);
+ static const uintptr_t xml_memory_page_name_or_value_shared_mask = 32;
static const uintptr_t xml_memory_page_name_allocated_mask = 16;
static const uintptr_t xml_memory_page_value_allocated_mask = 8;
static const uintptr_t xml_memory_page_type_mask = 7;
+ static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_name_or_value_shared_mask;
+ static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_name_or_value_shared_mask;
struct xml_allocator;
@@ -5334,13 +5337,13 @@ namespace pugi
case node_element:
case node_declaration:
case node_pi:
- return (_root->header & impl::xml_memory_page_name_allocated_mask) ? -1 : _root->name - buffer;
+ return (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) ? -1 : _root->name - buffer;
case node_pcdata:
case node_cdata:
case node_comment:
case node_doctype:
- return (_root->header & impl::xml_memory_page_value_allocated_mask) ? -1 : _root->value - buffer;
+ return (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) ? -1 : _root->value - buffer;
default:
return -1;
@@ -6830,8 +6833,8 @@ PUGI__NS_BEGIN
if (node)
{
- if (node->name && (node->header & xml_memory_page_name_allocated_mask) == 0) return node->name;
- if (node->value && (node->header & xml_memory_page_value_allocated_mask) == 0) return node->value;
+ if (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name;
+ if (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value;
return 0;
}
@@ -6839,8 +6842,8 @@ PUGI__NS_BEGIN
if (attr)
{
- if ((attr->header & xml_memory_page_name_allocated_mask) == 0) return attr->name;
- if ((attr->header & xml_memory_page_value_allocated_mask) == 0) return attr->value;
+ if ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name;
+ if ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value;
return 0;
}
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 69b2cb2..ba480cd 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -926,7 +926,8 @@ namespace pugi
private:
char_t* _buffer;
- char _memory[192];
+ // sizeof(xml_memory_page) + sizeof(xml_document_struct) + xml_memory_page_alignment + 1 void* in case compiler inserts padding
+ char _memory[sizeof(void*) * 20 + 64];
// Non-copyable semantics
xml_document(const xml_document&);