// // mp::mt_source // // Copyright (C) 2008 FURUHASHI Sadayuki // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef MP_MT_SOURCE_IMPL_H__ #define MP_MT_SOURCE_IMPL_H__ namespace mp { template mt_source::mt_source() { } template mt_source::~mt_source() { } template void* mt_source::malloc(size_t sz) { char* bf = (char*)m_src.malloc(sz); bf[0] = 1; try { mark(bf); } catch(...) { m_src.free(bf); throw std::bad_alloc(); } return (void*)(bf+1); } template void mt_source::mark(char* bf) { for(blocks_t::iterator it(m_blocks.begin()), it_end(m_blocks.end()); it != it_end; ++it) { if(!*it) { *it = bf; return; } } m_blocks.push_back(bf); } template void mt_source::collect() { for(blocks_t::iterator it(m_blocks.begin()), it_end(m_blocks.end()); it != it_end; ++it) { if(*it && **it == 0) { m_src.free((void*)*it); *it = NULL; } } } template void mt_source::free(void* x) { char* bf = ((char*)x) - 1; *bf = 0; } } // namespace mp #endif /* mp/mt_source.h */