Browse Source

Introduce SdlThread

pull/2443/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
77a3955bae
  1. 1
      CMakeLists.txt
  2. 20
      Source/utils/sdl_thread.cpp
  3. 67
      Source/utils/sdl_thread.h

1
CMakeLists.txt

@ -418,6 +418,7 @@ set(libdevilutionx_SRCS
Source/utils/language.cpp
Source/utils/paths.cpp
Source/utils/thread.cpp
Source/utils/sdl_thread.cpp
Source/DiabloUI/art.cpp
Source/DiabloUI/art_draw.cpp
Source/DiabloUI/button.cpp

20
Source/utils/sdl_thread.cpp

@ -0,0 +1,20 @@
#include "utils/sdl_thread.h"
namespace devilution {
int SDLCALL SdlThread::ThreadTranslate(void *ptr)
{
auto handler = (void (*)())ptr;
handler();
return 0;
}
void SdlThread::ThreadDeleter(SDL_Thread *thread)
{
if (thread != nullptr)
app_fatal("Joinable thread destroyed");
}
} //namespace devilution

67
Source/utils/sdl_thread.h

@ -0,0 +1,67 @@
#pragma once
#include <memory>
#include <SDL.h>
#ifdef USE_SDL1
#include "utils/sdl2_to_1_2_backports.h"
#endif
#include "appfat.h"
namespace devilution {
namespace this_sdl_thread {
inline SDL_threadID get_id()
{
return SDL_GetThreadID(nullptr);
}
} //namespace this_sdl_thread
class SdlThread final {
static int SDLCALL ThreadTranslate(void *ptr);
static void ThreadDeleter(SDL_Thread *thread);
std::unique_ptr<SDL_Thread, void(*)(SDL_Thread *)> thread { nullptr, ThreadDeleter };
public:
SdlThread(int (SDLCALL *handler)(void *), void *data)
#ifdef USE_SDL1
: thread(SDL_CreateThread(handler, data), ThreadDeleter)
#else
: thread(SDL_CreateThread(handler, nullptr, data), ThreadDeleter)
#endif
{
if (thread == nullptr)
ErrSdl();
}
SdlThread(void (*handler)(void))
: SdlThread(ThreadTranslate, (void *)handler)
{
}
SdlThread() = default;
bool joinable() const
{
return thread != nullptr;
}
SDL_threadID get_id() const
{
return SDL_GetThreadID(thread.get());
}
void join()
{
if (!joinable())
return;
if (get_id() == this_sdl_thread::get_id())
app_fatal("Thread joined from within itself");
SDL_WaitThread(thread.get(), nullptr);
thread.release();
}
};
} // namespace devilution
Loading…
Cancel
Save