|
@@ -198,8 +198,18 @@ enum class CallerWillInitializeMemory {
|
|
|
Yes,
|
|
|
};
|
|
|
|
|
|
+#ifndef NO_TLS
|
|
|
+// HACK: This is a __thread - marked thread-local variable. If we initialize it globally here, VERY weird errors happen.
|
|
|
+// The initialization happens in __malloc_init() and pthread_create_helper().
|
|
|
+__thread bool s_allocation_enabled;
|
|
|
+#endif
|
|
|
+
|
|
|
static void* malloc_impl(size_t size, CallerWillInitializeMemory caller_will_initialize_memory)
|
|
|
{
|
|
|
+#ifndef NO_TLS
|
|
|
+ VERIFY(s_allocation_enabled);
|
|
|
+#endif
|
|
|
+
|
|
|
if (s_log_malloc)
|
|
|
dbgln("LibC: malloc({})", size);
|
|
|
|
|
@@ -330,6 +340,10 @@ static void* malloc_impl(size_t size, CallerWillInitializeMemory caller_will_ini
|
|
|
|
|
|
static void free_impl(void* ptr)
|
|
|
{
|
|
|
+#ifndef NO_TLS
|
|
|
+ VERIFY(s_allocation_enabled);
|
|
|
+#endif
|
|
|
+
|
|
|
ScopedValueRollback rollback(errno);
|
|
|
|
|
|
if (!ptr)
|
|
@@ -534,6 +548,12 @@ void* realloc(void* ptr, size_t size)
|
|
|
|
|
|
void __malloc_init()
|
|
|
{
|
|
|
+#ifndef NO_TLS
|
|
|
+ // HACK: This is a __thread - marked thread-local variable. If we initialize it globally, VERY weird errors happen.
|
|
|
+ // Therefore, we need to do the initialization here and in pthread_create_helper().
|
|
|
+ s_allocation_enabled = true;
|
|
|
+#endif
|
|
|
+
|
|
|
s_in_userspace_emulator = (int)syscall(SC_emuctl, 0) != -ENOSYS;
|
|
|
if (s_in_userspace_emulator) {
|
|
|
// Don't bother scrubbing memory if we're running in UE since it
|