84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync/* $Id$ */
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync/** @file
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * Support Library Testcase - Ring-3 Semaphore interface.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync */
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2009-2012 Oracle Corporation
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync *
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * available from http://www.virtualbox.org. This file is free software;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * you can redistribute it and/or modify it under the terms of the GNU
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * General Public License (GPL) as published by the Free Software
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync *
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * The contents of this file may alternatively be used under the terms
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * of the Common Development and Distribution License Version 1.0
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * VirtualBox OSE distribution, in which case the provisions of the
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * CDDL are applicable instead of those of the GPL.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync *
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * You may elect to license modified versions of this file under the
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * terms and conditions of either the GPL or the CDDL or both.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync */
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync/*******************************************************************************
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync* Header Files *
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync*******************************************************************************/
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync#include <VBox/sup.h>
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync#include <VBox/param.h>
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync#include <iprt/err.h>
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync#include <iprt/initterm.h>
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#include <iprt/message.h>
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync#include <iprt/stream.h>
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync#include <iprt/test.h>
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync#include <iprt/thread.h>
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync#include <iprt/process.h>
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync#include <iprt/env.h>
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync#include <iprt/string.h>
b72d3233df38e3122eda39b39a27b35c27209615vboxsync#include <iprt/time.h>
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync/*******************************************************************************
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync* Structures and Typedefs *
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync*******************************************************************************/
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsyncstatic PSUPDRVSESSION g_pSession;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsyncstatic RTTEST g_hTest;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsyncstatic uint32_t g_cMillies; /* Used by the interruptible tests. */
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsyncstatic DECLCALLBACK(int) tstSupSemInterruptibleSRE(RTTHREAD hSelf, void *pvUser)
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync{
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync SUPSEMEVENT hEvent = (SUPSEMEVENT)pvUser;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadUserSignal(hSelf);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync return SUPSemEventWaitNoResume(g_pSession, hEvent, g_cMillies);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync}
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsyncstatic DECLCALLBACK(int) tstSupSemInterruptibleMRE(RTTHREAD hSelf, void *pvUser)
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync{
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync SUPSEMEVENTMULTI hEventMulti = (SUPSEMEVENTMULTI)pvUser;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadUserSignal(hSelf);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync return SUPSemEventMultiWaitNoResume(g_pSession, hEventMulti, g_cMillies);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync}
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsyncint main(int argc, char **argv)
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync{
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync bool fSys = true;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync bool fGip = false;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync fGip = true;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync#endif
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync /*
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * Init.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync if (RT_FAILURE(rc))
230bd8589bba39933ac5ec21482d6186d675e604vboxsync return RTMsgInitFailure(rc);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync if (argc == 2 && !strcmp(argv[1], "child"))
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync {
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTThreadSleep(300);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync return 0;
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync }
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTEST hTest;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync rc = RTTestCreate("tstSupSem", &hTest);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync if (RT_FAILURE(rc))
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync {
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTPrintf("tstSupSem: fatal error: RTTestCreate failed with rc=%Rrc\n", rc);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync return 1;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync }
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync g_hTest = hTest;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync PSUPDRVSESSION pSession;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync rc = SUPR3Init(&pSession);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync if (RT_FAILURE(rc))
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync {
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTestFailed(hTest, "SUPR3Init failed with rc=%Rrc\n", rc);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync return RTTestSummaryAndDestroy(hTest);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync }
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync g_pSession = pSession;
0368e9c310393e82ef37c480b6acbd0f107cf0edvboxsync RTTestBanner(hTest);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync /*
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * Basic API checks.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync */
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTestSub(hTest, "Single Release Event (SRE) API");
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync SUPSEMEVENT hEvent = NIL_SUPSEMEVENT;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 0), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 1), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 2), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 8), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent,20), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 0), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 1), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 2), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 8), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 20), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent,1000),VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 0), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 0), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 1), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 2), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent, 8), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventWaitNoResume(pSession, hEvent,20), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VERR_INVALID_HANDLE);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, NIL_SUPSEMEVENT), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTestSub(hTest, "Multiple Release Event (MRE) API");
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync SUPSEMEVENTMULTI hEventMulti = NIL_SUPSEMEVENT;
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 1), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 2), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 8), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti,20), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiSignal(pSession, hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 1), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 2), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 8), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti,20), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti,1000), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiSignal(pSession, hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiSignal(pSession, hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiReset(pSession, hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 1), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 2), VERR_TIMEOUT);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 8), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti,20), VERR_TIMEOUT);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiSignal(pSession, hEventMulti), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 0), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 1), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 2), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 8), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti, 20), VINF_SUCCESS);
d1c36fd86d36726777e3d6f9d040573e0aaf30devboxsync RTTESTI_CHECK_RC(SUPSemEventMultiWaitNoResume(pSession, hEventMulti,1000), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEventMulti), VINF_OBJECT_DESTROYED);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEventMulti), VERR_INVALID_HANDLE);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, NIL_SUPSEMEVENTMULTI), VINF_SUCCESS);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync#if !defined(RT_OS_OS2) && !defined(RT_OS_WINDOWS)
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTestSub(hTest, "SRE Interruptibility");
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync g_cMillies = RT_INDEFINITE_WAIT;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTHREAD hThread = NIL_RTTHREAD;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleSRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadSleep(120);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadPoke(hThread);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync int rcThread = VINF_SUCCESS;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync g_cMillies = 120*1000;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync hThread = NIL_RTTHREAD;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleSRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTThreadSleep(120);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTThreadPoke(hThread);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync rcThread = VINF_SUCCESS;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTestSub(hTest, "MRE Interruptibility");
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEventMulti), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync g_cMillies = RT_INDEFINITE_WAIT;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync hThread = NIL_RTTHREAD;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleMRE, (void *)hEventMulti, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntMRE"), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadSleep(120);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTThreadPoke(hThread);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync rcThread = VINF_SUCCESS;
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEventMulti), VINF_OBJECT_DESTROYED);
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEventMulti), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync g_cMillies = 120*1000;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync hThread = NIL_RTTHREAD;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleMRE, (void *)hEventMulti, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntMRE"), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTThreadSleep(120);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTThreadPoke(hThread);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync rcThread = VINF_SUCCESS;
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEventMulti), VINF_OBJECT_DESTROYED);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync /*
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync * Fork test.
b72d3233df38e3122eda39b39a27b35c27209615vboxsync * Spawn a thread waiting for an event, then spawn a new child process (of
b72d3233df38e3122eda39b39a27b35c27209615vboxsync * ourselves) and make sure that this does not alter the intended behaviour
5981e6935987b08737b730b63a41acc1dd696377vboxsync * of our event semaphore implementation (see @bugref{5090}).
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync */
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTestSub(hTest, "SRE Process Spawn");
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync hThread = NIL_RTTHREAD;
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync g_cMillies = 120*1000;
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleSRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync const char *apszArgs[3] = { argv[0], "child", NULL };
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTPROCESS Process = NIL_RTPROCESS;
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTThreadSleep(250);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(RTProcCreate(apszArgs[0], apszArgs, RTENV_DEFAULT, 0, &Process), VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTThreadSleep(250);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(SUPSemEventSignal(pSession, hEvent), VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync rcThread = VERR_GENERAL_FAILURE;
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 120*1000, &rcThread), VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(rcThread, VINF_SUCCESS);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
39c2eccedfdb7455c52225543c355e33a65f0c81vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTestSub(hTest, "MRE Process Spawn");
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync hThread = NIL_RTTHREAD;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync g_cMillies = 120*1000;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleMRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
b35e3948f1287430503b6b432945b8cf4bfd3a23vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTHREAD hThread2 = NIL_RTTHREAD;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(RTThreadCreate(&hThread2, tstSupSemInterruptibleMRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync Process = NIL_RTPROCESS;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTThreadSleep(250);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(RTProcCreate(apszArgs[0], apszArgs, RTENV_DEFAULT, 0, &Process), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTThreadSleep(250);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiSignal(pSession, hEvent), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync rcThread = VERR_GENERAL_FAILURE;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread, 120*1000, &rcThread), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(rcThread, VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync int rcThread2 = VERR_GENERAL_FAILURE;
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(RTThreadWait(hThread2, 120*1000, &rcThread2), VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(rcThread2, VINF_SUCCESS);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
d8dee9a7ef33d4c705d5fd087d5af9c7cb071f85vboxsync
0612e2adbcc146b9eb7748983c720e35e38d0dc9vboxsync#endif /* !OS2 && !WINDOWS */
e2a73964f463b9e91f6f096f9e15974a3edcc416vboxsync
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync#define LOOP_COUNT 20
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync static unsigned const s_acMsIntervals[] = { 0, 1, 2, 3, 4, 8, 10, 16, 32 };
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "SRE Timeout Accuracy (ms)");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cMs = s_acMsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventWaitNoResume(pSession, hEvent, cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cMs=%u", rcX, cLoops, cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%u ms min (clock=sys)", cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%u ms avg (clock=sys)", cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%u ms min (clock=gip)", cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%u ms avg (clock=gip)", cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync }
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "MRE Timeout Accuracy (ms)");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acMsIntervals); i++)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cMs = s_acMsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventMultiWaitNoResume(pSession, hEvent, cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cMs=%u", rcX, cLoops, cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%u ms min (clock=sys)", cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%u ms avg (clock=sys)", cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%u ms min (clock=gip)", cMs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%u ms avg (clock=gip)", cMs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync }
683eff3070b1b86fe71b71af7fda82766ea19d17vboxsync
b72d3233df38e3122eda39b39a27b35c27209615vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync static uint32_t const s_acNsIntervals[] =
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync 0, 1000, 5000, 15000, 30000, 50000, 100000, 250000, 500000, 750000, 900000, 1500000, 2200000
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync };
b72d3233df38e3122eda39b39a27b35c27209615vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "SUPSemEventWaitNsRelIntr Accuracy");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestValueF(hTest, SUPSemEventGetResolution(pSession), RTTESTUNIT_NS, "SRE resolution");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNs = s_acNsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventWaitNsRelIntr(pSession, hEvent, cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cNs=%u", rcX, cLoops, cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%'u ns min (clock=sys)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%'u ns min (clock=gip)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=gip)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "SUPSemEventMultiWaitNsRelIntr Accuracy");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestValueF(hTest, SUPSemEventMultiGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNs = s_acNsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventMultiWaitNsRelIntr(pSession, hEvent, cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cNs=%u", rcX, cLoops, cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%'u ns min (clock=sys)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%'u ns min (clock=gip)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=gip)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "SUPSemEventWaitNsAbsIntr Accuracy");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestValueF(hTest, SUPSemEventGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNs = s_acNsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t uAbsDeadline = (fGip ? u64Start : u64StartSys) + cNs;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventWaitNsAbsIntr(pSession, hEvent, uAbsDeadline);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cNs=%u", rcX, cLoops, cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%'u ns min (clock=sys)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%'u ns min (clock=gip)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=gip)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (RTTestErrorCount(hTest) == 0)
b72d3233df38e3122eda39b39a27b35c27209615vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestSub(hTest, "SUPSemEventMultiWaitNsAbsIntr Accuracy");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTestValueF(hTest, SUPSemEventMultiGetResolution(pSession), RTTESTUNIT_NS, "MRE resolution");
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEvent), VINF_SUCCESS);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync uint32_t cInterrupted = 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_acNsIntervals); i++)
b72d3233df38e3122eda39b39a27b35c27209615vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNs = s_acNsIntervals[i];
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMinSys = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsMin = UINT64_MAX;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotalSys= 0;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsTotal = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync unsigned cLoops = 0;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync while (cLoops < LOOP_COUNT)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64StartSys = RTTimeSystemNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t u64Start = RTTimeNanoTS();
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t uAbsDeadline = (fGip ? u64Start : u64StartSys) + cNs;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync int rcX = SUPSemEventMultiWaitNsAbsIntr(pSession, hEvent, uAbsDeadline);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsedSys = RTTimeSystemNanoTS() - u64StartSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync uint64_t cNsElapsed = RTTimeNanoTS() - u64Start;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX == VERR_INTERRUPTED)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cInterrupted++;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync continue; /* retry */
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync }
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync if (rcX != VERR_TIMEOUT)
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestFailed(hTest, "%Rrc cLoops=%u cNs=%u", rcX, cLoops, cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsedSys < cNsMinSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMinSys = cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (cNsElapsed < cNsMin)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsMin = cNsElapsed;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotalSys += cNsElapsedSys;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync cNsTotal += cNsElapsed;
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync cLoops++;
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fSys)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMinSys, RTTESTUNIT_NS, "%'u ns min (clock=sys)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotalSys / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=sys)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync if (fGip)
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync {
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsMin, RTTESTUNIT_NS, "%'u ns min (clock=gip)", cNs);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cNsTotal / cLoops, RTTESTUNIT_NS, "%'u ns avg (clock=gip)", cNs);
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync }
b72d3233df38e3122eda39b39a27b35c27209615vboxsync }
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync
9b456547aefb8a2e8f5600eba9ec377dbc9b4475vboxsync RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
6d41476175401a18893ea8cb8a40d125eefa04f3vboxsync RTTestValueF(hTest, cInterrupted, RTTESTUNIT_OCCURRENCES, "VERR_INTERRUPTED returned", cInterrupted);
b72d3233df38e3122eda39b39a27b35c27209615vboxsync }
b72d3233df38e3122eda39b39a27b35c27209615vboxsync
b72d3233df38e3122eda39b39a27b35c27209615vboxsync }
b72d3233df38e3122eda39b39a27b35c27209615vboxsync
b72d3233df38e3122eda39b39a27b35c27209615vboxsync
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync /*
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync * Done.
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync */
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync return RTTestSummaryAndDestroy(hTest);
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync}
84f746c9015f34e9ab096b87e063d0d6ab7fc7aevboxsync