From 3a7263020a8da8aaecc06e9fc19f920af85ac843 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 19 May 2015 19:33:58 +0200 Subject: [PATCH] Add grab_stdin function pointer to input driver - avoids threading segfault at exit with linuxraw input driver to do with driver->stdin_claimed --- command_event.c | 4 ++-- driver.h | 1 - input/drivers/android_input.c | 1 + input/drivers/cocoa_input.c | 1 + input/drivers/ctr_input.c | 1 + input/drivers/dinput.c | 1 + input/drivers/gx_input.c | 1 + input/drivers/linuxraw_input.c | 14 ++++++++++---- input/drivers/nullinput.c | 1 + input/drivers/ps3_input.c | 1 + input/drivers/psp_input.c | 1 + input/drivers/qnx_input.c | 1 + input/drivers/rwebinput_input.c | 1 + input/drivers/sdl_input.c | 1 + input/drivers/udev_input.c | 1 + input/drivers/x11_input.c | 1 + input/drivers/xdk_xinput_input.c | 1 + input/drivers/xenon360_input.c | 1 + input/input_driver.c | 10 ++++++++++ input/input_driver.h | 3 +++ 20 files changed, 40 insertions(+), 7 deletions(-) diff --git a/command_event.c b/command_event.c index 0451fd3d85..53f3fdecfd 100644 --- a/command_event.c +++ b/command_event.c @@ -52,14 +52,14 @@ static void event_init_command(void) if (!settings->stdin_cmd_enable && !settings->network_cmd_enable) return; - if (settings->stdin_cmd_enable && driver->stdin_claimed) + if (settings->stdin_cmd_enable && input_driver_grab_stdin()) { RARCH_WARN("stdin command interface is desired, but input driver has already claimed stdin.\n" "Cannot use this command interface.\n"); } if (!(driver->command = rarch_cmd_new(settings->stdin_cmd_enable - && !driver->stdin_claimed, + && !input_driver_grab_stdin(), settings->network_cmd_enable, settings->network_cmd_port))) RARCH_ERR("Failed to initialize command interface.\n"); } diff --git a/driver.h b/driver.h index cc8e842cb1..6dc0143ac1 100644 --- a/driver.h +++ b/driver.h @@ -263,7 +263,6 @@ typedef struct driver #ifdef HAVE_COMMAND rarch_cmd_t *command; #endif - bool stdin_claimed; bool block_hotkey; bool block_input; bool block_libretro_input; diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index d6813df4d6..7d6e2f0e4a 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -1062,6 +1062,7 @@ input_driver_t input_android = { "android", android_input_grab_mouse, + NULL, android_input_set_rumble, android_input_get_joypad_driver, }; diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index 4a2c4cc1f7..f148543b19 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -434,6 +434,7 @@ input_driver_t input_cocoa = { cocoa_input_get_capabilities, "cocoa", cocoa_input_grab_mouse, + NULL, cocoa_input_set_rumble, cocoa_input_get_joypad_driver }; diff --git a/input/drivers/ctr_input.c b/input/drivers/ctr_input.c index 1cbcff34e3..9b5f580674 100644 --- a/input/drivers/ctr_input.c +++ b/input/drivers/ctr_input.c @@ -132,6 +132,7 @@ input_driver_t input_ctr = { ctr_input_get_capabilities, "ctr", ctr_input_grab_mouse, + NULL, ctr_input_set_rumble, ctr_input_get_joypad_driver, }; diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index f1a9b8d41a..1c7f227a1b 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -685,6 +685,7 @@ input_driver_t input_dinput = { "dinput", dinput_grab_mouse, + NULL, dinput_set_rumble, dinput_get_joypad_driver, }; diff --git a/input/drivers/gx_input.c b/input/drivers/gx_input.c index 44f5b6edb8..89372a095a 100644 --- a/input/drivers/gx_input.c +++ b/input/drivers/gx_input.c @@ -141,6 +141,7 @@ input_driver_t input_gx = { "gx", gx_input_grab_mouse, + NULL, gx_input_set_rumble, gx_input_get_joypad_driver, }; diff --git a/input/drivers/linuxraw_input.c b/input/drivers/linuxraw_input.c index 544a55e882..63460f9c64 100644 --- a/input/drivers/linuxraw_input.c +++ b/input/drivers/linuxraw_input.c @@ -28,6 +28,7 @@ #include "../input_joypad.h" static long oldKbmd = 0xffff; +static bool linuxraw_stdin_claimed = false; static struct termios oldTerm, newTerm; typedef struct linuxraw_input @@ -39,7 +40,6 @@ typedef struct linuxraw_input static void linuxraw_reset_kbmd(void) { - driver_t *driver = driver_get_ptr(); if (oldKbmd != 0xffff) { ioctl(0, KDSKBMODE, oldKbmd); @@ -47,7 +47,7 @@ static void linuxraw_reset_kbmd(void) oldKbmd = 0xffff; } - driver->stdin_claimed = false; + linuxraw_stdin_claimed = false; } static void linuxraw_exit_gracefully(int sig) @@ -67,7 +67,7 @@ static void *linuxraw_input_init(void) if (!isatty(0)) return NULL; - if (driver->stdin_claimed) + if (linuxraw_stdin_claimed) { RARCH_WARN("stdin is already used for content loading. Cannot use stdin for input.\n"); return NULL; @@ -122,11 +122,16 @@ static void *linuxraw_input_init(void) /* We need to disable use of stdin command interface if * stdin is supposed to be used for input. */ - driver->stdin_claimed = true; + linuxraw_stdin_claimed = true; return linuxraw; } +static bool linuxraw_grab_stdin(void *data) +{ + return linuxraw_stdin_claimed; +} + static bool linuxraw_key_pressed(linuxraw_input_t *linuxraw, int key) { unsigned sym = input_keymaps_translate_rk_to_keysym((enum retro_key)key); @@ -282,6 +287,7 @@ input_driver_t input_linuxraw = { linuxraw_get_capabilities, "linuxraw", linuxraw_grab_mouse, + linuxraw_grab_stdin, linuxraw_set_rumble, linuxraw_get_joypad_driver, }; diff --git a/input/drivers/nullinput.c b/input/drivers/nullinput.c index 96b5d6bef4..4dc0a6cd5a 100644 --- a/input/drivers/nullinput.c +++ b/input/drivers/nullinput.c @@ -97,5 +97,6 @@ input_driver_t input_null = { nullinput_get_capabilities, "null", nullinput_grab_mouse, + NULL, nullinput_set_rumble, }; diff --git a/input/drivers/ps3_input.c b/input/drivers/ps3_input.c index 72fe2f7c4d..f85e585d3c 100644 --- a/input/drivers/ps3_input.c +++ b/input/drivers/ps3_input.c @@ -259,6 +259,7 @@ input_driver_t input_ps3 = { "ps3", ps3_input_grab_mouse, + NULL, ps3_input_set_rumble, ps3_input_get_joypad_driver, }; diff --git a/input/drivers/psp_input.c b/input/drivers/psp_input.c index 792fa984a5..e7bf88d87f 100644 --- a/input/drivers/psp_input.c +++ b/input/drivers/psp_input.c @@ -146,6 +146,7 @@ input_driver_t input_psp = { "psp", psp_input_grab_mouse, + NULL, psp_input_set_rumble, psp_input_get_joypad_driver, }; diff --git a/input/drivers/qnx_input.c b/input/drivers/qnx_input.c index a4baa88921..bd574de33b 100644 --- a/input/drivers/qnx_input.c +++ b/input/drivers/qnx_input.c @@ -850,6 +850,7 @@ input_driver_t input_qnx = { qnx_input_get_capabilities, "qnx_input", qnx_input_grab_mouse, + NULL, qnx_input_set_rumble, qnx_input_get_joypad_driver, }; diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index 1e2b2d3598..62dce5fa95 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -237,5 +237,6 @@ input_driver_t input_rwebinput = { rwebinput_get_capabilities, "rwebinput", rwebinput_grab_mouse, + NULL, rwebinput_set_rumble, }; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index c93b5b0b9f..a25962efad 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -395,6 +395,7 @@ input_driver_t input_sdl = { "sdl", #endif sdl_grab_mouse, + NULL, sdl_set_rumble, sdl_get_joypad_driver, }; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 07e5bce46a..8e80132c98 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -874,6 +874,7 @@ input_driver_t input_udev = { udev_input_get_capabilities, "udev", udev_input_grab_mouse, + NULL, udev_input_set_rumble, udev_input_get_joypad_driver, }; diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index a0a01906a6..d4640c1591 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -396,6 +396,7 @@ input_driver_t input_x = { x_input_get_capabilities, "x", x_grab_mouse, + NULL, x_set_rumble, x_get_joypad_driver, }; diff --git a/input/drivers/xdk_xinput_input.c b/input/drivers/xdk_xinput_input.c index 823e850e1d..6830bd6117 100644 --- a/input/drivers/xdk_xinput_input.c +++ b/input/drivers/xdk_xinput_input.c @@ -162,6 +162,7 @@ input_driver_t input_xinput = { xdk_input_get_capabilities, "xinput", xdk_input_grab_mouse, + NULL, xdk_input_set_rumble, xdk_input_get_joypad_driver, }; diff --git a/input/drivers/xenon360_input.c b/input/drivers/xenon360_input.c index 23c58cea22..7ccbdd91b9 100644 --- a/input/drivers/xenon360_input.c +++ b/input/drivers/xenon360_input.c @@ -131,5 +131,6 @@ input_driver_t input_xenon360 = { xenon360_input_get_capabilities, "xenon360", xenon360_input_grab_mouse, + NULL, xenon360_input_set_rumble, }; diff --git a/input/input_driver.c b/input/input_driver.c index e58dd1b647..f00b232459 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -290,6 +290,16 @@ bool input_driver_grab_mouse(bool state) return false; } +bool input_driver_grab_stdin(void) +{ + driver_t *driver = driver_get_ptr(); + const input_driver_t *input = input_get_ptr(driver); + + if (input->grab_stdin) + return input->grab_stdin(driver->input_data); + return false; +} + void *input_driver_init(void) { driver_t *driver = driver_get_ptr(); diff --git a/input/input_driver.h b/input/input_driver.h index 374d158548..604467d032 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -72,6 +72,7 @@ typedef struct input_driver const char *ident; void (*grab_mouse)(void *data, bool state); + bool (*grab_stdin)(void *data); bool (*set_rumble)(void *data, unsigned port, enum retro_rumble_effect effect, uint16_t state); const input_device_driver_t *(*get_joypad_driver)(void *data); @@ -151,6 +152,8 @@ const input_device_driver_t * input_driver_get_joypad_driver(void); bool input_driver_grab_mouse(bool state); +bool input_driver_grab_stdin(void); + void *input_driver_init(void); void input_driver_free(void);