15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2005, 2007, Google Inc. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved. 402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// met: 802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this software without specific prior written permission. 1802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/FastMalloc.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "wtf/PartitionAlloc.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "wtf/SpinLock.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string.h> 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic PartitionAllocatorGeneric gPartition; 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic int gLock = 0; 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic bool gInitialized = false; 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 4402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid* fastZeroedMalloc(size_t n) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* result = fastMalloc(n); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) memset(result, 0, n); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)char* fastStrDup(const char* src) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t len = strlen(src) + 1; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char* dup = static_cast<char*>(fastMalloc(len)); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) memcpy(dup, src, len); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dup; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void fastMallocShutdown() 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) gPartition.shutdown(); 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void* fastMalloc(size_t n) 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (UNLIKELY(!gInitialized)) { 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) spinLockLock(&gLock); 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!gInitialized) { 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) gInitialized = true; 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) gPartition.init(); 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) spinLockUnlock(&gLock); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return partitionAllocGeneric(gPartition.root(), n); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void fastFree(void* p) 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) partitionFreeGeneric(gPartition.root(), p); 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void* fastRealloc(void* p, size_t n) 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return partitionReallocGeneric(gPartition.root(), p, n); 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF 88