120#if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
121 LIBCOPP_COPP_NAMESPACE_ID::util::lock::lock_holder<LIBCOPP_COPP_NAMESPACE_ID::util::lock::spin_lock> lock_guard(
125 if (0 != conf_.max_stack_number && limits_.used_stack_number >= conf_.max_stack_number) {
131 if (0 != conf_.max_stack_size && limits_.used_stack_size + conf_.stack_size > conf_.max_stack_size) {
138 if (!free_list_.empty()) {
139 typename std::list<stack_context>::reverse_iterator iter = free_list_.rbegin();
140 assert(iter != free_list_.rend());
144 --limits_.free_stack_number;
146 limits_.free_stack_number = free_list_.size() - 1;
150 limits_.free_stack_size -= (*iter).size;
152 limits_.free_stack_size = 0;
158 free_list_.pop_back();
161 ++limits_.used_stack_number;
162 limits_.used_stack_size += ctx.size;
166 free_list_.pop_back();
171 alloc_.allocate(ctx, conf_.stack_size);
172 if (
nullptr != ctx.sp && ctx.size > 0) {
174 ++limits_.used_stack_number;
175 limits_.used_stack_size += ctx.size;
177 conf_.stack_offset = ctx.size - conf_.stack_size;
186 assert(ctx.sp && ctx.size > 0);
188#if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
189 LIBCOPP_COPP_NAMESPACE_ID::util::lock::lock_holder<LIBCOPP_COPP_NAMESPACE_ID::util::lock::spin_lock> lock_guard(
193 if (ctx.sp ==
nullptr || 0 == ctx.size) {
199 limits_.used_stack_size -= ctx.size;
201 limits_.used_stack_size = 0;
205 --limits_.used_stack_number;
209 if (ctx.size != conf_.stack_size + conf_.stack_offset) {
210 alloc_.deallocate(ctx);
215 free_list_.push_back(ctx);
218 ++limits_.free_stack_number;
219 limits_.free_stack_size += ctx.size;
231 if (limits_.used_stack_size >= limits_.free_stack_size && limits_.used_stack_number >= limits_.free_stack_number) {
236 if (0 != conf_.min_stack_size || 0 != conf_.min_stack_number) {
237 bool min_stack_size =
238 conf_.min_stack_size == 0 || limits_.used_stack_size + limits_.free_stack_size <= conf_.min_stack_size;
239 bool min_stack_number = conf_.min_stack_number == 0 ||
240 limits_.free_stack_number + limits_.used_stack_number <= conf_.min_stack_number;
241 if (min_stack_size && min_stack_number) {
246#if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
247 LIBCOPP_COPP_NAMESPACE_ID::util::lock::lock_holder<LIBCOPP_COPP_NAMESPACE_ID::util::lock::spin_lock> lock_guard(
251 size_t keep_size = limits_.free_stack_size >> 1;
252 size_t keep_number = limits_.free_stack_number >> 1;
253 size_t left_gc = conf_.gc_number;
254 while (limits_.free_stack_size > keep_size || limits_.free_stack_number > keep_number) {
255 if (free_list_.empty()) {
256 limits_.free_stack_size = 0;
257 limits_.free_stack_number = 0;
261 typename std::list<stack_context>::iterator iter = free_list_.begin();
262 assert(iter != free_list_.end());
265 --limits_.free_stack_number;
267 limits_.free_stack_number = free_list_.size() - 1;
271 limits_.free_stack_size -= (*iter).size;
273 limits_.free_stack_size = 0;
276 alloc_.deallocate(*iter);
277 free_list_.pop_front();
295#if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
296 LIBCOPP_COPP_NAMESPACE_ID::util::lock::lock_holder<LIBCOPP_COPP_NAMESPACE_ID::util::lock::spin_lock> lock_guard(
300 limits_.free_stack_size = 0;
301 limits_.free_stack_number = 0;
303 for (
typename std::list<stack_context>::iterator iter = free_list_.begin(); iter != free_list_.end(); ++iter) {
304 alloc_.deallocate(*iter);