summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2015-05-12tests: Fix address sanitizer detection for GCCArseny Kapoulkine
2015-05-12Add config=sanitize support to MakefileArseny Kapoulkine
2015-05-12Add Visual Studio 2015 to AppVeyorArseny Kapoulkine
2015-05-12tests: Disable page allocator if address sanitizer is activeArseny Kapoulkine
Address sanitizer can detect underflows so we don't really need the custom allocator. Additionally, custom allocator can return memory that is not pointer-aligned; this causes undefined behavior sanitizer to complain.
2015-05-12tests: Fix clang 3.7 warningArseny Kapoulkine
Work around -Wself-move using ref-deref.
2015-05-03Update README.mdArseny Kapoulkine
2015-05-03Update README.mdArseny Kapoulkine
2015-05-03Switch Travis CI to use DockerArseny Kapoulkine
2015-05-03Fix NO_STL+NO_XPATH modeArseny Kapoulkine
auto_deleter is now used in all modes so we can't exclude it from compilation.
2015-05-03tests: Fix MSVC6 compatibilityArseny Kapoulkine
Apply the usual workaround for for scoping issues. Also fix integer conversion warning for BorlandC.
2015-05-03Merge pull request #42 from zeux/compactArseny Kapoulkine
Implement compact mode. This introduces a new storage mode that dramatically reduces node size at some performance cost. The mode is enabled by defining PUGIXML_COMPACT. This does not change API/ABI - all existing functionality still works. The pointers are stored using delta encoding and bytes, with some additional tricks to make encoding more optimal for e.g. parent pointer and string pointers. Since the node is fixed size, we have to fall back to a hash table if the pointer does not fit. Thus all DOM operations still have amortized complexity - constant number of operations if you don't need the hash table and amortized constant if you do. Aside from some performance loss (which is inevitable since decoding takes time), the only other caveat is that we can't remove entries from the hash table - so in some edge cases with a lot of node removals the peak memory consumption can grow indefinitely. In theory we can implement this later; it's unclear that this is useful at this point. The resulting node/attribute sizes are as follows: non-compact node: 28b 32-bit, 56b 64-bit compact node: 12b 32/64-bit non-compact attribute: 20b 32-bit, 40b 64-bit compact attribute: 8b 32/64-bit
2015-05-03Cleanup before mergeArseny Kapoulkine
2015-05-03Fix MSVC warningArseny Kapoulkine
2015-05-02Fix MSVC buildArseny Kapoulkine
2015-05-02Reorder conditions in compact_string implementationArseny Kapoulkine
Now compact_string matches compact_pointer_parent. Turns out PUGI__UNLIKELY is good at reordering conditions but usually does not really affect performance. Since MSVC should treat "if" branches as taken and does not support branch probabilities, don't use them if we don't need to.
2015-05-02Minor refactoringArseny Kapoulkine
2015-05-02Revise marker deletion strategyArseny Kapoulkine
Instead of checking if the object being removed allocated a marker, mark the marker block as deleted immediately upon allocation. This simplifies the logic and prevents extra markers from being inserted if we allocate/deallocate the same node indefinitely. Also change marker pointer type to uint32_t*.
2015-05-02Optimize compact_stringArseny Kapoulkine
First assignment uses a fast path; second assignment uses a specialized path as well.
2015-05-02tests: Add one more page reclamation testArseny Kapoulkine
2015-05-02Fix node deallocationArseny Kapoulkine
When we deallocate nodes/attributes that allocated the marker we have to adjust the size accordingly, and dismiss the marker in case it gets overwritten with something else...
2015-05-02Implement efficient compact_header storageArseny Kapoulkine
Header is now just 2 bytes, with optional additonal 4 bytes that are only allocated for every 85 nodes / 128 attributes.
2015-05-01Implement compact_string with shared storageArseny Kapoulkine
2015-05-01Rename compact_string to compact_string_fatArseny Kapoulkine
2015-05-01Revert to name/value storage inside nodeArseny Kapoulkine
This temporarily increases the node size to 16 bytes - we'll bring it back. It allows us to remove the horrible node_pi hack and to reduce the amount of changes against master. This comes at the price of not decreasing basline xml_node_struct size. The compact xml_node_struct is also increased by this change but a followup change will reduce *both* xml_attribute_struct and xml_node_struct (to 8/12 bytes).
2015-04-29tests: Fix spurious failures in compact modeArseny Kapoulkine
The memory_large_allocations test sometimes classified hash allocations as page allocations since hash table could reach 512 entries.
2015-04-29Refactor offset_debugArseny Kapoulkine
Split a long line into multiple statements.
2015-04-22Change xml_node_struct field order to match compactArseny Kapoulkine
Also remove useless comments.
2015-04-22Fix node_pi memory leakArseny Kapoulkine
2015-04-22Make xml_node::value() structure consistent with set_*Arseny Kapoulkine
2015-04-22Remove compact_header::operator uintptr_tArseny Kapoulkine
We used this in two cases - to get the page pointer and to test flags. We now use PUGI__GETPAGE for getting the page pointer and operator& to test flags - this makes getting node type significantly faster since it does not require page pointer reconstruction.
2015-04-22Remove redundant has_value checkArseny Kapoulkine
2015-04-22Use has_name/has_value in set_name/set_valueArseny Kapoulkine
2015-04-22Optimize and refactor compact_pointer implementationsArseny Kapoulkine
Clarify the offset applied when encoding the pointer difference. Make decoding diff slightly more clear - no effect on performance. Adjust branch weighting in compact_string encoding - 0.5% faster. Use uint16_t in compact_pointer_parent - 2% faster.
2015-04-21Optimize xml_allocator::reserve()Arseny Kapoulkine
Make sure compact_hash_table::rehash() is not inlined - that way reserve() is inlined so the fast path has no extra function calls. Also use subtraction instead of multiplication when checking capacity.
2015-04-21tests: Adjust allocation thresholds to fix testsArseny Kapoulkine
2015-04-21Merge branch 'master' into compactArseny Kapoulkine
2015-04-21tests: Fix MSVC warningsArseny Kapoulkine
2015-04-21Use -std=c++0x instead of -std=c++11Arseny Kapoulkine
2015-04-21Enable C++11 in MakefileArseny Kapoulkine
2015-04-21tests: Add move semantics testsArseny Kapoulkine
Also test ranged for and copying big xpath_variable_set objects (to make sure we actually handle hash collisions properly)
2015-04-21XPath: Implement move semantics supportArseny Kapoulkine
xpath_query, xpath_node_set and xpath_variable_set are now moveable. This is a nice performance optimization for variable/node sets, and enables storing xpath_query in containers without using pointers (it's only possible now since the query is not copyable).
2015-04-21Fix compilation warning in some configurationsArseny Kapoulkine
2015-04-15Implement copy ctor/assignment for xpath_variable_setArseny Kapoulkine
xpath_variable_set is essentially an associative container; it's about time it became copyable. Implementation is slightly tricky due to out of memory handling. Both copy ctor and assignment operator have strong exception guarantee (even if exceptions are disabled! which translates to "roll back on allocation errors").
2015-04-15tests: Fix Linux buildArseny Kapoulkine
2015-04-15tests: Use malloc for OSX/Linux page heapArseny Kapoulkine
Switch to malloc and manually aligning the pointer to the page boundary. mmap is much slower than malloc; this change makes tests ~4x faster.
2015-04-15Minor xpath_variable refactoringArseny Kapoulkine
The type of the variable is now initialized correctly in the ctor, so that there is no interim invalid state.
2015-04-14Fix xpath_node_set assignment to provide strong exception guaranteeArseny Kapoulkine
Since the type of the set was updated before assignment, assigning in out-of-memory condition could change the type to not match the content.
2015-04-14Explicitly call xml_buffered_writer::flush()Arseny Kapoulkine
If xml_writer::write throws an exception while being called from flush(), the exception is thrown from destructor. Clang in C++11 mode calls std::terminate in this case.
2015-04-13docs: Add format_indent_attributes documentationArseny Kapoulkine
Slightly reword format_indent description.
2015-04-13Refactor format_indent_attributes implementationArseny Kapoulkine
Fix code style and revert redundant parameters/whitespace changes. Also remove format_each_attribute_on_new_line - we're only introducing one extra formatting flag. The flag implies format_indent but does not include its bitmask. Also add a few more tests. Fixes #14.