Index: /trunk/src/VBox/Runtime/generic/timer-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/timer-generic.cpp	(revision 42234)
+++ /trunk/src/VBox/Runtime/generic/timer-generic.cpp	(revision 42235)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2007 Oracle Corporation
+ * Copyright (C) 2006-2012 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -159,21 +159,16 @@
 
     /*
-     * If the timer is active, we just flag it to self destruct on the next tick.
-     * If it's suspended we can safely set the destroy flag and signal it.
+     * If the timer is active, we stop and destruct it in one go, to avoid
+     * unnecessary waiting for the next tick. If it's suspended we can safely
+     * set the destroy flag and signal it.
      */
     RTTHREAD Thread = pTimer->Thread;
     if (!pTimer->fSuspended)
-    {
         ASMAtomicXchgU8(&pTimer->fSuspended, true);
-        ASMAtomicXchgU8(&pTimer->fDestroyed, true);
-    }
-    else
-    {
-        ASMAtomicXchgU8(&pTimer->fDestroyed, true);
-        int rc = RTSemEventSignal(pTimer->Event);
-        if (rc == VERR_ALREADY_POSTED)
-            rc = VINF_SUCCESS;
-        AssertRC(rc);
-    }
+    ASMAtomicXchgU8(&pTimer->fDestroyed, true);
+    int rc = RTSemEventSignal(pTimer->Event);
+    if (rc == VERR_ALREADY_POSTED)
+        rc = VINF_SUCCESS;
+    AssertRC(rc);
 
     RTThreadWait(Thread, 250, NULL);
Index: /trunk/src/VBox/Runtime/generic/timerlr-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/timerlr-generic.cpp	(revision 42234)
+++ /trunk/src/VBox/Runtime/generic/timerlr-generic.cpp	(revision 42235)
@@ -8,5 +8,5 @@
 
 /*
- * Copyright (C) 2006-2008 Oracle Corporation
+ * Copyright (C) 2006-2012 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -154,23 +154,18 @@
 
     /*
-     * If the timer is active, we just flag it to self destruct on the next tick.
-     * If it's suspended we can safely set the destroy flag and signal it.
+     * If the timer is active, we stop and destruct it in one go, to avoid
+     * unnecessary waiting for the next tick. If it's suspended we can safely
+     * set the destroy flag and signal it.
      */
     RTTHREAD hThread = pThis->hThread;
     if (!pThis->fSuspended)
-    {
         ASMAtomicWriteBool(&pThis->fSuspended, true);
-        ASMAtomicWriteBool(&pThis->fDestroyed, true);
-    }
-    else
-    {
-        ASMAtomicWriteBool(&pThis->fDestroyed, true);
-        int rc = RTSemEventSignal(pThis->hEvent);
-        if (rc == VERR_ALREADY_POSTED)
-            rc = VINF_SUCCESS;
-        AssertRC(rc);
-    }
-
-    RTThreadWait(hThread, 500, NULL); /* 250 ms was not enough for valgrind! */
+    ASMAtomicWriteBool(&pThis->fDestroyed, true);
+    int rc = RTSemEventSignal(pThis->hEvent);
+    if (rc == VERR_ALREADY_POSTED)
+        rc = VINF_SUCCESS;
+    AssertRC(rc);
+
+    RTThreadWait(hThread, 250, NULL);
     return VINF_SUCCESS;
 }
