| Index: third_party/tcmalloc/system-alloc.h
|
| ===================================================================
|
| --- third_party/tcmalloc/system-alloc.h (revision 0)
|
| +++ third_party/tcmalloc/system-alloc.h (revision 0)
|
| @@ -0,0 +1,119 @@
|
| +// Copyright (c) 2005, Google Inc.
|
| +// All rights reserved.
|
| +//
|
| +// Redistribution and use in source and binary forms, with or without
|
| +// modification, are permitted provided that the following conditions are
|
| +// met:
|
| +//
|
| +// * Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// * Redistributions in binary form must reproduce the above
|
| +// copyright notice, this list of conditions and the following disclaimer
|
| +// in the documentation and/or other materials provided with the
|
| +// distribution.
|
| +// * Neither the name of Google Inc. nor the names of its
|
| +// contributors may be used to endorse or promote products derived from
|
| +// this software without specific prior written permission.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +// ---
|
| +// Author: Sanjay Ghemawat
|
| +//
|
| +// Routine that uses sbrk/mmap to allocate memory from the system.
|
| +// Useful for implementing malloc.
|
| +
|
| +#ifndef TCMALLOC_SYSTEM_ALLOC_H_
|
| +#define TCMALLOC_SYSTEM_ALLOC_H_
|
| +
|
| +#include <config.h>
|
| +#include "internal_logging.h"
|
| +
|
| +// REQUIRES: "alignment" is a power of two or "0" to indicate default alignment
|
| +//
|
| +// Allocate and return "N" bytes of zeroed memory.
|
| +//
|
| +// If actual_bytes is NULL then the returned memory is exactly the
|
| +// requested size. If actual bytes is non-NULL then the allocator
|
| +// may optionally return more bytes than asked for (i.e. return an
|
| +// entire "huge" page if a huge page allocator is in use).
|
| +//
|
| +// The returned pointer is a multiple of "alignment" if non-zero.
|
| +//
|
| +// Returns NULL when out of memory.
|
| +extern void* TCMalloc_SystemAlloc(size_t bytes, size_t *actual_bytes,
|
| + size_t alignment = 0);
|
| +
|
| +// This call is a hint to the operating system that the pages
|
| +// contained in the specified range of memory will not be used for a
|
| +// while, and can be released for use by other processes or the OS.
|
| +// Pages which are released in this way may be destroyed (zeroed) by
|
| +// the OS. The benefit of this function is that it frees memory for
|
| +// use by the system, the cost is that the pages are faulted back into
|
| +// the address space next time they are touched, which can impact
|
| +// performance. (Only pages fully covered by the memory region will
|
| +// be released, partial pages will not.)
|
| +extern void TCMalloc_SystemRelease(void* start, size_t length);
|
| +
|
| +// Called to ressurect memory which has been previously released
|
| +// to the system via TCMalloc_SystemRelease. An attempt to
|
| +// commit a page that is already committed does not cause this
|
| +// function to fail.
|
| +extern void TCMalloc_SystemCommit(void* start, size_t length);
|
| +
|
| +// Interface to a pluggable system allocator.
|
| +class SysAllocator {
|
| + public:
|
| + SysAllocator()
|
| + : usable_(true),
|
| + failed_(false) {
|
| + };
|
| + virtual ~SysAllocator() {};
|
| +
|
| + virtual void* Alloc(size_t size, size_t *actual_size, size_t alignment) = 0;
|
| +
|
| + // Populate the map with whatever properties the specified allocator finds
|
| + // useful for debugging (such as number of bytes allocated and whether the
|
| + // allocator has failed). The callee is responsible for any necessary
|
| + // locking (and avoiding deadlock).
|
| + virtual void DumpStats(TCMalloc_Printer* printer) = 0;
|
| +
|
| + // So the allocator can be turned off at compile time
|
| + bool usable_;
|
| +
|
| + // Did this allocator fail? If so, we don't need to retry more than twice.
|
| + bool failed_;
|
| +};
|
| +
|
| +// Register a new system allocator. The priority determines the order in
|
| +// which the allocators will be invoked. Allocators with numerically lower
|
| +// priority are tried first. To keep things simple, the priority of various
|
| +// allocators is known at compile time.
|
| +//
|
| +// Valid range of priorities: [0, kMaxDynamicAllocators)
|
| +//
|
| +// Please note that we can't use complex data structures and cause
|
| +// recursive calls to malloc within this function. So all data structures
|
| +// are statically allocated.
|
| +//
|
| +// Returns true on success. Does nothing on failure.
|
| +extern PERFTOOLS_DLL_DECL bool RegisterSystemAllocator(SysAllocator *allocator,
|
| + int priority);
|
| +
|
| +// Number of SysAllocators known to call RegisterSystemAllocator
|
| +static const int kMaxDynamicAllocators = 2;
|
| +
|
| +// Retrieve the current state of various system allocators.
|
| +extern PERFTOOLS_DLL_DECL void DumpSystemAllocatorStats(TCMalloc_Printer* printer);
|
| +
|
| +#endif /* TCMALLOC_SYSTEM_ALLOC_H_ */
|
|
|