semfastmutex-r0drv-solaris.c revision e7e8a6cb1597db3e0a1a83733e1d90e7a1688647
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/* $Id$ */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/** @file
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * innotek Portable Runtime - Fast Mutex Semaphores, Ring-0 Driver, Solaris.
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/*
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * Copyright (C) 2006-2007 innotek GmbH
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync *
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * available from http://www.virtualbox.org. This file is free software;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * General Public License as published by the Free Software Foundation,
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/*******************************************************************************
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync* Header Files *
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync*******************************************************************************/
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include "the-solaris-kernel.h"
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <iprt/semaphore.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <iprt/err.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <iprt/alloc.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <iprt/assert.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <iprt/asm.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include "internal/magics.h"
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/*******************************************************************************
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync* Structures and Typedefs *
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync*******************************************************************************/
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync/**
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync * Wrapper for the Solaris mutex.
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsynctypedef struct RTSEMFASTMUTEXINTERNAL
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync{
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync /** Magic value (RTSEMFASTMUTEX_MAGIC). */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync uint32_t u32Magic;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync /** The Solaris mutex. */
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync kmutex_t Mtx;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync} RTSEMFASTMUTEXINTERNAL, *PRTSEMFASTMUTEXINTERNAL;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsyncRTDECL(int) RTSemFastMutexCreate(PRTSEMFASTMUTEX pMutexSem)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync{
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertCompile(sizeof(RTSEMFASTMUTEXINTERNAL) > sizeof(void *));
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertPtrReturn(pMutexSem, VERR_INVALID_POINTER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)RTMemAlloc(sizeof(*pFastInt));
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync if (pFastInt)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync {
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync pFastInt->u32Magic = RTSEMFASTMUTEX_MAGIC;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync mutex_init (&pFastInt->Mtx, "IPRT Fast Mutex Semaphore", MUTEX_DEFAULT, NULL);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync *pMutexSem = pFastInt;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync return VINF_SUCCESS;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync }
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync return VERR_NO_MEMORY;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync}
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsyncRTDECL(int) RTSemFastMutexDestroy(RTSEMFASTMUTEX MutexSem)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync{
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync if (MutexSem == NIL_RTSEMFASTMUTEX)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync return VERR_INVALID_PARAMETER;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync ("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync ASMAtomicXchgU32(&pFastInt->u32Magic, RTSEMFASTMUTEX_MAGIC_DEAD);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync mutex_destroy(&pFastInt->Mtx);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync RTMemFree(pFastInt);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync return VINF_SUCCESS;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync}
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsyncRTDECL(int) RTSemFastMutexRequest(RTSEMFASTMUTEX MutexSem)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync{
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync ("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync mutex_enter(&pFastInt->Mtx);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync return VINF_SUCCESS;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync}
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsyncRTDECL(int) RTSemFastMutexRelease(RTSEMFASTMUTEX MutexSem)
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync{
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync ("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync VERR_INVALID_PARAMETER);
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync mutex_exit(&pFastInt->Mtx);
004d34f82d0e8a4d58a65cc50eacf298bc6eb956vboxsync return VINF_SUCCESS;
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync}
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync