mirror of
https://github.com/holub/mame
synced 2025-06-08 13:53:52 +03:00
Update windows to use platform independent watchdog implementation (nw)
This commit is contained in:
parent
bd04e5b17d
commit
37c94e3373
@ -44,6 +44,8 @@ function osdmodulesbuild()
|
|||||||
files {
|
files {
|
||||||
MAME_DIR .. "src/osd/osdnet.cpp",
|
MAME_DIR .. "src/osd/osdnet.cpp",
|
||||||
MAME_DIR .. "src/osd/osdnet.h",
|
MAME_DIR .. "src/osd/osdnet.h",
|
||||||
|
MAME_DIR .. "src/osd/watchdog.cpp",
|
||||||
|
MAME_DIR .. "src/osd/watchdog.h",
|
||||||
MAME_DIR .. "src/osd/modules/debugger/debug_module.h",
|
MAME_DIR .. "src/osd/modules/debugger/debug_module.h",
|
||||||
MAME_DIR .. "src/osd/modules/font/font_module.h",
|
MAME_DIR .. "src/osd/modules/font/font_module.h",
|
||||||
MAME_DIR .. "src/osd/modules/midi/midi_module.h",
|
MAME_DIR .. "src/osd/modules/midi/midi_module.h",
|
||||||
|
@ -425,8 +425,6 @@ project ("osd_" .. _OPTIONS["osd"])
|
|||||||
MAME_DIR .. "src/osd/sdl/window.h",
|
MAME_DIR .. "src/osd/sdl/window.h",
|
||||||
MAME_DIR .. "src/osd/modules/osdwindow.cpp",
|
MAME_DIR .. "src/osd/modules/osdwindow.cpp",
|
||||||
MAME_DIR .. "src/osd/modules/osdwindow.h",
|
MAME_DIR .. "src/osd/modules/osdwindow.h",
|
||||||
MAME_DIR .. "src/osd/sdl/watchdog.cpp",
|
|
||||||
MAME_DIR .. "src/osd/sdl/watchdog.h",
|
|
||||||
MAME_DIR .. "src/osd/modules/render/drawsdl.cpp",
|
MAME_DIR .. "src/osd/modules/render/drawsdl.cpp",
|
||||||
}
|
}
|
||||||
files {
|
files {
|
||||||
|
@ -175,7 +175,8 @@ osd_common_t::osd_common_t(osd_options &options)
|
|||||||
m_mouse_input(nullptr),
|
m_mouse_input(nullptr),
|
||||||
m_lightgun_input(nullptr),
|
m_lightgun_input(nullptr),
|
||||||
m_joystick_input(nullptr),
|
m_joystick_input(nullptr),
|
||||||
m_output(nullptr)
|
m_output(nullptr),
|
||||||
|
m_watchdog(nullptr)
|
||||||
{
|
{
|
||||||
osd_output::push(this);
|
osd_output::push(this);
|
||||||
}
|
}
|
||||||
@ -420,6 +421,16 @@ void osd_common_t::init(running_machine &machine)
|
|||||||
|
|
||||||
// ensure we get called on the way out
|
// ensure we get called on the way out
|
||||||
machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(osd_common_t::osd_exit), this));
|
machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(osd_common_t::osd_exit), this));
|
||||||
|
|
||||||
|
|
||||||
|
/* now setup watchdog */
|
||||||
|
int watchdog_timeout = options.watchdog();
|
||||||
|
|
||||||
|
if (watchdog_timeout != 0)
|
||||||
|
{
|
||||||
|
m_watchdog = std::make_unique<watchdog>();
|
||||||
|
m_watchdog->setTimeout(watchdog_timeout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -437,6 +448,11 @@ void osd_common_t::update(bool skip_redraw)
|
|||||||
// irregular intervals in some circumstances (e.g., multi-screen games
|
// irregular intervals in some circumstances (e.g., multi-screen games
|
||||||
// or games with asynchronous updates).
|
// or games with asynchronous updates).
|
||||||
//
|
//
|
||||||
|
if (m_watchdog != NULL)
|
||||||
|
m_watchdog->reset();
|
||||||
|
|
||||||
|
update_slider_list();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#define MAME_OSD_LIB_OSDOBJ_COMMON_H
|
#define MAME_OSD_LIB_OSDOBJ_COMMON_H
|
||||||
|
|
||||||
#include "osdepend.h"
|
#include "osdepend.h"
|
||||||
|
#include "watchdog.h"
|
||||||
#include "modules/osdmodule.h"
|
#include "modules/osdmodule.h"
|
||||||
#include "modules/font/font_module.h"
|
#include "modules/font/font_module.h"
|
||||||
#include "modules/input/input_module.h"
|
#include "modules/input/input_module.h"
|
||||||
@ -273,14 +274,15 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
sound_module* m_sound;
|
sound_module* m_sound;
|
||||||
debug_module* m_debugger;
|
debug_module* m_debugger;
|
||||||
midi_module* m_midi;
|
midi_module* m_midi;
|
||||||
input_module* m_keyboard_input;
|
input_module* m_keyboard_input;
|
||||||
input_module* m_mouse_input;
|
input_module* m_mouse_input;
|
||||||
input_module* m_lightgun_input;
|
input_module* m_lightgun_input;
|
||||||
input_module* m_joystick_input;
|
input_module* m_joystick_input;
|
||||||
output_module* m_output;
|
output_module* m_output;
|
||||||
|
std::unique_ptr<watchdog> m_watchdog;
|
||||||
std::vector<ui_menu_item> m_sliders;
|
std::vector<ui_menu_item> m_sliders;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
#ifndef _osdsdl_h_
|
#ifndef _osdsdl_h_
|
||||||
#define _osdsdl_h_
|
#define _osdsdl_h_
|
||||||
|
|
||||||
#include "watchdog.h"
|
|
||||||
#include "modules/lib/osdobj_common.h"
|
#include "modules/lib/osdobj_common.h"
|
||||||
#include "modules/osdmodule.h"
|
#include "modules/osdmodule.h"
|
||||||
#include "modules/font/font_module.h"
|
#include "modules/font/font_module.h"
|
||||||
@ -168,8 +167,6 @@ private:
|
|||||||
void extract_video_config();
|
void extract_video_config();
|
||||||
|
|
||||||
sdl_options &m_options;
|
sdl_options &m_options;
|
||||||
|
|
||||||
watchdog *m_watchdog;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//============================================================
|
//============================================================
|
||||||
|
@ -53,8 +53,6 @@
|
|||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
//============================================================
|
//============================================================
|
||||||
// OPTIONS
|
// OPTIONS
|
||||||
//============================================================
|
//============================================================
|
||||||
@ -250,7 +248,7 @@ static void output_oslog(const running_machine &machine, const char *buffer)
|
|||||||
//============================================================
|
//============================================================
|
||||||
|
|
||||||
sdl_osd_interface::sdl_osd_interface(sdl_options &options)
|
sdl_osd_interface::sdl_osd_interface(sdl_options &options)
|
||||||
: osd_common_t(options), m_options(options), m_watchdog(nullptr)
|
: osd_common_t(options), m_options(options)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,15 +503,7 @@ void sdl_osd_interface::init(running_machine &machine)
|
|||||||
if (options().oslog())
|
if (options().oslog())
|
||||||
machine.add_logerror_callback(output_oslog);
|
machine.add_logerror_callback(output_oslog);
|
||||||
|
|
||||||
/* now setup watchdog */
|
|
||||||
|
|
||||||
int watchdog_timeout = options().watchdog();
|
|
||||||
|
|
||||||
if (watchdog_timeout != 0)
|
|
||||||
{
|
|
||||||
m_watchdog = auto_alloc(machine, watchdog);
|
|
||||||
m_watchdog->setTimeout(watchdog_timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SDLMAME_EMSCRIPTEN
|
#ifdef SDLMAME_EMSCRIPTEN
|
||||||
SDL_EventState(SDL_TEXTINPUT, SDL_FALSE);
|
SDL_EventState(SDL_TEXTINPUT, SDL_FALSE);
|
||||||
|
@ -134,18 +134,13 @@ void sdl_monitor_info::refresh()
|
|||||||
|
|
||||||
void sdl_osd_interface::update(bool skip_redraw)
|
void sdl_osd_interface::update(bool skip_redraw)
|
||||||
{
|
{
|
||||||
sdl_window_info *window;
|
osd_common_t::update(skip_redraw);
|
||||||
|
|
||||||
if (m_watchdog != NULL)
|
|
||||||
m_watchdog->reset();
|
|
||||||
|
|
||||||
update_slider_list();
|
|
||||||
|
|
||||||
// if we're not skipping this redraw, update all windows
|
// if we're not skipping this redraw, update all windows
|
||||||
if (!skip_redraw)
|
if (!skip_redraw)
|
||||||
{
|
{
|
||||||
// profiler_mark(PROFILER_BLIT);
|
// profiler_mark(PROFILER_BLIT);
|
||||||
for (window = sdl_window_list; window != NULL; window = window->m_next)
|
for (sdl_window_info *window = sdl_window_list; window != NULL; window = window->m_next)
|
||||||
window->update();
|
window->update();
|
||||||
// profiler_mark(PROFILER_END);
|
// profiler_mark(PROFILER_END);
|
||||||
}
|
}
|
||||||
|
@ -166,10 +166,7 @@ osd_monitor_info *win_monitor_info::monitor_from_handle(HMONITOR hmonitor)
|
|||||||
|
|
||||||
void windows_osd_interface::update(bool skip_redraw)
|
void windows_osd_interface::update(bool skip_redraw)
|
||||||
{
|
{
|
||||||
// ping the watchdog on each update
|
osd_common_t::update(skip_redraw);
|
||||||
winmain_watchdog_ping();
|
|
||||||
|
|
||||||
update_slider_list();
|
|
||||||
|
|
||||||
// if we're not skipping this redraw, update all windows
|
// if we're not skipping this redraw, update all windows
|
||||||
if (!skip_redraw)
|
if (!skip_redraw)
|
||||||
|
@ -280,10 +280,6 @@ static int timeresult = !TIMERR_NOERROR;
|
|||||||
static TIMECAPS timecaps;
|
static TIMECAPS timecaps;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static HANDLE watchdog_reset_event;
|
|
||||||
static HANDLE watchdog_exit_event;
|
|
||||||
static HANDLE watchdog_thread;
|
|
||||||
|
|
||||||
static running_machine *g_current_machine;
|
static running_machine *g_current_machine;
|
||||||
|
|
||||||
|
|
||||||
@ -293,7 +289,6 @@ static running_machine *g_current_machine;
|
|||||||
|
|
||||||
static BOOL WINAPI control_handler(DWORD type);
|
static BOOL WINAPI control_handler(DWORD type);
|
||||||
static int is_double_click_start(int argc);
|
static int is_double_click_start(int argc);
|
||||||
static DWORD WINAPI watchdog_thread_entry(LPVOID lpParameter);
|
|
||||||
static LONG WINAPI exception_filter(struct _EXCEPTION_POINTERS *info);
|
static LONG WINAPI exception_filter(struct _EXCEPTION_POINTERS *info);
|
||||||
|
|
||||||
|
|
||||||
@ -702,17 +697,6 @@ void windows_osd_interface::init(running_machine &machine)
|
|||||||
timeBeginPeriod(timecaps.wPeriodMin);
|
timeBeginPeriod(timecaps.wPeriodMin);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// if a watchdog thread is requested, create one
|
|
||||||
int watchdog = options.watchdog();
|
|
||||||
if (watchdog != 0)
|
|
||||||
{
|
|
||||||
watchdog_reset_event = CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
|
||||||
assert_always(watchdog_reset_event != nullptr, "Failed to create watchdog reset event");
|
|
||||||
watchdog_exit_event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
|
|
||||||
assert_always(watchdog_exit_event != nullptr, "Failed to create watchdog exit event");
|
|
||||||
watchdog_thread = CreateThread(nullptr, 0, watchdog_thread_entry, (LPVOID)(FPTR)watchdog, 0, nullptr);
|
|
||||||
assert_always(watchdog_thread != nullptr, "Failed to create watchdog thread");
|
|
||||||
}
|
|
||||||
|
|
||||||
// create and start the profiler
|
// create and start the profiler
|
||||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||||
@ -745,18 +729,6 @@ void windows_osd_interface::osd_exit()
|
|||||||
|
|
||||||
osd_common_t::osd_exit();
|
osd_common_t::osd_exit();
|
||||||
|
|
||||||
// take down the watchdog thread if it exists
|
|
||||||
if (watchdog_thread != nullptr)
|
|
||||||
{
|
|
||||||
SetEvent(watchdog_exit_event);
|
|
||||||
WaitForSingleObject(watchdog_thread, INFINITE);
|
|
||||||
CloseHandle(watchdog_reset_event);
|
|
||||||
CloseHandle(watchdog_exit_event);
|
|
||||||
CloseHandle(watchdog_thread);
|
|
||||||
watchdog_reset_event = nullptr;
|
|
||||||
watchdog_exit_event = nullptr;
|
|
||||||
watchdog_thread = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||||
// stop the profiler
|
// stop the profiler
|
||||||
@ -777,55 +749,6 @@ void windows_osd_interface::osd_exit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
|
||||||
// watchdog_thread_entry
|
|
||||||
//============================================================
|
|
||||||
|
|
||||||
static DWORD WINAPI watchdog_thread_entry(LPVOID lpParameter)
|
|
||||||
{
|
|
||||||
DWORD timeout = (int)(FPTR)lpParameter * 1000;
|
|
||||||
|
|
||||||
while (TRUE)
|
|
||||||
{
|
|
||||||
HANDLE handle_list[2];
|
|
||||||
DWORD wait_result;
|
|
||||||
|
|
||||||
// wait for either a reset or an exit, or a timeout
|
|
||||||
handle_list[0] = watchdog_reset_event;
|
|
||||||
handle_list[1] = watchdog_exit_event;
|
|
||||||
wait_result = WaitForMultipleObjects(2, handle_list, FALSE, timeout);
|
|
||||||
|
|
||||||
// on a reset, just loop around and re-wait
|
|
||||||
if (wait_result == WAIT_OBJECT_0 + 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// on an exit, break out
|
|
||||||
if (wait_result == WAIT_OBJECT_0 + 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// on a timeout, kill the process
|
|
||||||
if (wait_result == WAIT_TIMEOUT)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Terminating due to watchdog timeout\n");
|
|
||||||
fflush(stderr);
|
|
||||||
TerminateProcess(GetCurrentProcess(), -1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
|
||||||
// winmain_watchdog_ping
|
|
||||||
//============================================================
|
|
||||||
|
|
||||||
void winmain_watchdog_ping(void)
|
|
||||||
{
|
|
||||||
// if we have a watchdog, reset it
|
|
||||||
if (watchdog_reset_event != nullptr)
|
|
||||||
SetEvent(watchdog_reset_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||||
|
|
||||||
|
@ -337,8 +337,6 @@ extern int osd_num_processors;
|
|||||||
// FUNCTION PROTOTYPES
|
// FUNCTION PROTOTYPES
|
||||||
//============================================================
|
//============================================================
|
||||||
|
|
||||||
// use this to ping the watchdog
|
|
||||||
void winmain_watchdog_ping(void);
|
|
||||||
void winmain_dump_stack();
|
void winmain_dump_stack();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user