X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=os-win32.c;h=b6652af7f3fb596217828d7786fea6a6005d774f;hb=e0e8384dd471376c3f815c3070f161480a28cc90;hp=aefc535ed0a09c1d42e23900a5f84eb377c7c348;hpb=59a5264b994343f01d19faf95c0e5df70346ded8;p=qemu.git diff --git a/os-win32.c b/os-win32.c index aefc535ed..b6652af7f 100644 --- a/os-win32.c +++ b/os-win32.c @@ -33,6 +33,21 @@ #include "sysemu.h" #include "qemu-options.h" +/***********************************************************/ +/* Functions missing in mingw */ + +int setenv(const char *name, const char *value, int overwrite) +{ + int result = 0; + if (overwrite || !getenv(name)) { + size_t length = strlen(name) + strlen(value) + 2; + char *string = qemu_malloc(length); + snprintf(string, length, "%s=%s", name, value); + result = putenv(string); + } + return result; +} + /***********************************************************/ /* Polling handling */ @@ -125,7 +140,9 @@ void os_host_main_loop_wait(int *timeout) int err; WaitObjects *w = &wait_objects; + qemu_mutex_unlock_iothread(); ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout); + qemu_mutex_lock_iothread(); if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) { if (w->func[ret - WAIT_OBJECT_0]) w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]); @@ -165,7 +182,7 @@ 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 mask, smask; + DWORD_PTR mask, smask; int i; SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE); @@ -206,6 +223,12 @@ char *os_find_datadir(const char *argv0) return NULL; } +void os_set_line_buffering(void) +{ + setbuf(stdout, NULL); + setbuf(stderr, NULL); +} + /* * Parse OS specific command line options. * return 0 if option handled, -1 otherwise @@ -214,3 +237,37 @@ void os_parse_cmd_args(int index, const char *optarg) { return; } + +void os_pidfile_error(void) +{ + fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno)); +} + +int qemu_create_pidfile(const char *filename) +{ + char buffer[128]; + int len; + HANDLE file; + OVERLAPPED overlap; + BOOL ret; + memset(&overlap, 0, sizeof(overlap)); + + file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + if (file == INVALID_HANDLE_VALUE) { + return -1; + } + len = snprintf(buffer, sizeof(buffer), FMT_pid "\n", getpid()); + ret = WriteFileEx(file, (LPCVOID)buffer, (DWORD)len, + &overlap, NULL); + if (ret == 0) { + return -1; + } + return 0; +} + +int qemu_get_thread_id(void) +{ + return GetCurrentThreadId(); +}