15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2008, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Sanjay Ghemawat <opensource@google.com>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TCMALLOC_CENTRAL_FREELIST_H_
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TCMALLOC_CENTRAL_FREELIST_H_
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>                     // for size_t
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDINT_H
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>                     // for int32_t
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/spinlock.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/thread_annotations.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "common.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "span.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tcmalloc {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data kept per size-class in central cache.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CentralFreeList {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A CentralFreeList may be used before its constructor runs.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // So we prevent lock_'s constructor from doing anything to the
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lock_ state.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CentralFreeList() : lock_(base::LINKER_INITIALIZED) { }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(size_t cl);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These methods all do internal locking.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert the specified range into the central freelist.  N is the number of
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // elements in the range.  RemoveRange() is the opposite operation.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertRange(void *start, void *end, int N);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the actual number of fetched elements and sets *start and *end.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int RemoveRange(void **start, void **end, int N);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of free objects in cache.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int length() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SpinLockHolder h(&lock_);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return counter_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of free objects in the transfer cache.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tc_length();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the memory overhead (internal fragmentation) attributable
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the freelist.  This is memory lost when the size of elements
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a freelist doesn't exactly divide the page-size (an 8192-byte
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page full of 5-byte objects would have 2 bytes memory overhead).
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t OverheadBytes();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TransferCache is used to cache transfers of
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sizemap.num_objects_to_move(size_class) back and forth between
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread caches and the central cache for a given size class.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct TCEntry {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *head;  // Head of chain of objects.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *tail;  // Tail of chain of objects.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A central cache freelist can have anywhere from 0 to kMaxNumTransferEntries
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // slots to put link list chains into.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef TCMALLOC_SMALL_BUT_SLOW
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For the small memory model, the transfer cache is not used.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kMaxNumTransferEntries = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting point for the the maximum number of entries in the transfer cache.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This actual maximum for a given size class may be lower than this
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // maximum value.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kMaxNumTransferEntries = 64;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is held
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove object from cache and return.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return NULL if no free entries in cache.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* FetchFromSpans() EXCLUSIVE_LOCKS_REQUIRED(lock_);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is held
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove object from cache and return.  Fetches
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from pageheap if cache is empty.  Only returns
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL on allocation failure.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* FetchFromSpansSafe() EXCLUSIVE_LOCKS_REQUIRED(lock_);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is held
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release a linked list of objects to spans.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May temporarily release lock_.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseListToSpans(void *start) EXCLUSIVE_LOCKS_REQUIRED(lock_);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is held
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release an object to spans.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May temporarily release lock_.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseToSpans(void* object) EXCLUSIVE_LOCKS_REQUIRED(lock_);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is held
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate cache by fetching from the page heap.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May temporarily release lock_.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Populate() EXCLUSIVE_LOCKS_REQUIRED(lock_);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock is held.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to make room for a TCEntry.  If the cache is full it will try to
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expand it at the cost of some other cache size.  Return false if there is
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no space.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MakeCacheSpace() EXCLUSIVE_LOCKS_REQUIRED(lock_);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ for locked_size_class is held.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Picks a "random" size class to steal TCEntry slot from.  In reality it
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just iterates over the sizeclasses but does so without taking a lock.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true on success.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May temporarily lock a "random" size class.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool EvictRandomSizeClass(int locked_size_class, bool force);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // REQUIRES: lock_ is *not* held.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to shrink the Cache.  If force is true it will relase objects to
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // spans if it allows it to shrink the cache.  Return false if it failed to
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shrink the cache.  Decrements cache_size_ on succeess.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May temporarily take lock_.  If it takes lock_, the locked_size_class
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lock is released to keep the thread from holding two size class locks
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // concurrently which could lead to a deadlock.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShrinkCache(int locked_size_class, bool force) LOCKS_EXCLUDED(lock_);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This lock protects all the data members.  cached_entries and cache_size_
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be looked at without holding the lock.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpinLock lock_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We keep linked lists of empty and non-empty spans.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t   size_class_;     // My size class
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Span     empty_;          // Dummy header for list of empty spans
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Span     nonempty_;       // Dummy header for list of non-empty spans
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t   num_spans_;      // Number of spans in empty_ plus nonempty_
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t   counter_;        // Number of free objects in cache entry
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Here we reserve space for TCEntry cache slots.  Space is preallocated
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the largest possible number of entries than any one size class may
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // accumulate.  Not all size classes are allowed to accumulate
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kMaxNumTransferEntries, so there is some wasted space for those size
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // classes.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TCEntry tc_slots_[kMaxNumTransferEntries];
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of currently used cached entries in tc_slots_.  This variable is
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updated under a lock but can be read without one.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t used_slots_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current number of slots for this size class.  This is an
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // adaptive value that is increased if there is lots of traffic
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on a given size class.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t cache_size_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximum size of the cache for a given size class.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t max_cache_size_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pads each CentralCache object to multiple of 64 bytes.  Since some
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compilers (such as MSVC) don't like it when the padding is 0, I use
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template specialization to remove the padding entirely when
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sizeof(CentralFreeList) is a multiple of 64.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<int kFreeListSizeMod64>
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CentralFreeListPaddedTo : public CentralFreeList {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char pad_[64 - kFreeListSizeMod64];
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CentralFreeListPaddedTo<0> : public CentralFreeList {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CentralFreeListPadded : public CentralFreeListPaddedTo<
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sizeof(CentralFreeList) % 64> {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tcmalloc
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // TCMALLOC_CENTRAL_FREELIST_H_
201