bmalloc
[WebKit-https.git] / Source / bmalloc / bmalloc / MediumAllocator.h
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef MediumAllocator_h
27 #define MediumAllocator_h
28
29 #include "BAssert.h"
30 #include "MediumChunk.h"
31 #include "MediumLine.h"
32
33 namespace bmalloc {
34
35 // Helper object for allocating medium objects.
36
37 class MediumAllocator {
38 public:
39     MediumAllocator();
40
41     bool isNull() { return !m_end; }
42     MediumLine* line();
43
44     void* allocate(size_t);
45     bool allocate(size_t, void*&);
46
47     unsigned char derefCount();
48     void refill(MediumLine*);
49
50 private:
51     char* m_end;
52     size_t m_remaining;
53     size_t m_objectCount;
54 };
55
56 inline MediumAllocator::MediumAllocator()
57     : m_end()
58     , m_remaining()
59     , m_objectCount()
60 {
61 }
62
63 inline MediumLine* MediumAllocator::line()
64 {
65     return MediumLine::get(m_end - 1);
66 }
67
68 inline void* MediumAllocator::allocate(size_t size)
69 {
70     ASSERT(size <= m_remaining);
71     ASSERT(size == roundUpToMultipleOf<alignment>(size));
72     ASSERT(size >= MediumLine::minimumObjectSize);
73
74     m_remaining -= size;
75     void* object = m_end - m_remaining - size;
76     ASSERT(isSmallOrMedium(object) && !isSmall(object));
77
78     ++m_objectCount;
79     return object;
80 }
81
82 inline bool MediumAllocator::allocate(size_t size, void*& object)
83 {
84     if (size > m_remaining)
85         return false;
86
87     object = allocate(size);
88     return true;
89 }
90
91 inline unsigned char MediumAllocator::derefCount()
92 {
93     return MediumLine::maxRefCount - m_objectCount;
94 }
95
96 inline void MediumAllocator::refill(MediumLine* line)
97 {
98     line->concurrentRef(MediumLine::maxRefCount);
99     m_end = line->end();
100     m_remaining = mediumLineSize;
101     m_objectCount = 0;
102 }
103
104 } // namespace bmalloc
105
106 #endif // MediumAllocator_h