diff options
author | csilvers <csilvers@6b5cf1ce-ec42-a296-1ba9-69fdba395a50> | 2010-01-20 23:01:09 +0000 |
---|---|---|
committer | csilvers <csilvers@6b5cf1ce-ec42-a296-1ba9-69fdba395a50> | 2010-01-20 23:01:09 +0000 |
commit | ddf6aeeb1079bb802cbbabdbc41c4545245d344f (patch) | |
tree | 79f5eed6c847d9c6722e787c94f1370830d1c80f /trunk/src/system-alloc.h | |
parent | bec0b6dbdf230e7b0b13168b8b45e8b6ded792b9 (diff) | |
download | gperftools-ddf6aeeb1079bb802cbbabdbc41c4545245d344f.tar.gz |
Tag for google-perftools 1.5google-perftools-1.5
git-svn-id: http://gperftools.googlecode.com/svn/tags/google-perftools-1.5@87 6b5cf1ce-ec42-a296-1ba9-69fdba395a50
Diffstat (limited to 'trunk/src/system-alloc.h')
-rw-r--r-- | trunk/src/system-alloc.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/trunk/src/system-alloc.h b/trunk/src/system-alloc.h new file mode 100644 index 0000000..44b0333 --- /dev/null +++ b/trunk/src/system-alloc.h @@ -0,0 +1,113 @@ +// 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); + +// 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_ */ |