semfastmutex-r0drv-freebsd.c revision 24b814713d57519124d491243137f551be686c66
4c221b0da1816acf2ca302b10092df059484468dvboxsync/* $Id$ */
4c221b0da1816acf2ca302b10092df059484468dvboxsync/** @file
4c221b0da1816acf2ca302b10092df059484468dvboxsync * IPRT - Fast Mutex Semaphores, Ring-0 Driver, FreeBSD.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Permission is hereby granted, free of charge, to any person
4c221b0da1816acf2ca302b10092df059484468dvboxsync * obtaining a copy of this software and associated documentation
4c221b0da1816acf2ca302b10092df059484468dvboxsync * files (the "Software"), to deal in the Software without
4c221b0da1816acf2ca302b10092df059484468dvboxsync * restriction, including without limitation the rights to use,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
4c221b0da1816acf2ca302b10092df059484468dvboxsync * copies of the Software, and to permit persons to whom the
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Software is furnished to do so, subject to the following
4c221b0da1816acf2ca302b10092df059484468dvboxsync * conditions:
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * The above copyright notice and this permission notice shall be
4c221b0da1816acf2ca302b10092df059484468dvboxsync * included in all copies or substantial portions of the Software.
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
4c221b0da1816acf2ca302b10092df059484468dvboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
4c221b0da1816acf2ca302b10092df059484468dvboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
4c221b0da1816acf2ca302b10092df059484468dvboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4c221b0da1816acf2ca302b10092df059484468dvboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
4c221b0da1816acf2ca302b10092df059484468dvboxsync * OTHER DEALINGS IN THE SOFTWARE.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*******************************************************************************
4c221b0da1816acf2ca302b10092df059484468dvboxsync* Header Files *
4c221b0da1816acf2ca302b10092df059484468dvboxsync*******************************************************************************/
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include "the-freebsd-kernel.h"
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <iprt/semaphore.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <iprt/err.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <iprt/alloc.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <iprt/assert.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <iprt/asm.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include "internal/magics.h"
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*******************************************************************************
4c221b0da1816acf2ca302b10092df059484468dvboxsync* Structures and Typedefs *
4c221b0da1816acf2ca302b10092df059484468dvboxsync*******************************************************************************/
4c221b0da1816acf2ca302b10092df059484468dvboxsync/**
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Wrapper for the FreeBSD (sleep) mutex.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsynctypedef struct RTSEMFASTMUTEXINTERNAL
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync /** Magic value (RTSEMFASTMUTEX_MAGIC). */
4c221b0da1816acf2ca302b10092df059484468dvboxsync uint32_t u32Magic;
4c221b0da1816acf2ca302b10092df059484468dvboxsync /** The FreeBSD (sleep) mutex. */
4c221b0da1816acf2ca302b10092df059484468dvboxsync struct mtx Mtx;
4c221b0da1816acf2ca302b10092df059484468dvboxsync} RTSEMFASTMUTEXINTERNAL, *PRTSEMFASTMUTEXINTERNAL;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncRTDECL(int) RTSemFastMutexCreate(PRTSEMFASTMUTEX pMutexSem)
4c221b0da1816acf2ca302b10092df059484468dvboxsync{
4c221b0da1816acf2ca302b10092df059484468dvboxsync AssertCompile(sizeof(RTSEMFASTMUTEXINTERNAL) > sizeof(void *));
4c221b0da1816acf2ca302b10092df059484468dvboxsync AssertPtrReturn(pMutexSem, VERR_INVALID_POINTER);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)RTMemAllocZ(sizeof(*pFastInt));
4c221b0da1816acf2ca302b10092df059484468dvboxsync if (pFastInt)
4c221b0da1816acf2ca302b10092df059484468dvboxsync {
4c221b0da1816acf2ca302b10092df059484468dvboxsync pFastInt->u32Magic = RTSEMFASTMUTEX_MAGIC;
4c221b0da1816acf2ca302b10092df059484468dvboxsync mtx_init(&pFastInt->Mtx, "IPRT Fast Mutex Semaphore", NULL, MTX_DEF | MTX_RECURSE);
4c221b0da1816acf2ca302b10092df059484468dvboxsync *pMutexSem = pFastInt;
4c221b0da1816acf2ca302b10092df059484468dvboxsync return VINF_SUCCESS;
4c221b0da1816acf2ca302b10092df059484468dvboxsync }
4c221b0da1816acf2ca302b10092df059484468dvboxsync return VERR_NO_MEMORY;
}
RTDECL(int) RTSemFastMutexDestroy(RTSEMFASTMUTEX MutexSem)
{
if (MutexSem == NIL_RTSEMFASTMUTEX) /* don't bitch */
return VERR_INVALID_PARAMETER;
PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
VERR_INVALID_PARAMETER);
ASMAtomicXchgU32(&pFastInt->u32Magic, RTSEMFASTMUTEX_MAGIC_DEAD);
mtx_destroy(&pFastInt->Mtx);
RTMemFree(pFastInt);
return VINF_SUCCESS;
}
RTDECL(int) RTSemFastMutexRequest(RTSEMFASTMUTEX MutexSem)
{
PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
VERR_INVALID_PARAMETER);
mtx_lock(&pFastInt->Mtx);
return VINF_SUCCESS;
}
RTDECL(int) RTSemFastMutexRelease(RTSEMFASTMUTEX MutexSem)
{
PRTSEMFASTMUTEXINTERNAL pFastInt = (PRTSEMFASTMUTEXINTERNAL)MutexSem;
AssertPtrReturn(pFastInt, VERR_INVALID_PARAMETER);
AssertMsgReturn(pFastInt->u32Magic == RTSEMFASTMUTEX_MAGIC,
("pFastInt->u32Magic=%RX32 pFastInt=%p\n", pFastInt->u32Magic, pFastInt),
VERR_INVALID_PARAMETER);
mtx_unlock(&pFastInt->Mtx);
return VINF_SUCCESS;
}