From 4ee37711afd0de98bc757ed4853a81d66a6a1533 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Mon, 8 Oct 2012 13:36:11 -0700 Subject: [PATCH 1/1] mymemory: add SnapshotAlloc STL allocator Now, we just need to go through the tedious process of rewriting all our STL definitions --- mymemory.cc | 4 +-- mymemory.h | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/mymemory.cc b/mymemory.cc index 08bd4e43..5922a32d 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -149,9 +149,7 @@ mspace model_snapshot_space = NULL; #if USE_MPROTECT_SNAPSHOT -/** @brief Global mspace reference for the user's snapshotting heap - * @todo use this ONLY for user's allocations, not for internal snapshotting - * state */ +/** @brief Global mspace reference for the user's snapshotting heap */ mspace user_snapshot_space = NULL; /** Check whether this is bootstrapped memory that we should not free */ diff --git a/mymemory.h b/mymemory.h index d7c4f995..a2a9096d 100644 --- a/mymemory.h +++ b/mymemory.h @@ -142,6 +142,98 @@ bool operator!= (const ModelAlloc&, return false; } +/** @brief Provides a snapshotting allocator for use in STL classes. + * + * The code was adapted from a code example from the book The C++ + * Standard Library - A Tutorial and Reference by Nicolai M. Josuttis, + * Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999 + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +template +class SnapshotAlloc { + public: + // type definitions + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef size_t size_type; + typedef size_t difference_type; + + // rebind allocator to type U + template + struct rebind { + typedef SnapshotAlloc other; + }; + + // return address of values + pointer address(reference value) const { + return &value; + } + const_pointer address(const_reference value) const { + return &value; + } + + /* constructors and destructor + * - nothing to do because the allocator has no state + */ + SnapshotAlloc() throw() { + } + SnapshotAlloc(const SnapshotAlloc&) throw() { + } + template + SnapshotAlloc(const SnapshotAlloc&) throw() { + } + ~SnapshotAlloc() throw() { + } + + // return maximum number of elements that can be allocated + size_type max_size() const throw() { + return std::numeric_limits::max() / sizeof(T); + } + + // allocate but don't initialize num elements of type T + pointer allocate(size_type num, const void * = 0) { + pointer p = (pointer)snapshot_malloc(num * sizeof(T)); + return p; + } + + // initialize elements of allocated storage p with value value + void construct(pointer p, const T& value) { + // initialize memory with placement new + new((void*)p)T(value); + } + + // destroy elements of initialized storage p + void destroy(pointer p) { + // destroy objects by calling their destructor + p->~T(); + } + + // deallocate storage p of deleted elements + void deallocate(pointer p, size_type num) { + snapshot_free((void*)p); + } +}; + +/** Return that all specializations of this allocator are interchangeable. */ +template +bool operator ==(const SnapshotAlloc&, + const SnapshotAlloc&) throw() { + return true; +} + +/** Return that all specializations of this allocator are interchangeable. */ +template +bool operator!= (const SnapshotAlloc&, + const SnapshotAlloc&) throw() { + return false; +} + #ifdef __cplusplus extern "C" { #endif -- 2.34.1