1 /* 2 * Copyright (c) 2002 3 * John Maddock 4 * 5 * Use, modification and distribution are subject to the 6 * Boost Software License, Version 1.0. (See accompanying file 7 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 * 9 */ 10 11 /* 12 * LOCATION: see http://www.boost.org for most recent version. 13 * FILE mem_block_cache.hpp 14 * VERSION see <boost/version.hpp> 15 * DESCRIPTION: memory block cache used by the non-recursive matcher. 16 */ 17 18 #ifndef BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP 19 #define BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP 20 21 #include <new> 22 #ifdef BOOST_HAS_THREADS 23 #include <boost/regex/pending/static_mutex.hpp> 24 #endif 25 26 #ifdef BOOST_HAS_ABI_HEADERS 27 # include BOOST_ABI_PREFIX 28 #endif 29 30 namespace boost{ 31 namespace re_detail{ 32 33 struct mem_block_node 34 { 35 mem_block_node* next; 36 }; 37 38 struct mem_block_cache 39 { 40 // this member has to be statically initialsed: 41 mem_block_node* next; 42 unsigned cached_blocks; 43 #ifdef BOOST_HAS_THREADS 44 boost::static_mutex mut; 45 #endif 46 ~mem_block_cacheboost::re_detail::mem_block_cache47 ~mem_block_cache() 48 { 49 while(next) 50 { 51 mem_block_node* old = next; 52 next = next->next; 53 ::operator delete(old); 54 } 55 } getboost::re_detail::mem_block_cache56 void* get() 57 { 58 #ifdef BOOST_HAS_THREADS 59 boost::static_mutex::scoped_lock g(mut); 60 #endif 61 if(next) 62 { 63 mem_block_node* result = next; 64 next = next->next; 65 --cached_blocks; 66 return result; 67 } 68 return ::operator new(BOOST_REGEX_BLOCKSIZE); 69 } putboost::re_detail::mem_block_cache70 void put(void* p) 71 { 72 #ifdef BOOST_HAS_THREADS 73 boost::static_mutex::scoped_lock g(mut); 74 #endif 75 if(cached_blocks >= BOOST_REGEX_MAX_CACHE_BLOCKS) 76 { 77 ::operator delete(p); 78 } 79 else 80 { 81 mem_block_node* old = static_cast<mem_block_node*>(p); 82 old->next = next; 83 next = old; 84 ++cached_blocks; 85 } 86 } 87 }; 88 89 extern mem_block_cache block_cache; 90 91 } 92 } // namespace boost 93 94 #ifdef BOOST_HAS_ABI_HEADERS 95 # include BOOST_ABI_SUFFIX 96 #endif 97 98 #endif 99 100