Files
boost_regex/include/boost/regex/v4/mem_block_cache.hpp

80 lines
1.8 KiB
C++
Raw Normal View History

2003-05-17 11:45:48 +00:00
/*
* Copyright (c) 2002
* John Maddock
2003-05-17 11:45:48 +00:00
*
2003-10-04 11:29:20 +00:00
* Use, modification and distribution are subject to the
* Boost Software License, Version 1.0. (See accompanying file
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
2003-05-17 11:45:48 +00:00
*
*/
/*
* LOCATION: see http://www.boost.org for most recent version.
* FILE mem_block_cache.hpp
* VERSION see <boost/version.hpp>
* DESCRIPTION: memory block cache used by the non-recursive matcher.
*/
#ifndef BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
#define BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
#include <new>
#include <boost/atomic/atomic.hpp>
2003-05-17 11:45:48 +00:00
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
2003-05-17 11:45:48 +00:00
#endif
namespace boost{
namespace BOOST_REGEX_DETAIL_NS{
2003-05-17 11:45:48 +00:00
struct mem_block_cache
{
boost::atomic<void*> cache[BOOST_REGEX_MAX_CACHE_BLOCKS];
2003-05-17 11:45:48 +00:00
mem_block_cache() {
for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
cache[i].store(NULL);
}
}
2003-05-17 11:45:48 +00:00
~mem_block_cache()
{
for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
if (cache[i].load()) ::operator delete(cache[i].load());
}
2003-05-17 11:45:48 +00:00
}
void* get()
{
for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
void* p = cache[i].load();
if (p != NULL) {
if (cache[i].compare_exchange_strong(p, NULL)) return p;
}
}
return ::operator new(BOOST_REGEX_BLOCKSIZE);
2003-05-17 11:45:48 +00:00
}
void put(void* ptr)
2003-05-17 11:45:48 +00:00
{
for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
void* p = cache[i].load();
if (p == NULL) {
if (cache[i].compare_exchange_strong(p, ptr)) return;
}
}
::operator delete(ptr);
2003-05-17 11:45:48 +00:00
}
};
extern mem_block_cache block_cache;
}
} // namespace boost
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
2003-05-17 11:45:48 +00:00
#endif
#endif