sead
Loading...
Searching...
No Matches
seadHeap.h
Go to the documentation of this file.
1#ifndef SEAD_HEAP_H_
2#define SEAD_HEAP_H_
3
4#include <stddef.h>
5
6#include <container/seadOffsetList.h>
7#include <heap/seadDisposer.h>
8#include <prim/seadBitFlag.h>
9#include <prim/seadNamable.h>
10#include <prim/seadRuntimeTypeInfo.h>
11#include <prim/seadSafeString.h>
12#include <thread/seadCriticalSection.h>
13
14namespace sead { namespace hostio {
15
16class Context;
17
18} // namespace sead::hostio
19
20class Thread;
21
22class Heap : public IDisposer, public INamable
23{
24public:
30
31private:
34
35 class Flag
36 {
37 public:
39 {
42 //cDisposing,
43 //cEnableWarning,
44 //cEnableDebugFillSystem,
45 //cEnableDebugFillUser,
46 //cDontUseThis_MaxNumPlus1,
48 //cEnumStart = cDontUseThis_StartNumMinus1 + 1,
49 //cEnumMax = cDontUseThis_MaxNumPlus1 - 1
50 };
51 };
52
53public:
54 Heap(const SafeString& name, Heap* parent, void* start, size_t size, HeapDirection direction, bool enable_lock);
55 ~Heap() override { }
56
58
59 virtual void destroy() = 0;
60 virtual size_t adjust() = 0;
61
62 void* alloc(size_t size, s32 alignment)
63 {
64 void* ptr = tryAlloc(size, alignment);
65 SEAD_ASSERT_MSG(ptr != nullptr, "alloc failed. size: %d, heap: %s", size, getName().cstr());
66 return ptr;
67 }
68
69 virtual void* tryAlloc(size_t size, s32 alignment) = 0;
70 virtual void free(void* ptr) = 0;
71 virtual void* resizeFront(void* ptr, size_t new_size) = 0;
72 virtual void* resizeBack(void* ptr, size_t new_size) = 0;
73 virtual void freeAll() = 0;
74 virtual const void* getStartAddress() const = 0;
75 virtual const void* getEndAddress() const = 0;
76 virtual size_t getSize() const = 0;
77 virtual size_t getFreeSize() const = 0;
78 virtual size_t getMaxAllocatableSize(s32 alignment = 4) const = 0;
79 Heap* getParent() const { return mParent; }
80 virtual bool isInclude(const void* ptr) const = 0;
82 virtual bool isFreeable() const = 0;
83 virtual bool isResizable() const = 0;
84 virtual bool isAdjustable() const = 0;
85
86 void setEnableLock(bool enable_lock)
87 {
88 mFlag.changeBit(Flag::cEnableLock, enable_lock);
89 }
90
91 bool isEnableLock() const
92 {
93 return mFlag.isOnBit(Flag::cEnableLock);
94 }
95
96 bool lock();
97 bool unlock();
98 void setEnableWarning(bool);
99 bool isEnableWarning() const;
102
103 virtual void dump() const
104 {
105 }
106
107protected:
108 virtual void genInformation_(hostio::Context* context);
109
110 Heap* findContainHeap_(const void* ptr);
111 bool hasNoChild_() const;
112 //static void setEnableDebugFillSystem_(Heap*, bool);
113 //static bool isEnableDebugFillSystem_(const Heap*);
114 //bool isEnableDebugFillAlloc_() const;
115 //bool isEnableDebugFillFree_() const;
116 //bool isEnableDebugFillHeapDestroy_() const;
117 void destruct_();
118 void dispose_(const void*, const void*);
119 void appendDisposer_(IDisposer* o);
120 void removeDisposer_(IDisposer* o);
122 void checkAccessThread_() const;
123
124public:
126 {
127 return mChildren.constBegin();
128 }
129
131 {
132 return mChildren.constEnd();
133 }
134
136 {
137 return static_cast<u32>(mChildren.size());
138 }
139
141 {
142 return mDisposerList.constBegin();
143 }
144
146 {
147 return mDisposerList.constEnd();
148 }
149
151 {
152 return static_cast<u32>(mDisposerList.size());
153 }
154
156
157protected:
158 void* mStart;
167
170 friend class HeapMgr;
171};
172#ifdef cafe
173static_assert(sizeof(Heap) == 0x90, "sead::Heap size mismatch");
174#endif // cafe
175
176} // namespace sead
177
178#endif // SEAD_HEAP_H_
Definition seadCriticalSection.h:13
Definition seadHeapMgr.h:21
Definition seadHeap.h:36
ValueType
Definition seadHeap.h:39
@ cDontUseThis_StartNumMinus1
Definition seadHeap.h:40
@ cEnableLock
Definition seadHeap.h:41
@ cDontUseThis_MemSize32bit
Definition seadHeap.h:47
Definition seadHeap.h:23
~Heap() override
Definition seadHeap.h:55
BitFlag32 mFlag
Definition seadHeap.h:166
virtual bool isAdjustable() const =0
u32 childSize() const
Definition seadHeap.h:135
friend IDisposer::~IDisposer()
bool hasNoChild_() const
void * alloc(size_t size, s32 alignment)
Definition seadHeap.h:62
OffsetList< Heap >::constIterator childBegin() const
Definition seadHeap.h:125
void dispose_(const void *, const void *)
OffsetList< IDisposer >::constIterator disposerBegin() const
Definition seadHeap.h:140
Heap * getParent() const
Definition seadHeap.h:79
void eraseChild_(Heap *)
DisposerList mDisposerList
Definition seadHeap.h:163
virtual size_t getMaxAllocatableSize(s32 alignment=4) const =0
virtual bool isResizable() const =0
virtual bool isFreeable() const =0
OffsetList< Heap >::constIterator childEnd() const
Definition seadHeap.h:130
Thread * getAccessThread() const
HeapDirection
Definition seadHeap.h:26
@ cHeapDirection_Reverse
Definition seadHeap.h:28
@ cHeapDirection_Forward
Definition seadHeap.h:27
HeapDirection getDirection() const
Definition seadHeap.h:81
bool unlock()
virtual void * resizeBack(void *ptr, size_t new_size)=0
Heap * findContainHeap_(const void *ptr)
Definition seadHeap.cpp:20
virtual size_t getSize() const =0
HeapDirection mDirection
Definition seadHeap.h:164
void setEnableLock(bool enable_lock)
Definition seadHeap.h:86
ListNode mListNode
Definition seadHeap.h:162
void setEnableWarning(bool)
bool isEnableLock() const
Definition seadHeap.h:91
void appendDisposer_(IDisposer *o)
Definition seadHeap.cpp:7
Heap * mParent
Definition seadHeap.h:160
void destruct_()
virtual void destroy()=0
OffsetList< Heap > HeapList
Definition seadHeap.h:32
HeapList mChildren
Definition seadHeap.h:161
virtual const void * getStartAddress() const =0
virtual void free(void *ptr)=0
void removeDisposer_(IDisposer *o)
Definition seadHeap.cpp:13
virtual void dump() const
Definition seadHeap.h:103
void setAccessThread(Thread *)
virtual void freeAll()=0
u32 disposerSize() const
Definition seadHeap.h:150
bool lock()
void pushBackChild_(Heap *)
size_t mSize
Definition seadHeap.h:159
virtual const void * getEndAddress() const =0
OffsetList< IDisposer > DisposerList
Definition seadHeap.h:33
CriticalSection mCS
Definition seadHeap.h:165
void checkAccessThread_() const
virtual void genInformation_(hostio::Context *context)
virtual size_t getFreeSize() const =0
void * mStart
Definition seadHeap.h:158
friend IDisposer::IDisposer()
virtual bool isInclude(const void *ptr) const =0
OffsetList< IDisposer >::constIterator disposerEnd() const
Definition seadHeap.h:145
bool isEnableWarning() const
virtual void * tryAlloc(size_t size, s32 alignment)=0
virtual void * resizeFront(void *ptr, size_t new_size)=0
Heap(const SafeString &name, Heap *parent, void *start, size_t size, HeapDirection direction, bool enable_lock)
virtual size_t adjust()=0
Definition seadDisposer.h:12
Definition seadNamable.h:9
const SafeString & getName() const
Definition seadNamable.h:26
Definition seadListImpl.h:11
Definition seadOffsetList.h:11
Definition seadThread.h:28
Definition seadHostIODummy.h:29
Definition seadHeap.h:14
Definition seadAssert.h:44
BitFlag< u32 > BitFlag32
Definition seadBitFlag.h:125
SafeStringBase< char > SafeString
Definition seadSafeString.h:409
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33
#define SEAD_RTTI_BASE(CLASS)
Definition seadRuntimeTypeInfo.h:75