1// Copyright (c) 2005, 2007, Google Inc.
2// All rights reserved.
3// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9//     * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11//     * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15//     * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#include "config.h"
32#include "wtf/FastMalloc.h"
33
34#include "wtf/PartitionAlloc.h"
35#include "wtf/SpinLock.h"
36#include <string.h>
37
38namespace WTF {
39
40static PartitionAllocatorGeneric gPartition;
41static int gLock = 0;
42static bool gInitialized = false;
43
44void* fastZeroedMalloc(size_t n)
45{
46    void* result = fastMalloc(n);
47    memset(result, 0, n);
48    return result;
49}
50
51char* fastStrDup(const char* src)
52{
53    size_t len = strlen(src) + 1;
54    char* dup = static_cast<char*>(fastMalloc(len));
55    memcpy(dup, src, len);
56    return dup;
57}
58
59void fastMallocShutdown()
60{
61    gPartition.shutdown();
62}
63
64void* fastMalloc(size_t n)
65{
66    if (UNLIKELY(!gInitialized)) {
67        spinLockLock(&gLock);
68        if (!gInitialized) {
69            gInitialized = true;
70            gPartition.init();
71        }
72        spinLockUnlock(&gLock);
73    }
74    return partitionAllocGeneric(gPartition.root(), n);
75}
76
77void fastFree(void* p)
78{
79    partitionFreeGeneric(gPartition.root(), p);
80}
81
82void* fastRealloc(void* p, size_t n)
83{
84    return partitionReallocGeneric(gPartition.root(), p, n);
85}
86
87} // namespace WTF
88