Skip to content

Commit 8772735

Browse files
committed
memory manager code refactor
1 parent c1b7224 commit 8772735

File tree

2 files changed

+55
-41
lines changed

2 files changed

+55
-41
lines changed

Source/Library/MemoryManager.cpp

+22-15
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,15 @@ namespace sd
7878

7979
void MemoryManager::clear()
8080
{
81-
_objectRegister.forEach([this](IObject &object) { _allocatedMemory -= object.getSize(); });
82-
_objectRegister.clear();
81+
_objectsRegister.forEach([this](IObjectHolder &objectHolder) { destroyObject(objectHolder); });
82+
_objectsRegister.clear();
83+
}
84+
85+
void MemoryManager::destroyObject(IObjectHolder &objectHolder)
86+
{
87+
auto objectSize = objectHolder.getObjectSize();
88+
objectHolder.destroyObject();
89+
_allocatedMemory -= objectSize;
8390
}
8491

8592
bool MemoryManager::isGBCollectionNeeded() { return getAllocatedMemory() > getMemoryLimit(); }
@@ -92,14 +99,14 @@ namespace sd
9299
{
93100
auto ptr = worklist.back();
94101
worklist.pop_back();
95-
auto &object = _objectRegister.getObject(ptr);
102+
auto &objectHolder = _objectsRegister.getObjectHolder(ptr);
96103

97-
if (object.isMarked())
104+
if (objectHolder.isMarked())
98105
{
99106
continue;
100107
}
101-
object.mark();
102-
for (const auto &p : getInnerObjects(object))
108+
objectHolder.mark();
109+
for (const auto &p : getInnerObjects(objectHolder))
103110
{
104111
worklist.push_back(p);
105112
}
@@ -108,15 +115,15 @@ namespace sd
108115

109116
void MemoryManager::sweep()
110117
{
111-
_objectRegister.unregisterIf([this](IObject &object) {
112-
if (object.isMarked())
118+
_objectsRegister.unregisterIf([this](IObjectHolder &objectHolder) {
119+
if (objectHolder.isMarked())
113120
{
114-
object.unmark();
121+
objectHolder.unmark();
115122
return false;
116123
}
117124
else
118125
{
119-
_allocatedMemory -= object.getSize();
126+
destroyObject(objectHolder);
120127
return true;
121128
}
122129
});
@@ -134,7 +141,7 @@ namespace sd
134141
while (rsp < top)
135142
{
136143
auto address = (void *)*reinterpret_cast<void **>(rsp);
137-
if (_objectRegister.isObjectRegistered(address))
144+
if (_objectsRegister.isObjectRegistered(address))
138145
{
139146
result.emplace_back(address);
140147
}
@@ -144,15 +151,15 @@ namespace sd
144151
return result;
145152
}
146153

147-
std::vector<void *> MemoryManager::getInnerObjects(const IObject &object)
154+
std::vector<void *> MemoryManager::getInnerObjects(const IObjectHolder &objectHolder)
148155
{
149-
auto p = (uint8_t *)object.getPtr();
150-
auto end = (p + object.getSize());
156+
auto p = (uint8_t *)objectHolder.getObjectPtr();
157+
auto end = (p + objectHolder.getObjectSize());
151158
std::vector<void *> result;
152159
while (p < end)
153160
{
154161
auto address = (void *)*reinterpret_cast<void **>(p);
155-
if (_objectRegister.isObjectRegistered(address))
162+
if (_objectsRegister.isObjectRegistered(address))
156163
{
157164
result.emplace_back(address);
158165
}

Source/Library/h/MemoryManager.hpp

+33-26
Original file line numberDiff line numberDiff line change
@@ -20,60 +20,66 @@ namespace sd
2020
{
2121
#pragma region HelperClasses
2222
private:
23-
struct IObject
23+
struct IObjectHolder
2424
{
25-
virtual void *getPtr() const = 0;
25+
virtual void *getObjectPtr() const = 0;
2626

27-
virtual size_t getSize() const = 0;
27+
virtual size_t getObjectSize() const = 0;
2828

2929
virtual bool isMarked() const = 0;
3030
virtual void mark() = 0;
3131
virtual void unmark() = 0;
3232

33+
virtual void destroyObject() = 0;
3334
virtual bool isValid() const = 0;
3435

35-
virtual ~IObject() {}
36+
virtual ~IObjectHolder() {}
3637
};
3738

38-
template <class T> class Object final : public IObject
39+
template <class T> class ObjectHolder final : public IObjectHolder
3940
{
4041
private:
4142
bool _marked = false;
42-
std::unique_ptr<T> _ptr;
43+
std::unique_ptr<T> _objectPtr;
4344

44-
Object(T *ptr) : _ptr(ptr) {}
45+
ObjectHolder(T *objectPtr) : _objectPtr(objectPtr) {}
4546

4647
public:
47-
Object(const Object &) = delete;
48-
Object &operator=(const Object &) = delete;
48+
ObjectHolder(const ObjectHolder &) = delete;
49+
ObjectHolder &operator=(const ObjectHolder &) = delete;
4950

50-
template <class... Args> static std::unique_ptr<Object<T>> create(Args &&...params)
51+
template <class... Args> static std::unique_ptr<ObjectHolder<T>> create(Args &&...params)
5152
{
52-
return std::unique_ptr<Object<T>>(new Object{new T{std::forward<Args>(params)...}});
53+
auto objectPtr = new T{std::forward<Args>(params)...};
54+
return std::unique_ptr<ObjectHolder<T>>(new ObjectHolder{objectPtr});
5355
};
5456

55-
T *getTypedPtr() const { return _ptr.get(); }
56-
void *getPtr() const final { return _ptr.get(); }
57+
T *getTypedObjectPtr() const { return _objectPtr.get(); }
58+
void *getObjectPtr() const final { return _objectPtr.get(); }
5759

58-
size_t getSize() const final { return sizeof(T); }
60+
size_t getObjectSize() const final { return sizeof(T); }
5961

6062
bool isMarked() const final { return _marked; }
6163
void mark() final { _marked = true; }
6264
void unmark() final { _marked = false; }
6365

64-
bool isValid() const final { return !!getPtr(); }
66+
void destroyObject() { _objectPtr.reset(); }
67+
bool isValid() const final { return !!getObjectPtr(); }
6568
operator bool() const { return isValid(); }
6669
};
6770

6871
class ObjectsRegister
6972
{
7073
private:
71-
std::unordered_map<void *, std::unique_ptr<IObject>> _objectsMap;
74+
std::unordered_map<void *, std::unique_ptr<IObjectHolder>> _objectsMap;
7275

7376
public:
74-
void registerObject(std::unique_ptr<IObject> ob) { _objectsMap.insert({ob->getPtr(), std::move(ob)}); }
77+
void registerObject(std::unique_ptr<IObjectHolder> objectHolder)
78+
{
79+
_objectsMap.insert({objectHolder->getObjectPtr(), std::move(objectHolder)});
80+
}
7581
bool isObjectRegistered(void *objectPtr) const { return _objectsMap.contains(objectPtr); }
76-
IObject &getObject(void *objectPtr) { return *_objectsMap.at(objectPtr); }
82+
IObjectHolder &getObjectHolder(void *objectPtr) { return *_objectsMap.at(objectPtr); }
7783

7884
void clear() { _objectsMap.clear(); }
7985

@@ -91,7 +97,7 @@ namespace sd
9197
};
9298
#pragma endregion
9399
private:
94-
ObjectsRegister _objectRegister;
100+
ObjectsRegister _objectsRegister;
95101

96102
size_t _allocatedMemory = 0;
97103
size_t _memoryLimit = 1 * 1024 * 1024; // ~1MB
@@ -112,12 +118,12 @@ namespace sd
112118
* Get Pointner to newly created menagable object,
113119
* if object wont be recheable in stack scope it will be collected
114120
*/
115-
template <class T, class... Args> T *create(Args &&...params)
121+
template <class T, class... Args> T *createObject(Args &&...params)
116122
{
117-
std::unique_ptr<Object<T>> object = Object<T>::create(std::forward<Args>(params)...);
118-
T *ptr = object->getTypedPtr();
119-
_allocatedMemory += object->getSize();
120-
_objectRegister.registerObject(std::move(object));
123+
std::unique_ptr<ObjectHolder<T>> objectHolderPtr = ObjectHolder<T>::create(std::forward<Args>(params)...);
124+
T *ptr = objectHolderPtr->getTypedObjectPtr();
125+
_allocatedMemory += objectHolderPtr->getObjectSize();
126+
_objectsRegister.registerObject(std::move(objectHolderPtr));
121127
if (isGBCollectionNeeded())
122128
{
123129
garbageCollect();
@@ -140,14 +146,15 @@ namespace sd
140146
size_t getAllocatedMemory() const override;
141147

142148
private:
149+
void destroyObject(IObjectHolder &objectHolder);
143150
void clear();
144151

145152
bool isGBCollectionNeeded();
146153
void mark();
147154
void sweep();
148155

149156
std::vector<void *> getRoots();
150-
std::vector<void *> getInnerObjects(const IObject &object);
157+
std::vector<void *> getInnerObjects(const IObjectHolder &objectHolder);
151158

152159
size_t getMemoryLimit() const;
153160
void bumpMemoryLimit();
@@ -158,6 +165,6 @@ namespace sd
158165
*/
159166
template <class T, class... Args> T *make(Args &&...params)
160167
{
161-
return MemoryManager::instance().create<T>(std::forward<Args>(params)...);
168+
return MemoryManager::instance().createObject<T>(std::forward<Args>(params)...);
162169
}
163170
} // namespace sd

0 commit comments

Comments
 (0)