From 4dc4854935cdb023c5e860c114d9315956e8ac48 Mon Sep 17 00:00:00 2001 From: CharlesThobe Date: Thu, 16 Dec 2021 19:55:30 +0200 Subject: [PATCH] Got rid of SDL --- CMakeLists.txt | 2 +- cmake_subdirs/ocore_sdl/CMakeLists.txt | 2 +- src/osd/modules/lib/osdlib_unix_mod.cpp | 235 ++++++++++++++++++++++++ unused/sdl_needed_symbols.txt | 3 + 4 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 src/osd/modules/lib/osdlib_unix_mod.cpp create mode 100644 unused/sdl_needed_symbols.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ed79a3..1a26de3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,4 +21,4 @@ set_property(TARGET chdman PROPERTY CXX_STANDARD 17) #target_link_libraries(ocore_sdl PRIVATE SDL2) target_link_libraries(chdman PRIVATE utils expat 7z ocore_sdl zlib flac utf8proc -dl rt SDL2 m pthread util) +dl rt m pthread util) diff --git a/cmake_subdirs/ocore_sdl/CMakeLists.txt b/cmake_subdirs/ocore_sdl/CMakeLists.txt index ea091ba..a73666a 100644 --- a/cmake_subdirs/ocore_sdl/CMakeLists.txt +++ b/cmake_subdirs/ocore_sdl/CMakeLists.txt @@ -18,7 +18,7 @@ ${CMAKE_SOURCE_DIR}/src/osd/osdsync.cpp ${CMAKE_SOURCE_DIR}/src/osd/osdsync.h ${CMAKE_SOURCE_DIR}/src/osd/modules/osdmodule.cpp ${CMAKE_SOURCE_DIR}/src/osd/modules/osdmodule.h -${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib_unix.cpp +${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib_unix_mod.cpp ${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib.h ${CMAKE_SOURCE_DIR}/src/osd/modules/file/posixdir.cpp ${CMAKE_SOURCE_DIR}/src/osd/modules/file/posixfile.cpp diff --git a/src/osd/modules/lib/osdlib_unix_mod.cpp b/src/osd/modules/lib/osdlib_unix_mod.cpp new file mode 100644 index 0000000..b9fe521 --- /dev/null +++ b/src/osd/modules/lib/osdlib_unix_mod.cpp @@ -0,0 +1,235 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, R. Belmont +//============================================================ +// +// sdlos_*.c - OS specific low level code +// +// SDLMAME by Olivier Galibert and R. Belmont +// +//============================================================ + +// MAME headers +#include "osdcore.h" +#include "osdlib.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +//============================================================ +// osd_getenv +//============================================================ + +const char *osd_getenv(const char *name) +{ + return getenv(name); +} + +//============================================================ +// osd_setenv +//============================================================ + +int osd_setenv(const char *name, const char *value, int overwrite) +{ + return setenv(name, value, overwrite); +} + +//============================================================ +// osd_process_kill +//============================================================ + +void osd_process_kill() +{ + kill(getpid(), SIGKILL); +} + +//============================================================ +// osd_break_into_debugger +//============================================================ + +void osd_break_into_debugger(const char *message) +{ +#ifdef MAME_DEBUG + printf("MAME exception: %s\n", message); + printf("Attempting to fall into debugger\n"); + kill(getpid(), SIGTRAP); +#else + printf("Ignoring MAME exception: %s\n", message); +#endif +} + +#ifdef SDLMAME_ANDROID +std::string osd_get_clipboard_text() +{ + return std::string(); +} +#else +//============================================================ +// osd_get_clipboard_text +//============================================================ + +/*std::string osd_get_clipboard_text() +{ + std::string result; + + if (SDL_HasClipboardText()) + { + char *temp = SDL_GetClipboardText(); + result.assign(temp); + SDL_free(temp); + } + return result; +}*/ + +#endif + +//============================================================ +// osd_getpid +//============================================================ + +int osd_getpid() +{ + return getpid(); +} + + +namespace osd { + +namespace { + +class dynamic_module_posix_impl : public dynamic_module +{ +public: + dynamic_module_posix_impl(std::vector &&libraries) : m_libraries(std::move(libraries)) + { + } + + virtual ~dynamic_module_posix_impl() override + { + if (m_module) + dlclose(m_module); + } + +protected: + virtual generic_fptr_t get_symbol_address(char const *symbol) override + { + /* + * given a list of libraries, if a first symbol is successfully loaded from + * one of them, all additional symbols will be loaded from the same library + */ + if (m_module) + return reinterpret_cast(dlsym(m_module, symbol)); + + for (auto const &library : m_libraries) + { + void *const module = dlopen(library.c_str(), RTLD_LAZY); + + if (module != nullptr) + { + generic_fptr_t const function = reinterpret_cast(dlsym(module, symbol)); + + if (function) + { + m_module = module; + return function; + } + else + { + dlclose(module); + } + } + } + + return nullptr; + } + +private: + std::vector m_libraries; + void * m_module = nullptr; +}; + +} // anonymous namespace + + +bool invalidate_instruction_cache(void const *start, std::size_t size) +{ +#if !defined(SDLMAME_EMSCRIPTEN) + char const *const begin(reinterpret_cast(start)); + char const *const end(begin + size); + __builtin___clear_cache(const_cast(begin), const_cast(end)); +#endif + return true; +} + + +void *virtual_memory_allocation::do_alloc(std::initializer_list blocks, unsigned intent, std::size_t &size, std::size_t &page_size) +{ + long const p(sysconf(_SC_PAGE_SIZE)); + if (0 >= p) + return nullptr; + std::size_t s(0); + for (std::size_t b : blocks) + s += (b + p - 1) / p; + s *= p; + if (!s) + return nullptr; +#if defined __NetBSD__ + int req((NONE == intent) ? PROT_NONE : 0); + if (intent & READ) + req |= PROT_READ; + if (intent & WRITE) + req |= PROT_WRITE; + if (intent & EXECUTE) + req |= PROT_EXEC; + int const prot(PROT_MPROTECT(req)); +#else + int const prot(PROT_NONE); +#endif +#if defined(SDLMAME_BSD) || defined(SDLMAME_MACOSX) || defined(SDLMAME_EMSCRIPTEN) + int const fd(-1); +#else + // TODO: portable applications are supposed to use -1 for anonymous mappings - detect whatever requires 0 specifically + int const fd(0); +#endif + void *const result(mmap(nullptr, s, prot, MAP_ANON | MAP_SHARED, fd, 0)); + if (result == (void *)-1) + return nullptr; + size = s; + page_size = p; + return result; +} + +void virtual_memory_allocation::do_free(void *start, std::size_t size) +{ + munmap(reinterpret_cast(start), size); +} + +bool virtual_memory_allocation::do_set_access(void *start, std::size_t size, unsigned access) +{ + int prot((NONE == access) ? PROT_NONE : 0); + if (access & READ) + prot |= PROT_READ; + if (access & WRITE) + prot |= PROT_WRITE; + if (access & EXECUTE) + prot |= PROT_EXEC; + return mprotect(reinterpret_cast(start), size, prot) == 0; +} + + +dynamic_module::ptr dynamic_module::open(std::vector &&names) +{ + return std::make_unique(std::move(names)); +} + +} // namespace osd diff --git a/unused/sdl_needed_symbols.txt b/unused/sdl_needed_symbols.txt new file mode 100644 index 0000000..d5af36c --- /dev/null +++ b/unused/sdl_needed_symbols.txt @@ -0,0 +1,3 @@ +[1/3] Building CXX object cmake_subdirs/ocore_sdl/CMakeFiles/ocore_sdl.dir/__/__/src/osd/modules/lib/osdlib_unix_mod.cpp.o +[2/3] Linking CXX static library cmake_subdirs/ocore_sdl/libocore_sdl.a +[3/3] Linking CXX executable chdman