From 3f14031142b64820a7baf4c744638976375fd5d3 Mon Sep 17 00:00:00 2001 From: Yucheng Low Date: Tue, 15 Dec 2015 14:26:03 -0800 Subject: [PATCH] Updated with platform checks --- include/boost/regex/v4/mem_block_cache.hpp | 78 +++++++++++++++++++++- src/regex.cpp | 6 +- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/include/boost/regex/v4/mem_block_cache.hpp b/include/boost/regex/v4/mem_block_cache.hpp index 6ef9e403..6703ccf1 100644 --- a/include/boost/regex/v4/mem_block_cache.hpp +++ b/include/boost/regex/v4/mem_block_cache.hpp @@ -25,12 +25,26 @@ # include BOOST_ABI_PREFIX #endif +#ifdef BOOST_NO_CXX11_HDR_ATOMIC + #if BOOST_ATOMIC_POINTER_LOCK_FREE == 2 + #define BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE + #define BOOST_REGEX_ATOMIC_POINTER boost::atomic + #endif +#else // BOOST_NOCXX11_HDR_ATOMIC not defined + #include + #if ATOMIC_POINTER_LOCK_FREE == 2 + #define BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE + #define BOOST_REGEX_ATOMIC_POINTER std::atomic + #endif +#endif + namespace boost{ namespace BOOST_REGEX_DETAIL_NS{ +#ifdef BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE /* lock free implementation */ struct mem_block_cache { - boost::atomic cache[BOOST_REGEX_MAX_CACHE_BLOCKS]; + BOOST_REGEX_ATOMIC_POINTER cache[BOOST_REGEX_MAX_CACHE_BLOCKS]; mem_block_cache() { for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) { @@ -66,6 +80,68 @@ struct mem_block_cache } }; +#undef BOOST_REGEX_ATOMIC_POINTER + +#else /* lock-based implementation */ + + +struct mem_block_node +{ + mem_block_node* next; +}; + +struct mem_block_cache +{ + // this member has to be statically initialsed: + mem_block_node* next; + unsigned cached_blocks; +#ifdef BOOST_HAS_THREADS + boost::static_mutex mut; +#endif + + ~mem_block_cache() + { + while(next) + { + mem_block_node* old = next; + next = next->next; + ::operator delete(old); + } + } + void* get() + { +#ifdef BOOST_HAS_THREADS + boost::static_mutex::scoped_lock g(mut); +#endif + if(next) + { + mem_block_node* result = next; + next = next->next; + --cached_blocks; + return result; + } + return ::operator new(BOOST_REGEX_BLOCKSIZE); + } + void put(void* p) + { +#ifdef BOOST_HAS_THREADS + boost::static_mutex::scoped_lock g(mut); +#endif + if(cached_blocks >= BOOST_REGEX_MAX_CACHE_BLOCKS) + { + ::operator delete(p); + } + else + { + mem_block_node* old = static_cast(p); + old->next = next; + next = old; + ++cached_blocks; + } + } +}; +#endif + extern mem_block_cache block_cache; } diff --git a/src/regex.cpp b/src/regex.cpp index 054bec69..560d3be2 100644 --- a/src/regex.cpp +++ b/src/regex.cpp @@ -191,10 +191,12 @@ BOOST_REGEX_DECL void BOOST_REGEX_CALL put_mem_block(void* p) #else -#ifdef BOOST_HAS_THREADS +#if defined(BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE) mem_block_cache block_cache; +#elif defined(BOOST_HAS_THREADS) +mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, }; #else -mem_block_cache block_cache; +mem_block_cache block_cache = { 0, 0, }; #endif BOOST_REGEX_DECL void* BOOST_REGEX_CALL get_mem_block()