Paolo, Just a heads up, I tried the patched qemu (1+2+3) on my laptop at home, which is running Windows 7 64-bit. I'm seeing qemu "lockups" appearing randomly.. Will try to debug it. On the other hand, plain vanilla 1.4.0 in Windows 7 seems to run fine with my VxWorks image..
Regards Jacob On Wed, Feb 20, 2013 at 2:43 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > These are needed for any of the Win32 alarm timer implementations. > They are not tied to mmtimer exclusively. > > Jacob tested this patch with both mmtimer and Win32 timers. > > Cc: qemu-sta...@nongnu.org > Tested-by: Jacob Kroon <jacob.kr...@gmail.com> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > Jacob, this is the same as "patch 1" you tested. > > os-win32.c | 10 ++++++++++ > qemu-timer.c | 26 ++++++-------------------- > 2 files changed, 16 insertions(+), 20 deletions(-) > > diff --git a/os-win32.c b/os-win32.c > index 3d43604..a0740ef 100644 > --- a/os-win32.c > +++ b/os-win32.c > @@ -23,6 +23,7 @@ > * THE SOFTWARE. > */ > #include <windows.h> > +#include <mmsystem.h> > #include <unistd.h> > #include <fcntl.h> > #include <signal.h> > @@ -67,9 +67,19 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type) > return TRUE; > } > > +static TIMECAPS mm_tc; > + > +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); > } > > /* Look for support files in the same directory as the executable. */ > diff --git a/qemu-timer.c b/qemu-timer.c > index 8fb5c75..50109a1 100644 > --- a/qemu-timer.c > +++ b/qemu-timer.c > @@ -623,29 +622,15 @@ static void CALLBACK mm_alarm_handler(UINT uTimerID, > UINT uMsg, > > static int mm_start_timer(struct qemu_alarm_timer *t) > { > timeGetDevCaps(&mm_tc, sizeof(mm_tc)); > - > - timeBeginPeriod(mm_tc.wPeriodMin); > - > - mm_timer = timeSetEvent(mm_tc.wPeriodMin, /* interval (ms) */ > - mm_tc.wPeriodMin, /* resolution */ > - mm_alarm_handler, /* function */ > - (DWORD_PTR)t, /* parameter */ > - TIME_ONESHOT | TIME_CALLBACK_FUNCTION); > - > - if (!mm_timer) { > - fprintf(stderr, "Failed to initialize win32 alarm timer\n"); > - timeEndPeriod(mm_tc.wPeriodMin); > - return -1; > - } > - > return 0; > } > > static void mm_stop_timer(struct qemu_alarm_timer *t) > { > - timeKillEvent(mm_timer); > - timeEndPeriod(mm_tc.wPeriodMin); > + if (mm_timer) { > + timeKillEvent(mm_timer); > + } > } > > static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta) > @@ -657,7 +641,9 @@ static void mm_rearm_timer(struct qemu_alarm_timer *t, > int64_t delta) > nearest_delta_ms = mm_tc.wPeriodMax; > } > > - timeKillEvent(mm_timer); > + if (mm_timer) { > + timeKillEvent(mm_timer); > + } > mm_timer = timeSetEvent((UINT)nearest_delta_ms, > mm_tc.wPeriodMin, > mm_alarm_handler, > -- > 1.8.1.2 > -- -- Jacob