summaryrefslogtreecommitdiff
path: root/src/libc64/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libc64/malloc.c')
-rw-r--r--src/libc64/malloc.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/libc64/malloc.c b/src/libc64/malloc.c
new file mode 100644
index 000000000..de6a56b30
--- /dev/null
+++ b/src/libc64/malloc.c
@@ -0,0 +1,172 @@
+#include "global.h"
+#include "osMalloc.h"
+
+#define LOG_SEVERITY_NOLOG 0
+#define LOG_SEVERITY_ERROR 2
+#define LOG_SEVERITY_VERBOSE 3
+
+Arena gSystemArena;
+
+#if OOT_DEBUG
+s32 gSystemArenaLogSeverity = LOG_SEVERITY_NOLOG;
+
+void SystemArena_CheckPointer(void* ptr, u32 size, const char* name, const char* action) {
+ if (ptr == NULL) {
+ if (gSystemArenaLogSeverity >= LOG_SEVERITY_ERROR) {
+ PRINTF(T("%s: %u バイトの%sに失敗しました\n", "%s: %u bytes %s failed\n"), name, size, action);
+ __osDisplayArena(&gSystemArena);
+ return;
+ }
+ } else if (gSystemArenaLogSeverity >= LOG_SEVERITY_VERBOSE) {
+ PRINTF(T("%s: %u バイトの%sに成功しました\n", "%s: %u bytes %s succeeded\n"), name, size, action);
+ }
+}
+
+#define SYSTEM_ARENA_CHECK_POINTER(ptr, size, name, action) SystemArena_CheckPointer(ptr, size, name, action)
+#else
+#define SYSTEM_ARENA_CHECK_POINTER(ptr, size, name, action) (void)0
+#endif
+
+void* SystemArena_Malloc(u32 size) {
+ DECLARE_INTERRUPT_MASK
+ void* ptr;
+
+ DISABLE_INTERRUPTS();
+ ptr = __osMalloc(&gSystemArena, size);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, size, "malloc", "確保"); // "Secure"
+ return ptr;
+}
+
+#if OOT_DEBUG
+void* SystemArena_MallocDebug(u32 size, const char* file, int line) {
+ DECLARE_INTERRUPT_MASK
+ void* ptr;
+
+ DISABLE_INTERRUPTS();
+ ptr = __osMallocDebug(&gSystemArena, size, file, line);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, size, "malloc_DEBUG", "確保"); // "Secure"
+ return ptr;
+}
+#endif
+
+void* SystemArena_MallocR(u32 size) {
+ DECLARE_INTERRUPT_MASK
+ void* ptr;
+
+ DISABLE_INTERRUPTS();
+ ptr = __osMallocR(&gSystemArena, size);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, size, "malloc_r", "確保"); // "Secure"
+ return ptr;
+}
+
+#if OOT_DEBUG
+void* SystemArena_MallocRDebug(u32 size, const char* file, int line) {
+ DECLARE_INTERRUPT_MASK
+ void* ptr;
+
+ DISABLE_INTERRUPTS();
+ ptr = __osMallocRDebug(&gSystemArena, size, file, line);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, size, "malloc_r_DEBUG", "確保"); // "Secure"
+ return ptr;
+}
+#endif
+
+void* SystemArena_Realloc(void* ptr, u32 newSize) {
+ DECLARE_INTERRUPT_MASK
+
+ DISABLE_INTERRUPTS();
+ ptr = __osRealloc(&gSystemArena, ptr, newSize);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, newSize, "realloc", "再確保"); // "Re-securing"
+ return ptr;
+}
+
+#if OOT_DEBUG
+void* SystemArena_ReallocDebug(void* ptr, u32 newSize, const char* file, int line) {
+ DECLARE_INTERRUPT_MASK
+
+ DISABLE_INTERRUPTS();
+ ptr = __osReallocDebug(&gSystemArena, ptr, newSize, file, line);
+ RESTORE_INTERRUPTS();
+
+ SYSTEM_ARENA_CHECK_POINTER(ptr, newSize, "realloc_DEBUG", "再確保"); // "Re-securing"
+ return ptr;
+}
+#endif
+
+void SystemArena_Free(void* ptr) {
+ DECLARE_INTERRUPT_MASK
+
+ DISABLE_INTERRUPTS();
+ __osFree(&gSystemArena, ptr);
+ RESTORE_INTERRUPTS();
+}
+
+#if OOT_DEBUG
+void SystemArena_FreeDebug(void* ptr, const char* file, int line) {
+ DECLARE_INTERRUPT_MASK
+
+ DISABLE_INTERRUPTS();
+ __osFreeDebug(&gSystemArena, ptr, file, line);
+ RESTORE_INTERRUPTS();
+}
+#endif
+
+void* SystemArena_Calloc(u32 num, u32 size) {
+ DECLARE_INTERRUPT_MASK
+ void* ret;
+ u32 n = num * size;
+
+ DISABLE_INTERRUPTS();
+ ret = __osMalloc(&gSystemArena, n);
+ RESTORE_INTERRUPTS();
+
+ if (ret != NULL) {
+ bzero(ret, n);
+ }
+
+ SYSTEM_ARENA_CHECK_POINTER(ret, n, "calloc", "確保");
+ return ret;
+}
+
+#if OOT_DEBUG
+void SystemArena_Display(void) {
+ PRINTF(T("システムヒープ表示\n", "System heap display\n"));
+ __osDisplayArena(&gSystemArena);
+}
+#endif
+
+void SystemArena_GetSizes(u32* outMaxFree, u32* outFree, u32* outAlloc) {
+ ArenaImpl_GetSizes(&gSystemArena, outMaxFree, outFree, outAlloc);
+}
+
+void SystemArena_Check(void) {
+ __osCheckArena(&gSystemArena);
+}
+
+void SystemArena_Init(void* start, u32 size) {
+#if OOT_DEBUG
+ gSystemArenaLogSeverity = LOG_SEVERITY_NOLOG;
+#endif
+ __osMallocInit(&gSystemArena, start, size);
+}
+
+void SystemArena_Cleanup(void) {
+#if OOT_DEBUG
+ gSystemArenaLogSeverity = LOG_SEVERITY_NOLOG;
+#endif
+ __osMallocCleanup(&gSystemArena);
+}
+
+s32 SystemArena_IsInitialized(void) {
+ return __osMallocIsInitialized(&gSystemArena);
+}