semevent-r0drv-linux.c revision 2045498c3a1635533d5319d1086f78d90331b0c6
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/* $Id$ */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** @file
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync * IPRT - Single Release Event Semaphores, Ring-0 Driver, Linux.
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * available from http://www.virtualbox.org. This file is free software;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * General Public License (GPL) as published by the Free Software
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * The contents of this file may alternatively be used under the terms
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * of the Common Development and Distribution License Version 1.0
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * VirtualBox OSE distribution, in which case the provisions of the
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync * CDDL are applicable instead of those of the GPL.
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync *
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync * You may elect to license modified versions of this file under the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * terms and conditions of either the GPL or the CDDL or both.
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync * additional information or have any questions.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync
b450d7a1747c5f4fb7c917a8ec1f9ce8440d7ffevboxsync/*******************************************************************************
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync* Header Files *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync*******************************************************************************/
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include "the-linux-kernel.h"
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include <iprt/semaphore.h>
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include <iprt/alloc.h>
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include <iprt/assert.h>
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include <iprt/asm.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <iprt/err.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include "internal/magics.h"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/*******************************************************************************
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync* Structures and Typedefs *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync*******************************************************************************/
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Linux event semaphore.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct RTSEMEVENTINTERNAL
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Magic value (RTSEMEVENT_MAGIC). */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t volatile u32Magic;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** The object status - !0 when signaled and 0 when reset. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t volatile fState;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** The wait queue. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync wait_queue_head_t Head;
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync} RTSEMEVENTINTERNAL, *PRTSEMEVENTINTERNAL;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncRTDECL(int) RTSemEventCreate(PRTSEMEVENT pEventSem)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
6a795f9e75e30c7f1d75cd45e5de233c71662f58vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)RTMemAlloc(sizeof(*pEventInt));
543fd530ce618a1b55531ea76a785c7add7d072cvboxsync if (pEventInt)
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync {
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync pEventInt->u32Magic = RTSEMEVENT_MAGIC;
6a795f9e75e30c7f1d75cd45e5de233c71662f58vboxsync pEventInt->fState = 0;
6a795f9e75e30c7f1d75cd45e5de233c71662f58vboxsync init_waitqueue_head(&pEventInt->Head);
6a795f9e75e30c7f1d75cd45e5de233c71662f58vboxsync *pEventSem = pEventInt;
6a795f9e75e30c7f1d75cd45e5de233c71662f58vboxsync return VINF_SUCCESS;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_NO_MEMORY;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync}
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncRTDECL(int) RTSemEventDestroy(RTSEMEVENT EventSem)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Validate input.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)EventSem;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (!pEventInt)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (pEventInt->u32Magic != RTSEMEVENT_MAGIC)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync AssertMsgFailed(("pEventInt->u32Magic=%RX32 pEventInt=%p\n", pEventInt->u32Magic, pEventInt));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Invalidate it and signal the object just in case.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync ASMAtomicIncU32(&pEventInt->u32Magic);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync ASMAtomicXchgU32(&pEventInt->fState, 0);
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync Assert(!waitqueue_active(&pEventInt->Head));
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync wake_up_all(&pEventInt->Head);
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync RTMemFree(pEventInt);
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync return VINF_SUCCESS;
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync}
75ef08b33f9c67a8dd50748ece1117aed8098d51vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsyncRTDECL(int) RTSemEventSignal(RTSEMEVENT EventSem)
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync{
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync /*
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync * Validate input.
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync */
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)EventSem;
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync if (!pEventInt)
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync return VERR_INVALID_PARAMETER;
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync if ( !pEventInt
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync || pEventInt->u32Magic != RTSEMEVENT_MAGIC)
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync {
152d786a21a506f9e2a2e16ba8efdc2bcae133abvboxsync AssertMsgFailed(("pEventInt->u32Magic=%RX32 pEventInt=%p\n", pEventInt ? pEventInt->u32Magic : 0, pEventInt));
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync return VERR_INVALID_PARAMETER;
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync }
46a78ba0ce1d037aaed54f3df16ebd9c0b70ed39vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Signal the event object.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync ASMAtomicXchgU32(&pEventInt->fState, 1);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync wake_up(&pEventInt->Head);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VINF_SUCCESS;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync}
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Worker for RTSemEvent and RTSemEventNoResume.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @returns VBox status code.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pEventInt The event semaphore.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param cMillies The number of milliseconds to wait.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param fInterruptible Whether it's an interruptible wait or not.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncstatic int rtSemEventWait(PRTSEMEVENTINTERNAL pEventInt, unsigned cMillies, bool fInterruptible)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Ok wait for it.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DEFINE_WAIT(Wait);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int rc = VINF_SUCCESS;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync long lTimeout = cMillies == RT_INDEFINITE_WAIT ? MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(cMillies);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#ifdef IPRT_DEBUG_SEMS
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync snprintf(current->comm, TASK_COMM_LEN, "e%lx", IPRT_DEBUG_SEMS_ADDRESS(pEventInt));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#endif
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync for (;;)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* make everything thru schedule() atomic scheduling wise. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync prepare_to_wait(&pEventInt->Head, &Wait, fInterruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* check the condition. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (ASMAtomicCmpXchgU32(&pEventInt->fState, 0, 1))
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync break;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* check for pending signals. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (fInterruptible && signal_pending(current))
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync rc = VERR_INTERRUPTED;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync break;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* wait */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync lTimeout = schedule_timeout(lTimeout);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Check if someone destroyed the semaphore while we were waiting. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (pEventInt->u32Magic != RTSEMEVENT_MAGIC)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync rc = VERR_SEM_DESTROYED;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync break;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* check for timeout. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (!lTimeout)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync rc = VERR_TIMEOUT;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync break;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync finish_wait(&pEventInt->Head, &Wait);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#ifdef IPRT_DEBUG_SEMS
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync snprintf(current->comm, TASK_COMM_LEN, "e%lx:%d", IPRT_DEBUG_SEMS_ADDRESS(pEventInt), rc);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#endif
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return rc;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync}
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncRTDECL(int) RTSemEventWait(RTSEMEVENT EventSem, unsigned cMillies)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)EventSem;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (!pEventInt)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if ( !pEventInt
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync || pEventInt->u32Magic != RTSEMEVENT_MAGIC)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync AssertMsgFailed(("pEventInt->u32Magic=%RX32 pEventInt=%p\n", pEventInt ? pEventInt->u32Magic : 0, pEventInt));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (ASMAtomicCmpXchgU32(&pEventInt->fState, 0, 1))
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VINF_SUCCESS;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return rtSemEventWait(pEventInt, cMillies, false /* fInterruptible */);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync}
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncRTDECL(int) RTSemEventWaitNoResume(RTSEMEVENT EventSem, unsigned cMillies)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)EventSem;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (!pEventInt)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if ( !pEventInt
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync || pEventInt->u32Magic != RTSEMEVENT_MAGIC)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync AssertMsgFailed(("pEventInt->u32Magic=%RX32 pEventInt=%p\n", pEventInt ? pEventInt->u32Magic : 0, pEventInt));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VERR_INVALID_PARAMETER;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync }
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync if (ASMAtomicCmpXchgU32(&pEventInt->fState, 0, 1))
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return VINF_SUCCESS;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync return rtSemEventWait(pEventInt, cMillies, true /* fInterruptible */);
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync}
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync