Removed most remaining platform-specific code

This commit is contained in:
Mr-Wiseguy 2023-04-27 18:16:27 -04:00
parent e4dc4526f2
commit 73308e3500
11 changed files with 2 additions and 152 deletions

View File

@ -178,7 +178,6 @@ XCOPY "$(ProjectDir)lib\SDL2-2.24.0\lib\$(Platform)\SDL2.dll" "$(TargetDir)" /S
<ClCompile Include="portultra\misc_ultra.cpp" /> <ClCompile Include="portultra\misc_ultra.cpp" />
<ClCompile Include="portultra\port_main.c" /> <ClCompile Include="portultra\port_main.c" />
<ClCompile Include="portultra\scheduler.cpp" /> <ClCompile Include="portultra\scheduler.cpp" />
<ClCompile Include="portultra\task_pthreads.cpp" />
<ClCompile Include="portultra\task_win32.cpp" /> <ClCompile Include="portultra\task_win32.cpp" />
<ClCompile Include="portultra\threads.cpp" /> <ClCompile Include="portultra\threads.cpp" />
<ClCompile Include="portultra\timer.cpp" /> <ClCompile Include="portultra\timer.cpp" />
@ -223,7 +222,6 @@ XCOPY "$(ProjectDir)lib\SDL2-2.24.0\lib\$(Platform)\SDL2.dll" "$(TargetDir)" /S
<ClInclude Include="include\rt64_layer.h" /> <ClInclude Include="include\rt64_layer.h" />
<ClInclude Include="include\sections.h" /> <ClInclude Include="include\sections.h" />
<ClInclude Include="portultra\multilibultra.hpp" /> <ClInclude Include="portultra\multilibultra.hpp" />
<ClInclude Include="portultra\platform_specific.h" />
<ClInclude Include="portultra\ultra64.h" /> <ClInclude Include="portultra\ultra64.h" />
<ClInclude Include="src\euc-jp.h" /> <ClInclude Include="src\euc-jp.h" />
</ItemGroup> </ItemGroup>

View File

@ -75,9 +75,6 @@
<ClCompile Include="portultra\scheduler.cpp"> <ClCompile Include="portultra\scheduler.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="portultra\task_pthreads.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="portultra\task_win32.cpp"> <ClCompile Include="portultra\task_win32.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -131,9 +128,6 @@
<ClInclude Include="portultra\multilibultra.hpp"> <ClInclude Include="portultra\multilibultra.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="portultra\platform_specific.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="portultra\ultra64.h"> <ClInclude Include="portultra\ultra64.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>

View File

@ -242,7 +242,6 @@ void run_rsp_microcode(uint8_t* rdram, const OSTask* task, RspUcodeFunc* ucode_f
RspExitReason exit_reason = ucode_func(rdram); RspExitReason exit_reason = ucode_func(rdram);
// Ensure that the ucode exited correctly // Ensure that the ucode exited correctly
assert(exit_reason == RspExitReason::Broke); assert(exit_reason == RspExitReason::Broke);
sp_complete();
} }

View File

@ -7,7 +7,6 @@
#include <algorithm> #include <algorithm>
#include "ultra64.h" #include "ultra64.h"
#include "platform_specific.h"
struct UltraThreadContext { struct UltraThreadContext {
std::thread host_thread; std::thread host_thread;
@ -24,20 +23,15 @@ constexpr uint32_t save_size = 1024 * 1024 / 8; // Maximum save size, 1Mbit for
void preinit(uint8_t* rdram, uint8_t* rom); void preinit(uint8_t* rdram, uint8_t* rom);
void save_init(); void save_init();
void native_init();
void init_scheduler(); void init_scheduler();
void init_events(uint8_t* rdram, uint8_t* rom); void init_events(uint8_t* rdram, uint8_t* rom);
void init_timers(RDRAM_ARG1); void init_timers(RDRAM_ARG1);
void native_thread_init(OSThread *t);
void set_self_paused(RDRAM_ARG1); void set_self_paused(RDRAM_ARG1);
void wait_for_resumed(RDRAM_ARG1); void wait_for_resumed(RDRAM_ARG1);
void swap_to_thread(RDRAM_ARG OSThread *to); void swap_to_thread(RDRAM_ARG OSThread *to);
void pause_thread_impl(OSThread *t); void pause_thread_impl(OSThread *t);
void pause_thread_native_impl(OSThread *t);
void resume_thread_impl(OSThread *t); void resume_thread_impl(OSThread *t);
void resume_thread_native_impl(OSThread *t);
void schedule_running_thread(OSThread *t); void schedule_running_thread(OSThread *t);
void stop_thread(OSThread *t);
void pause_self(RDRAM_ARG1); void pause_self(RDRAM_ARG1);
void cleanup_thread(OSThread *t); void cleanup_thread(OSThread *t);
PTR(OSThread) this_thread(); PTR(OSThread) this_thread();

View File

@ -1,32 +0,0 @@
#ifndef __PLATFORM_SPECIFIC_H__
#define __PLATFORM_SPECIFIC_H__
#if defined(__linux__)
//#include <pthread.h>
//
//typedef struct {
// pthread_t t;
// pthread_barrier_t pause_barrier;
// pthread_mutex_t pause_mutex;
// pthread_cond_t pause_cond;
// void (*entrypoint)(void *);
// void *arg;
//} OSThreadNative;
#elif defined(_WIN32)
//#include <pthread.h>
//
//typedef struct {
// pthread_t t;
// pthread_barrier_t pause_barrier;
// pthread_mutex_t pause_mutex;
// pthread_cond_t pause_cond;
// void (*entrypoint)(void*);
// void* arg;
//} OSThreadNative;
#endif
#endif

View File

@ -131,10 +131,6 @@ void swap_running_thread(thread_queue_t& running_thread_queue, OSThread*& cur_ru
if (cur_running_thread && cur_running_thread->state == OSThreadState::RUNNING) { if (cur_running_thread && cur_running_thread->state == OSThreadState::RUNNING) {
debug_printf("[Scheduler] Need to wait for thread %d to pause itself\n", cur_running_thread->id); debug_printf("[Scheduler] Need to wait for thread %d to pause itself\n", cur_running_thread->id);
return; return;
//debug_printf("[Scheduler] Switching execution from thread %d (%d) to thread %d (%d)\n",
// cur_running_thread->id, cur_running_thread->priority,
// new_running_thread->id, new_running_thread->priority);
//Multilibultra::pause_thread_impl(cur_running_thread);
} else { } else {
debug_printf("[Scheduler] Switching execution to thread %d (%d)\n", new_running_thread->id, new_running_thread->priority); debug_printf("[Scheduler] Switching execution to thread %d (%d)\n", new_running_thread->id, new_running_thread->priority);
} }
@ -238,17 +234,6 @@ void pause_self(RDRAM_ARG1) {
Multilibultra::wait_for_resumed(PASS_RDRAM1); Multilibultra::wait_for_resumed(PASS_RDRAM1);
} }
void stop_thread(OSThread *t) {
debug_printf("[Scheduler] Queuing Thread %d to be stopped\n", t->id);
{
std::lock_guard lock{scheduler_context.mutex};
scheduler_context.to_stop.push_back(t);
scheduler_context.action_count.fetch_add(1);
scheduler_context.action_count.notify_all();
}
Multilibultra::pause_thread_impl(t);
}
void cleanup_thread(OSThread *t) { void cleanup_thread(OSThread *t) {
std::lock_guard lock{scheduler_context.mutex}; std::lock_guard lock{scheduler_context.mutex};
scheduler_context.to_cleanup.push_back(t); scheduler_context.to_cleanup.push_back(t);

View File

@ -1,60 +0,0 @@
#ifndef _WIN32
// #include <thread>
// #include <stdexcept>
// #include <atomic>
#include <pthread.h>
#include <signal.h>
#include <limits.h>
#include "ultra64.h"
#include "multilibultra.hpp"
constexpr int pause_thread_signum = SIGUSR1;
// void cleanup_current_thread(OSThread *t) {
// debug_printf("Thread cleanup %d\n", t->id);
// // delete t->context;
// }
void sig_handler(int signum, siginfo_t *info, void *context) {
if (signum == pause_thread_signum) {
OSThread *t = Multilibultra::this_thread();
debug_printf("[Sig] Thread %d paused\n", t->id);
// Wait until the thread is marked as running again
t->context->running.wait(false);
debug_printf("[Sig] Thread %d resumed\n", t->id);
}
}
void Multilibultra::native_init(void) {
// Set up a signal handler to capture pause signals
struct sigaction sigact;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_SIGINFO | SA_RESTART;
sigact.sa_sigaction = sig_handler;
sigaction(pause_thread_signum, &sigact, nullptr);
}
void Multilibultra::native_thread_init(OSThread *t) {
debug_printf("[Native] Init thread %d\n", t->id);
}
void Multilibultra::pause_thread_native_impl(OSThread *t) {
debug_printf("[Native] Pause thread %d\n", t->id);
// Send a pause signal to the thread, which will trigger it to wait on its pause barrier in the signal handler
pthread_kill(t->context->host_thread.native_handle(), pause_thread_signum);
}
void Multilibultra::resume_thread_native_impl(UNUSED OSThread *t) {
debug_printf("[Native] Resume thread %d\n", t->id);
// Nothing to do here
}
#endif

View File

@ -7,26 +7,3 @@ extern "C" unsigned int sleep(unsigned int seconds) {
Sleep(seconds * 1000); Sleep(seconds * 1000);
return 0; return 0;
} }
void Multilibultra::native_init(void) {
}
void Multilibultra::native_thread_init(OSThread *t) {
debug_printf("[Native] Init thread %d\n", t->id);
}
void Multilibultra::pause_thread_native_impl(OSThread *t) {
debug_printf("[Native] Pause thread %d\n", t->id);
// Pause the thread via the win32 API
SuspendThread(t->context->host_thread.native_handle());
// Perform a synchronous action to ensure that the thread is suspended
// see: https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743
CONTEXT threadContext{};
GetThreadContext(t->context->host_thread.native_handle(), &threadContext);
}
void Multilibultra::resume_thread_native_impl(UNUSED OSThread *t) {
debug_printf("[Native] Resume thread %d\n", t->id);
// Resume the thread
ResumeThread(t->context->host_thread.native_handle());
}

View File

@ -59,9 +59,6 @@ static void _thread_func(RDRAM_ARG PTR(OSThread) self_, PTR(thread_func_t) entry
); );
#endif #endif
// Perform any necessary native thread initialization.
Multilibultra::native_thread_init(self);
// Set initialized to false to indicate that this thread can be started. // Set initialized to false to indicate that this thread can be started.
self->context->initialized.store(true); self->context->initialized.store(true);
self->context->initialized.notify_all(); self->context->initialized.notify_all();
@ -200,12 +197,11 @@ void Multilibultra::pause_thread_impl(OSThread* t) {
t->state = OSThreadState::PREEMPTED; t->state = OSThreadState::PREEMPTED;
t->context->running.store(false); t->context->running.store(false);
t->context->running.notify_all(); t->context->running.notify_all();
Multilibultra::pause_thread_native_impl(t);
} }
void Multilibultra::resume_thread_impl(OSThread *t) { void Multilibultra::resume_thread_impl(OSThread *t) {
if (t->state == OSThreadState::PREEMPTED) { if (t->state == OSThreadState::PREEMPTED) {
Multilibultra::resume_thread_native_impl(t); // Nothing to do here
} }
t->state = OSThreadState::RUNNING; t->state = OSThreadState::RUNNING;
t->context->running.store(true); t->context->running.store(true);

View File

@ -2,7 +2,6 @@
#define __ULTRA64_MULTILIBULTRA_H__ #define __ULTRA64_MULTILIBULTRA_H__
#include <stdint.h> #include <stdint.h>
#include "platform_specific.h"
#ifdef __cplusplus #ifdef __cplusplus
#include <queue> #include <queue>

View File

@ -11,5 +11,5 @@ void Multilibultra::preinit(uint8_t* rdram, uint8_t* rom) {
extern "C" void osInitialize() { extern "C" void osInitialize() {
Multilibultra::init_scheduler(); Multilibultra::init_scheduler();
Multilibultra::native_init(); //Multilibultra::native_init();
} }