* THE SOFTWARE.
*/
#include <windows.h>
+#include <mmsystem.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <sys/time.h>
#include "config-host.h"
-#include "sysemu.h"
+#include "sysemu/sysemu.h"
#include "qemu-options.h"
/***********************************************************/
char *string = g_malloc(length);
snprintf(string, length, "%s=%s", name, value);
result = putenv(string);
+
+ /* Windows takes a copy and does not continue to use our string.
+ * Therefore it can be safely freed on this platform. POSIX code
+ * typically has to leak the string because according to the spec it
+ * becomes part of the environment.
+ */
+ g_free(string);
}
return result;
}
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
{
- exit(STATUS_CONTROL_C_EXIT);
+ qemu_system_shutdown_request();
+ /* Windows 7 kills application when the function returns.
+ Sleep here to give QEMU a try for closing.
+ Sleep period is 10000ms because Windows kills the program
+ after 10 seconds anyway. */
+ Sleep(10000);
+
return TRUE;
}
+#ifdef CONFIG_MARU
void os_setup_early_signal_handling(void)
{
- /* Note: cpu_interrupt() is currently not SMP safe, so we force
- QEMU to run on a single CPU */
- HANDLE h;
- DWORD_PTR mask, smask;
- int i;
-
SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
+}
+#else
+static TIMECAPS mm_tc;
- h = GetCurrentProcess();
- if (GetProcessAffinityMask(h, &mask, &smask)) {
- for(i = 0; i < 32; i++) {
- if (mask & (1 << i))
- break;
- }
- if (i != 32) {
- mask = 1 << i;
- SetProcessAffinityMask(h, mask);
- }
- }
+static void os_undo_timer_resolution(void)
+{
+ timeEndPeriod(mm_tc.wPeriodMin);
}
+void os_setup_early_signal_handling(void)
+{
+ SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
+ timeGetDevCaps(&mm_tc, sizeof(mm_tc));
+ timeBeginPeriod(mm_tc.wPeriodMin);
+ atexit(os_undo_timer_resolution);
+}
+#endif /* CONFIG_MARU */
+
/* Look for support files in the same directory as the executable. */
char *os_find_datadir(const char *argv0)
{
OVERLAPPED overlap;
BOOL ret;
memset(&overlap, 0, sizeof(overlap));
-
+#ifndef CONFIG_MARU
+ file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL,
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+#else
file = CreateFile(g_win32_locale_filename_from_utf8(filename), GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-
+#endif
if (file == INVALID_HANDLE_VALUE) {
return -1;
}
}
return 0;
}
-
-int qemu_get_thread_id(void)
-{
- return GetCurrentThreadId();
-}