1/* 2 * Copyright (C) 2014 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef Deallocator_h 27#define Deallocator_h 28 29#include "FixedVector.h" 30#include "MediumLine.h" 31#include "Sizes.h" 32#include "SmallLine.h" 33 34namespace bmalloc { 35 36// Per-cache object deallocator. 37 38class Deallocator { 39public: 40 Deallocator(); 41 ~Deallocator(); 42 43 void deallocate(void*); 44 bool deallocateFastCase(void*); 45 void deallocateSlowCase(void*); 46 47 void deallocateSmallLine(std::lock_guard<StaticMutex>&, SmallLine*); 48 SmallLine* allocateSmallLine(size_t smallSizeClass); 49 50 void deallocateMediumLine(std::lock_guard<StaticMutex>&, MediumLine*); 51 MediumLine* allocateMediumLine(); 52 53 void scavenge(); 54 55private: 56 typedef FixedVector<SmallLine*, smallLineCacheCapacity> SmallLineCache; 57 typedef FixedVector<MediumLine*, mediumLineCacheCapacity> MediumLineCache; 58 59 void deallocateLarge(void*); 60 void deallocateXLarge(void*); 61 void processObjectLog(); 62 63 FixedVector<void*, deallocatorLogCapacity> m_objectLog; 64 std::array<SmallLineCache, smallMax / alignment> m_smallLineCaches; 65 MediumLineCache m_mediumLineCache; 66}; 67 68inline bool Deallocator::deallocateFastCase(void* object) 69{ 70 if (!isSmallOrMedium(object)) 71 return false; 72 73 BASSERT(object); 74 75 if (m_objectLog.size() == m_objectLog.capacity()) 76 return false; 77 78 m_objectLog.push(object); 79 return true; 80} 81 82inline void Deallocator::deallocate(void* object) 83{ 84 if (!deallocateFastCase(object)) 85 deallocateSlowCase(object); 86} 87 88} // namespace bmalloc 89 90#endif // Deallocator_h 91