bmalloc
[WebKit-https.git] / Source / bmalloc / bmalloc / Chunk.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 Chunk_h
27 #define Chunk_h
28
29 #include "ObjectType.h"
30 #include "Sizes.h"
31 #include "VMAllocate.h"
32
33 namespace bmalloc {
34
35 template<class Traits>
36 class Chunk {
37 public:
38     typedef typename Traits::Page Page;
39     typedef typename Traits::Line Line;
40     static const size_t lineSize = Traits::lineSize;
41     static const size_t chunkSize = Traits::chunkSize;
42     static const size_t chunkOffset = Traits::chunkOffset;
43     static const uintptr_t chunkMask = Traits::chunkMask;
44
45     static Chunk* create();
46     static Chunk* get(void*);
47
48     Page* begin() { return Page::get(Line::get(m_memory)); }
49     Page* end() { return &m_pages[pageCount]; }
50     
51     Line* lines() { return m_lines; }
52     Page* pages() { return m_pages; }
53
54 private:
55     static_assert(!(vmPageSize % lineSize), "vmPageSize must be an even multiple of line size");
56     static_assert(!(chunkSize % lineSize), "chunk size must be an even multiple of line size");
57
58     static const size_t lineCount = chunkSize / lineSize;
59     static const size_t pageCount = chunkSize / vmPageSize;
60
61     Line m_lines[lineCount];
62     Page m_pages[pageCount];
63
64     // Align to vmPageSize to avoid sharing physical pages with metadata.
65     // Otherwise, we'll confuse the scavenger into scavenging metadata.
66      alignas(vmPageSize) char m_memory[];
67 };
68
69 template<class Traits>
70 inline auto Chunk<Traits>::create() -> Chunk*
71 {
72     size_t vmSize = bmalloc::vmSize(chunkSize);
73     std::pair<void*, Range> result = vmAllocate(vmSize, superChunkSize, chunkOffset);
74     return new (result.first) Chunk;
75 }
76
77 template<class Traits>
78 inline auto Chunk<Traits>::get(void* object) -> Chunk*
79 {
80     ASSERT(isSmallOrMedium(object));
81     return static_cast<Chunk*>(mask(object, chunkMask));
82 }
83
84 }; // namespace bmalloc
85
86 #endif // Chunk