Updated with platform checks

This commit is contained in:
Yucheng Low
2015-12-15 14:26:03 -08:00
parent b9f55efe98
commit 3f14031142
2 changed files with 81 additions and 3 deletions

View File

@ -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 <atomic>
#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<void*> cache[BOOST_REGEX_MAX_CACHE_BLOCKS];
BOOST_REGEX_ATOMIC_POINTER<void*> 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<mem_block_node*>(p);
old->next = next;
next = old;
++cached_blocks;
}
}
};
#endif
extern mem_block_cache block_cache;
}