Chris@16: /* Chris@16: * Copyright (c) 2002 Chris@16: * John Maddock Chris@16: * Chris@16: * Use, modification and distribution are subject to the Chris@16: * Boost Software License, Version 1.0. (See accompanying file Chris@16: * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Chris@16: */ Chris@16: Chris@16: /* Chris@16: * LOCATION: see http://www.boost.org for most recent version. Chris@16: * FILE mem_block_cache.hpp Chris@16: * VERSION see Chris@16: * DESCRIPTION: memory block cache used by the non-recursive matcher. Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP Chris@16: #define BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP Chris@16: Chris@16: #include Chris@16: #ifdef BOOST_HAS_THREADS Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: # include BOOST_ABI_PREFIX Chris@16: #endif Chris@16: Chris@16: namespace boost{ Chris@16: namespace re_detail{ Chris@16: Chris@16: struct mem_block_node Chris@16: { Chris@16: mem_block_node* next; Chris@16: }; Chris@16: Chris@16: struct mem_block_cache Chris@16: { Chris@16: // this member has to be statically initialsed: Chris@16: mem_block_node* next; Chris@16: unsigned cached_blocks; Chris@16: #ifdef BOOST_HAS_THREADS Chris@16: boost::static_mutex mut; Chris@16: #endif Chris@16: Chris@16: ~mem_block_cache() Chris@16: { Chris@16: while(next) Chris@16: { Chris@16: mem_block_node* old = next; Chris@16: next = next->next; Chris@16: ::operator delete(old); Chris@16: } Chris@16: } Chris@16: void* get() Chris@16: { Chris@16: #ifdef BOOST_HAS_THREADS Chris@16: boost::static_mutex::scoped_lock g(mut); Chris@16: #endif Chris@16: if(next) Chris@16: { Chris@16: mem_block_node* result = next; Chris@16: next = next->next; Chris@16: --cached_blocks; Chris@16: return result; Chris@16: } Chris@16: return ::operator new(BOOST_REGEX_BLOCKSIZE); Chris@16: } Chris@16: void put(void* p) Chris@16: { Chris@16: #ifdef BOOST_HAS_THREADS Chris@16: boost::static_mutex::scoped_lock g(mut); Chris@16: #endif Chris@16: if(cached_blocks >= BOOST_REGEX_MAX_CACHE_BLOCKS) Chris@16: { Chris@16: ::operator delete(p); Chris@16: } Chris@16: else Chris@16: { Chris@16: mem_block_node* old = static_cast(p); Chris@16: old->next = next; Chris@16: next = old; Chris@16: ++cached_blocks; Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: extern mem_block_cache block_cache; Chris@16: Chris@16: } Chris@16: } // namespace boost Chris@16: Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: # include BOOST_ABI_SUFFIX Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: