semevent-r0drv-solaris.c revision d10ad42fb05bd7b430357b2cf30fd9a367c2b7d1
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * innotek Portable Runtime - Semaphores, Ring-0 Driver, Solaris.
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * Copyright (C) 2006-2007 innotek GmbH
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * available from http://www.virtualbox.org. This file is free software;
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * General Public License as published by the Free Software Foundation,
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync/*******************************************************************************
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync* Header Files *
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync*******************************************************************************/
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync/*******************************************************************************
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync* Structures and Typedefs *
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync*******************************************************************************/
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync * Solaris event semaphore.
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** Magic value (RTSEMEVENT_MAGIC). */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** The number of waiting threads. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** Set if the event object is signaled. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** The number of threads in the process of waking up. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** The Solaris mutex protecting this structure and pairing up the with the cv. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /** The Solaris condition variable. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync Assert(sizeof(RTSEMEVENTINTERNAL) > sizeof(void *));
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)RTMemAlloc(sizeof(*pEventInt));
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync mutex_init(&pEventInt->Mtx, "IPRT Event Semaphore", MUTEX_DRIVER, NULL);
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync cv_init(&pEventInt->Cnd, "IPRT CV", CV_DRIVER, NULL);
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync PRTSEMEVENTINTERNAL pEventInt = (PRTSEMEVENTINTERNAL)EventSem;
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync AssertMsgReturn(pEventInt->u32Magic == RTSEMEVENT_MAGIC,
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync ("pEventInt=%p u32Magic=%#x\n", pEventInt, pEventInt->u32Magic),
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync ASMAtomicIncU32(&pEventInt->u32Magic); /* make the handle invalid */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /* abort waiting thread, last man cleans up. */
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync ASMAtomicXchgU32(&pEventInt->cWaking, pEventInt->cWaking + pEventInt->cWaiters);
b0dfb334954c0552bb583967a3077ec88fd00471vboxsync /* the last waking thread is gonna do the cleanup */
return VINF_SUCCESS;
return VINF_SUCCESS;
int rc;
int cTicks;
unsigned long timeout;
cTicks = 0;
if (fInterruptible)
if (rc > 0)
return rc;
return rc;