1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include "arena_bit_vector.h"
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include "allocator.h"
20*795d594fSAndroid Build Coastguard Worker #include "arena_allocator.h"
21*795d594fSAndroid Build Coastguard Worker #include "bit_vector-inl.h"
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Worker namespace art {
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard Worker template <bool kCount>
26*795d594fSAndroid Build Coastguard Worker class ArenaBitVectorAllocatorKindImpl;
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker template <>
29*795d594fSAndroid Build Coastguard Worker class ArenaBitVectorAllocatorKindImpl<false> {
30*795d594fSAndroid Build Coastguard Worker public:
31*795d594fSAndroid Build Coastguard Worker // Not tracking allocations, ignore the supplied kind and arbitrarily provide kArenaAllocSTL.
ArenaBitVectorAllocatorKindImpl(ArenaAllocKind kind)32*795d594fSAndroid Build Coastguard Worker explicit ArenaBitVectorAllocatorKindImpl([[maybe_unused]] ArenaAllocKind kind) {}
33*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocatorKindImpl(const ArenaBitVectorAllocatorKindImpl&) = default;
34*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocatorKindImpl& operator=(const ArenaBitVectorAllocatorKindImpl&) = default;
Kind()35*795d594fSAndroid Build Coastguard Worker ArenaAllocKind Kind() { return kArenaAllocGrowableBitMap; }
36*795d594fSAndroid Build Coastguard Worker };
37*795d594fSAndroid Build Coastguard Worker
38*795d594fSAndroid Build Coastguard Worker template <bool kCount>
39*795d594fSAndroid Build Coastguard Worker class ArenaBitVectorAllocatorKindImpl {
40*795d594fSAndroid Build Coastguard Worker public:
ArenaBitVectorAllocatorKindImpl(ArenaAllocKind kind)41*795d594fSAndroid Build Coastguard Worker explicit ArenaBitVectorAllocatorKindImpl(ArenaAllocKind kind) : kind_(kind) { }
42*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocatorKindImpl(const ArenaBitVectorAllocatorKindImpl&) = default;
43*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocatorKindImpl& operator=(const ArenaBitVectorAllocatorKindImpl&) = default;
Kind()44*795d594fSAndroid Build Coastguard Worker ArenaAllocKind Kind() { return kind_; }
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker private:
47*795d594fSAndroid Build Coastguard Worker ArenaAllocKind kind_;
48*795d594fSAndroid Build Coastguard Worker };
49*795d594fSAndroid Build Coastguard Worker
50*795d594fSAndroid Build Coastguard Worker using ArenaBitVectorAllocatorKind =
51*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocatorKindImpl<kArenaAllocatorCountAllocations>;
52*795d594fSAndroid Build Coastguard Worker
53*795d594fSAndroid Build Coastguard Worker template <typename ArenaAlloc>
54*795d594fSAndroid Build Coastguard Worker class ArenaBitVectorAllocator final : public Allocator, private ArenaBitVectorAllocatorKind {
55*795d594fSAndroid Build Coastguard Worker public:
Create(ArenaAlloc * allocator,ArenaAllocKind kind)56*795d594fSAndroid Build Coastguard Worker static ArenaBitVectorAllocator* Create(ArenaAlloc* allocator, ArenaAllocKind kind) {
57*795d594fSAndroid Build Coastguard Worker void* storage = allocator->template Alloc<ArenaBitVectorAllocator>(kind);
58*795d594fSAndroid Build Coastguard Worker return new (storage) ArenaBitVectorAllocator(allocator, kind);
59*795d594fSAndroid Build Coastguard Worker }
60*795d594fSAndroid Build Coastguard Worker
~ArenaBitVectorAllocator()61*795d594fSAndroid Build Coastguard Worker ~ArenaBitVectorAllocator() {
62*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "UNREACHABLE";
63*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
64*795d594fSAndroid Build Coastguard Worker }
65*795d594fSAndroid Build Coastguard Worker
Alloc(size_t size)66*795d594fSAndroid Build Coastguard Worker void* Alloc(size_t size) override {
67*795d594fSAndroid Build Coastguard Worker return allocator_->Alloc(size, this->Kind());
68*795d594fSAndroid Build Coastguard Worker }
69*795d594fSAndroid Build Coastguard Worker
Free(void *)70*795d594fSAndroid Build Coastguard Worker void Free(void*) override {} // Nop.
71*795d594fSAndroid Build Coastguard Worker
72*795d594fSAndroid Build Coastguard Worker private:
ArenaBitVectorAllocator(ArenaAlloc * allocator,ArenaAllocKind kind)73*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocator(ArenaAlloc* allocator, ArenaAllocKind kind)
74*795d594fSAndroid Build Coastguard Worker : ArenaBitVectorAllocatorKind(kind), allocator_(allocator) { }
75*795d594fSAndroid Build Coastguard Worker
76*795d594fSAndroid Build Coastguard Worker ArenaAlloc* const allocator_;
77*795d594fSAndroid Build Coastguard Worker
78*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ArenaBitVectorAllocator);
79*795d594fSAndroid Build Coastguard Worker };
80*795d594fSAndroid Build Coastguard Worker
ArenaBitVector(ArenaAllocator * allocator,unsigned int start_bits,bool expandable,ArenaAllocKind kind)81*795d594fSAndroid Build Coastguard Worker ArenaBitVector::ArenaBitVector(ArenaAllocator* allocator,
82*795d594fSAndroid Build Coastguard Worker unsigned int start_bits,
83*795d594fSAndroid Build Coastguard Worker bool expandable,
84*795d594fSAndroid Build Coastguard Worker ArenaAllocKind kind)
85*795d594fSAndroid Build Coastguard Worker : BitVector(start_bits,
86*795d594fSAndroid Build Coastguard Worker expandable,
87*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocator<ArenaAllocator>::Create(allocator, kind)) {
88*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(GetHighestBitSet(), -1) << "The arena bit vector should start empty";
89*795d594fSAndroid Build Coastguard Worker }
90*795d594fSAndroid Build Coastguard Worker
ArenaBitVector(ScopedArenaAllocator * allocator,unsigned int start_bits,bool expandable,ArenaAllocKind kind)91*795d594fSAndroid Build Coastguard Worker ArenaBitVector::ArenaBitVector(ScopedArenaAllocator* allocator,
92*795d594fSAndroid Build Coastguard Worker unsigned int start_bits,
93*795d594fSAndroid Build Coastguard Worker bool expandable,
94*795d594fSAndroid Build Coastguard Worker ArenaAllocKind kind)
95*795d594fSAndroid Build Coastguard Worker : BitVector(start_bits,
96*795d594fSAndroid Build Coastguard Worker expandable,
97*795d594fSAndroid Build Coastguard Worker ArenaBitVectorAllocator<ScopedArenaAllocator>::Create(allocator, kind)) {
98*795d594fSAndroid Build Coastguard Worker ClearAllBits();
99*795d594fSAndroid Build Coastguard Worker }
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Worker } // namespace art
102