377 {
378
379 const uintptr_t p_val = reinterpret_cast<uintptr_t>(p);
380 if(p_val < m_min_page_ptr || p_val > m_max_page_ptr)
381 return false;
382
383 const size_t n_bucket = choose_bucket(len);
384
385 if(n_bucket != 0)
386 {
387 try
388 {
389 lock_guard_type<mutex_type> lock(m_mutex);
390
391 std::deque<Bucket>& buckets = m_buckets_for[n_bucket];
392
393 for(size_t i = 0; i != buckets.size(); ++i)
394 {
395 Bucket& bucket = buckets[i];
396 if(bucket.free(p))
397 {
398 if(bucket.empty())
399 {
400#if defined(BOTAN_MEM_POOL_USE_MMU_PROTECTIONS)
402#endif
403 m_free_pages.push_back(bucket.ptr());
404
405 if(i != buckets.size() - 1)
406 std::swap(buckets.back(), buckets[i]);
407 buckets.pop_back();
408 }
409 return true;
410 }
411 }
412 }
413 catch(...)
414 {
415
416
417
418
419
420
421
422
423
424
425
426
427
428 std::terminate();
429 }
430 }
431
432 return false;
433 }