Skip to content

Commit 3b3868a

Browse files
committed
Memory manager refactor
1 parent b58d8ec commit 3b3868a

File tree

3 files changed

+54
-22
lines changed

3 files changed

+54
-22
lines changed

Source/Library/MemoryManager.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <setjmp.h>
22

3-
#include "MemoryManager.hpp"
43
#include "DetectOs.hpp"
4+
#include "MemoryManager.hpp"
55

66
#ifdef WINDOWS
77

@@ -13,12 +13,12 @@
1313

1414
#ifdef LINUX
1515
#include <iostream>
16+
#include <pthread.h>
1617
#include <stdio.h>
1718
#include <stdlib.h>
1819
#include <string.h>
1920
#include <termios.h>
2021
#include <unistd.h>
21-
#include <pthread.h>
2222

2323
#endif
2424

@@ -30,34 +30,37 @@ namespace sd
3030
#define __READ_RBP(rbp) __asm__ volatile("movq %%rbp, %0" : "=r"(rbp))
3131
#define __READ_RSP(rsp) __asm__ volatile("movq %%rsp, %0" : "=r"(rsp))
3232

33+
auto getStackRsp()
34+
{
35+
intptr_t *rsp;
36+
__READ_RSP(rsp);
37+
return rsp;
38+
}
39+
40+
auto makeStackInfo(uint8_t *top, uint8_t *bot) { return std::make_tuple(top, bot, (uint8_t *)getStackRsp()); }
3341
#ifdef WINDOWS
3442

3543
auto getStackBounds()
3644
{
37-
intptr_t *rsp;
38-
__READ_RSP(rsp);
39-
ULONG_PTR lowLimit;
40-
ULONG_PTR highLimit;
45+
ULONG_PTR lowLimit, highLimit;
4146
GetCurrentThreadStackLimits(&lowLimit, &highLimit);
4247

43-
return std::make_tuple((uint8_t *)highLimit - 10, (uint8_t *)lowLimit, (uint8_t *)rsp);
48+
return makeStackInfo((uint8_t *)highLimit - 10, (uint8_t *)lowLimit);
4449
}
4550

46-
#endif
47-
#ifdef LINUX
51+
#elif LINUX
4852

4953
auto getStackBounds()
5054
{
51-
intptr_t *rsp;
52-
__READ_RSP(rsp);
5355
pthread_attr_t attrs;
5456
pthread_getattr_np(pthread_self(), &attrs);
55-
void* stack_ptr;
57+
void *stack_ptr;
5658
size_t stack_size;
5759
pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
58-
return std::make_tuple((uint8_t *)stack_ptr + stack_size - 10, (uint8_t *)rsp, (uint8_t *)rsp);
59-
}
60+
void *lowLimit = stack_ptr, highLimit = stack_ptr + stack_size - 10;
6061

62+
return makeStackInfo((uint8_t *)highLimit, (uint8_t *)lowLimit);
63+
}
6164
#endif
6265

6366
} // namespace
@@ -87,7 +90,7 @@ namespace sd
8790

8891
void MemoryManager::clear()
8992
{
90-
_register.forEach([this](auto &object) { destroy(object); });
93+
_register.forEach([this](Object &object) { destroy(object); });
9194
_register.clear();
9295
}
9396

@@ -124,7 +127,7 @@ namespace sd
124127

125128
void MemoryManager::sweep()
126129
{
127-
_register.unregisterIf([this](auto &object) {
130+
_register.unregisterIf([this](Object &object) {
128131
if (object.isMarked())
129132
{
130133
object.unmark();

Source/Library/h/DetectOs.hpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,39 @@
11
#pragma once
22

3-
#ifdef _WIN32
4-
3+
#if defined(_WIN64) || defined(_WIN32)
54
#define WINDOWS
5+
6+
#ifdef _WIN64
7+
// define something for Windows (64-bit only)
8+
#else
9+
// define something for Windows (32-bit only)
610
#endif
711

8-
#ifdef linux
12+
#elif __APPLE__
13+
#include "TargetConditionals.h"
14+
#define APPLE
15+
16+
#if TARGET_OS_IPHONE && TARGET_OS_SIMULATOR
17+
// define something for simulator
18+
// (although, checking for TARGET_OS_IPHONE should not be required).
19+
#elif TARGET_OS_IPHONE && TARGET_OS_MACCATALYST
20+
// define something for Mac's Catalyst
21+
#elif TARGET_OS_IPHONE
22+
// define something for iphone
23+
#else
24+
#define TARGET_OS_OSX 1
25+
// define something for OSX
26+
#endif
927

28+
#elif defined(__linux) || defined(__unix) || defined(__posix)
1029
#define LINUX
30+
31+
#ifdef __linux
32+
// linux
33+
#elif __unix // all unices not caught above
34+
// Unix
35+
#elif __posix
36+
// POSIX
37+
#endif
38+
1139
#endif

Source/Library/h/MemoryManager.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ namespace sd
3535

3636
size_t getSize() const { return _size; }
3737
Deleter getDeleter() const { return _deleter; }
38-
39-
private:
4038
};
4139

4240
template <class T> struct Type
4341
{
4442
template <class... A> static T *create(A &&...args) { return new T(std::forward<A>(args)...); };
43+
4544
static void destroy(void *objectPtr) { delete reinterpret_cast<T *>(objectPtr); }
45+
4646
static TypeInfo *getInfo()
4747
{
4848
static TypeInfo *info = new TypeInfo{sizeof(T), &destroy};
@@ -103,9 +103,10 @@ namespace sd
103103
public:
104104
void registerNew(const Object &object) { _objectsMap.insert({object.getRawPtr(), object}); }
105105
bool contains(void *objectPtr) const { return _objectsMap.contains(objectPtr); }
106-
void clear() { _objectsMap.clear(); }
107106
Object &getObject(void *objectPtr) { return _objectsMap.at(objectPtr); }
108107

108+
void clear() { _objectsMap.clear(); }
109+
109110
size_t numberOfRegisteredObjects() const { return _objectsMap.size(); }
110111
bool anyObjectRegistered() const { return _objectsMap.empty(); }
111112

0 commit comments

Comments
 (0)