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