Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/tests/Makefile.am | 2 + server/tests/meson.build | 2 + server/tests/test-channel.c | 1 + server/tests/test-loop.c | 1 + server/tests/test-stream-device.c | 1 + server/tests/win-alarm.c | 65 +++++++++++++++++++++++++++++++ server/tests/win-alarm.h | 26 +++++++++++++ 7 files changed, 98 insertions(+) create mode 100644 server/tests/win-alarm.c create mode 100644 server/tests/win-alarm.h diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am index d7f7af9ba..7668739ff 100644 --- a/server/tests/Makefile.am +++ b/server/tests/Makefile.am @@ -35,6 +35,8 @@ libtest_a_SOURCES = \ test-display-base.h \ test-glib-compat.c \ test-glib-compat.h \ + win-alarm.c \ + win-alarm.h \ $(NULL) LDADD = \ diff --git a/server/tests/meson.build b/server/tests/meson.build index 205482130..31febc6ac 100644 --- a/server/tests/meson.build +++ b/server/tests/meson.build @@ -11,6 +11,8 @@ test_lib_sources = [ 'test-display-base.h', 'test-glib-compat.c', 'test-glib-compat.h', + 'win-alarm.c', + 'win-alarm.h', ] test_libs = [] diff --git a/server/tests/test-channel.c b/server/tests/test-channel.c index 9700e31c1..fcea98aa2 100644 --- a/server/tests/test-channel.c +++ b/server/tests/test-channel.c @@ -28,6 +28,7 @@ #include "red-client.h" #include "cursor-channel.h" #include "net-utils.h" +#include "win-alarm.h" /* * Declare a RedTestChannel to be used for the test diff --git a/server/tests/test-loop.c b/server/tests/test-loop.c index 1e3b39e53..82af80ab3 100644 --- a/server/tests/test-loop.c +++ b/server/tests/test-loop.c @@ -31,6 +31,7 @@ #include <spice/macros.h> #include <common/log.h> #include "basic-event-loop.h" +#include "win-alarm.h" static SpiceCoreInterface *core = NULL; static GMainLoop *loop = NULL; diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c index ce37822f7..f5698c7d5 100644 --- a/server/tests/test-stream-device.c +++ b/server/tests/test-stream-device.c @@ -33,6 +33,7 @@ #include "test-glib-compat.h" #include "stream-channel.h" #include "reds.h" +#include "win-alarm.h" static SpiceCharDeviceInstance vmc_instance; diff --git a/server/tests/win-alarm.c b/server/tests/win-alarm.c new file mode 100644 index 000000000..225d07097 --- /dev/null +++ b/server/tests/win-alarm.c @@ -0,0 +1,65 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (C) 2018 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#include <config.h> +#include <glib.h> + +#ifdef _WIN32 +#include <windows.h> +#include "win-alarm.h" + +static HANDLE alarm_cond = NULL; + +static DWORD WINAPI alarm_thread_proc(LPVOID arg) +{ + unsigned int timeout = (uintptr_t) arg; + switch (WaitForSingleObject(alarm_cond, timeout * 1000)) { + case WAIT_OBJECT_0: + return 0; + } + abort(); + return 0; +} + +void alarm(unsigned int timeout) +{ + static HANDLE thread = NULL; + + // create an event to stop the alarm thread + if (alarm_cond == NULL) { + alarm_cond = CreateEvent(NULL, TRUE, FALSE, NULL); + g_assert(alarm_cond != NULL); + } + + // stop old alarm + if (thread) { + SetEvent(alarm_cond); + g_assert(WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0); + CloseHandle(thread); + thread = NULL; + } + + if (timeout) { + ResetEvent(alarm_cond); + + // start alarm thread + thread = CreateThread(NULL, 0, alarm_thread_proc, (LPVOID) (uintptr_t) timeout, 0, NULL); + g_assert(thread); + } +} +#endif diff --git a/server/tests/win-alarm.h b/server/tests/win-alarm.h new file mode 100644 index 000000000..a7233a8f7 --- /dev/null +++ b/server/tests/win-alarm.h @@ -0,0 +1,26 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (C) 2018 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef TEST_WIN_ALARM_H +#define TEST_WIN_ALARM_H + +#ifdef _WIN32 +void test_alarm(unsigned int timeout); +#define alarm test_alarm +#endif + +#endif // TEST_WIN_ALARM_H -- 2.20.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel