1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_MEM_ALLOCATOR_H
17 #define ECMASCRIPT_MEM_ALLOCATOR_H
18 
19 #include <memory>
20 
21 #include "ecmascript/mem/free_object_list.h"
22 #include "ecmascript/mem/mem.h"
23 
24 namespace panda::ecmascript {
25 class Region;
26 class BaseHeap;
27 class JitFort;
28 
29 class Allocator {
30 public:
31     Allocator() = default;
32     virtual ~Allocator() = default;
33     NO_COPY_SEMANTIC(Allocator);
34     NO_MOVE_SEMANTIC(Allocator);
35 };
36 
37 class BumpPointerAllocator : public Allocator {
38 public:
39     BumpPointerAllocator() = default;
40     ~BumpPointerAllocator() override = default;
41     NO_COPY_SEMANTIC(BumpPointerAllocator);
42     NO_MOVE_SEMANTIC(BumpPointerAllocator);
43 
44     inline BumpPointerAllocator(uintptr_t begin, uintptr_t end);
45 
46     inline void Reset();
47     inline void Reset(uintptr_t begin, uintptr_t end);
48     inline void Reset(uintptr_t begin, uintptr_t end, uintptr_t top);
49     inline void ResetTopPointer(uintptr_t top);
50     inline uintptr_t Allocate(size_t size);
51 
GetTop() const52     uintptr_t GetTop() const
53     {
54         return top_;
55     }
56 
GetEnd() const57     uintptr_t GetEnd() const
58     {
59         return end_;
60     }
61 
GetTopAddress()62     const uintptr_t *GetTopAddress()
63     {
64         return &top_;
65     }
66 
GetEndAddress()67     const uintptr_t *GetEndAddress()
68     {
69         return &end_;
70     }
71 
Available() const72     size_t Available() const
73     {
74         return (end_ - top_);
75     }
76 
77 private:
78     uintptr_t begin_ {0};
79     uintptr_t top_ {0};
80     uintptr_t end_ {0};
81 };
82 
83 template <typename T>
84 class FreeListAllocator : public Allocator {
85 public:
86     FreeListAllocator() = delete;
87     ~FreeListAllocator() override = default;
88 
89     NO_COPY_SEMANTIC(FreeListAllocator);
90     NO_MOVE_SEMANTIC(FreeListAllocator);
91 
92     inline explicit FreeListAllocator(BaseHeap *heap);
93     inline explicit FreeListAllocator(BaseHeap *heap, MemDescPool *pool, JitFort *fort);
94     inline void Initialize(Region *region);
95 
96     inline void Reset(BaseHeap *heap);
97 
98     inline uintptr_t Allocate(size_t size);
99     inline void AddFree(Region *region);
100     inline uintptr_t LookupSuitableFreeObject(size_t size);
101 
102     inline void RebuildFreeList();
103 
104     inline bool MatchFreeObjectSet(Region *region, size_t size);
105     inline void CollectFreeObjectSet(Region *region);
106     inline void DetachFreeObjectSet(Region *region);
107 
108     inline void FreeBumpPoint();
109     // Only fill free object
110     inline void FillBumpPointer();
111 
112     inline void ResetBumpPointer(uintptr_t begin, uintptr_t end, uintptr_t top);
113     inline void ResetTopPointer(uintptr_t top);
114 
115     inline void Free(uintptr_t begin, size_t size, bool isAdd = true);
116 
117     inline size_t GetAvailableSize() const;
118     inline size_t GetWastedSize() const;
119 
GetTop() const120     uintptr_t GetTop() const
121     {
122         return bpAllocator_.GetTop();
123     }
124 
GetAllocatedSize() const125     size_t GetAllocatedSize() const
126     {
127         return allocationSizeAccumulator_;
128     }
129 
IncreaseAllocatedSize(size_t allocatedSize)130     void IncreaseAllocatedSize(size_t allocatedSize)
131     {
132         allocationSizeAccumulator_ += allocatedSize;
133     }
134 
135 private:
136     inline uintptr_t Allocate(T *object, size_t size);
137     std::unique_ptr<FreeObjectList<T>> freeList_ {nullptr};
138     MemDescPool *memDescPool_ {nullptr};
139     BumpPointerAllocator bpAllocator_;
140     BaseHeap *heap_{nullptr};
141     size_t allocationSizeAccumulator_ {0};
142 };
143 }  // namespace panda::ecmascript
144 
145 #endif  // ECMASCRIPT_MEM_ALLOCATOR_H
146