spinlock-generic.cpp revision 549973ce036bba9254be2155c59dc49edda940f5
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync/* $Id$ */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/** @file
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * IPRT - Spinlock, generic implementation.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/*
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync * Copyright (C) 2006-2012 Oracle Corporation
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * available from http://www.virtualbox.org. This file is free software;
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * you can redistribute it and/or modify it under the terms of the GNU
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * General Public License (GPL) as published by the Free Software
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * The contents of this file may alternatively be used under the terms
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * of the Common Development and Distribution License Version 1.0
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * VirtualBox OSE distribution, in which case the provisions of the
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * CDDL are applicable instead of those of the GPL.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * You may elect to license modified versions of this file under the
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * terms and conditions of either the GPL or the CDDL or both.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/*******************************************************************************
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync* Defined Constants And Macros *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync*******************************************************************************/
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/** @def RT_CFG_SPINLOCK_GENERIC_DO_SLEEP
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Force cpu yields after spinning the number of times indicated by the define.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * If 0 we will spin forever. */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#define RT_CFG_SPINLOCK_GENERIC_DO_SLEEP 100000
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/*******************************************************************************
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync* Header Files *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync*******************************************************************************/
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/spinlock.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include "internal/iprt.h"
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/alloc.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/asm.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync# include <iprt/asm-amd64-x86.h>
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#endif
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/err.h>
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#include <iprt/assert.h>
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#if RT_CFG_SPINLOCK_GENERIC_DO_SLEEP
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync# include <iprt/thread.h>
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#endif
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#include "internal/magics.h"
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync/*******************************************************************************
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync* Structures and Typedefs *
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync*******************************************************************************/
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/**
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Generic spinlock structure.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsynctypedef struct RTSPINLOCKINTERNAL
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync{
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync /** Spinlock magic value (RTSPINLOCK_MAGIC). */
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync uint32_t u32Magic;
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync /** The spinlock creation flags. */
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync uint32_t fFlags;
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync /** The spinlock. */
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync uint32_t volatile fLocked;
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync /** The saved CPU interrupt. */
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync uint32_t volatile fIntSaved;
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync} RTSPINLOCKINTERNAL, *PRTSPINLOCKINTERNAL;
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsyncRTDECL(int) RTSpinlockCreate(PRTSPINLOCK pSpinlock, uint32_t fFlags, const char *pszName)
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync{
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync PRTSPINLOCKINTERNAL pThis;
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync AssertReturn(fFlags == RTSPINLOCK_FLAGS_INTERRUPT_SAFE || fFlags == RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, VERR_INVALID_PARAMETER);
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync /*
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Allocate.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync pThis = (PRTSPINLOCKINTERNAL)RTMemAlloc(sizeof(*pThis));
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync if (!pThis)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync return VERR_NO_MEMORY;
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync /*
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync * Initialize and return.
bf8889d6b20936475381d2ed2b80b06eaf2a03d1vboxsync */
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync pThis->u32Magic = RTSPINLOCK_MAGIC;
bf8889d6b20936475381d2ed2b80b06eaf2a03d1vboxsync pThis->fFlags = fFlags;
bf8889d6b20936475381d2ed2b80b06eaf2a03d1vboxsync pThis->fIntSaved = 0;
bf8889d6b20936475381d2ed2b80b06eaf2a03d1vboxsync ASMAtomicWriteU32(&pThis->fLocked, 0);
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync *pSpinlock = pThis;
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync return VINF_SUCCESS;
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync}
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsyncRT_EXPORT_SYMBOL(RTSpinlockCreate);
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsyncRTDECL(int) RTSpinlockDestroy(RTSPINLOCK Spinlock)
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync{
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync /*
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync * Validate input.
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync */
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock;
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync if (!pThis)
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync return VERR_INVALID_PARAMETER;
6b07d9a23ed1c650aa0a3b8de9d19f51b6b67e9fvboxsync if (pThis->u32Magic != RTSPINLOCK_MAGIC)
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync {
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync AssertMsgFailed(("Invalid spinlock %p magic=%#x\n", pThis, pThis->u32Magic));
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync return VERR_INVALID_PARAMETER;
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync }
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync ASMAtomicIncU32(&pThis->u32Magic);
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync RTMemFree(pThis);
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync return VINF_SUCCESS;
e94ff1af89bf631c68367d4e291ddbb491b5e5c0vboxsync}
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsyncRT_EXPORT_SYMBOL(RTSpinlockDestroy);
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsyncRTDECL(void) RTSpinlockAcquire(RTSPINLOCK Spinlock)
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync{
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock;
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync AssertMsg(pThis && pThis->u32Magic == RTSPINLOCK_MAGIC,
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync ("pThis=%p u32Magic=%08x\n", pThis, pThis ? (int)pThis->u32Magic : 0));
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync if (pThis->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
e94ff1af89bf631c68367d4e291ddbb491b5e5c0vboxsync uint32_t fIntSaved = ASMGetFlags();
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#endif
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if RT_CFG_SPINLOCK_GENERIC_DO_SLEEP
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync for (;;)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync ASMIntDisable();
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#endif
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync for (int c = RT_CFG_SPINLOCK_GENERIC_DO_SLEEP; c > 0; c--)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync if (ASMAtomicCmpXchgU32(&pThis->fLocked, 1, 0))
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync pThis->fIntSaved = fIntSaved;
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync# endif
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync return;
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync }
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync ASMNopPause();
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync }
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync ASMSetFlags(fIntSaved);
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#endif
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync RTThreadYield();
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync }
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync#else
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync for (;;)
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync {
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync ASMIntDisable();
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync#endif
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync if (ASMAtomicCmpXchgU32(&pThis->fLocked, 1, 0))
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync pThis->fIntSaved = fIntSaved;
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync# endif
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync return;
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync }
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync ASMSetFlags(fIntSaved);
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#endif
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync ASMNopPause();
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync }
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync#endif
9a379ef11a4bb232c8e41c12b82ec94c8e10d9a0vboxsync }
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync else
1f1f533d5b88c35cf740dca55c6f1937d1035a36vboxsync {
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#if RT_CFG_SPINLOCK_GENERIC_DO_SLEEP
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync for (;;)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync {
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync for (int c = RT_CFG_SPINLOCK_GENERIC_DO_SLEEP; c > 0; c--)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync {
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync if (ASMAtomicCmpXchgU32(&pThis->fLocked, 1, 0))
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync return;
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync ASMNopPause();
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync }
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync RTThreadYield();
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync }
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#else
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync while (!ASMAtomicCmpXchgU32(&pThis->fLocked, 1, 0))
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync ASMNopPause();
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#endif
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync }
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync}
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsyncRT_EXPORT_SYMBOL(RTSpinlockAcquire);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsyncRTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync{
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock;
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync AssertMsg(pThis && pThis->u32Magic == RTSPINLOCK_MAGIC,
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync ("pThis=%p u32Magic=%08x\n", pThis, pThis ? (int)pThis->u32Magic : 0));
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync if (pThis->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync {
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync uint32_t fIntSaved = pThis->fIntSaved;
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync pThis->fIntSaved = 0;
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#endif
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync if (!ASMAtomicCmpXchgU32(&pThis->fLocked, 0, 1))
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync AssertMsgFailed(("Spinlock %p was not locked!\n", pThis));
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync ASMSetFlags(fIntSaved);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#endif
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync }
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync else
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync {
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync if (!ASMAtomicCmpXchgU32(&pThis->fLocked, 0, 1))
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync AssertMsgFailed(("Spinlock %p was not locked!\n", pThis));
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync }
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync}
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsyncRT_EXPORT_SYMBOL(RTSpinlockRelease);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsyncRTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync{
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#if 1
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#else
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync#endif
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync RTSpinlockRelease(Spinlock);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync}
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsyncRT_EXPORT_SYMBOL(RTSpinlockReleaseNoInts);
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync
ba6cd8af51db6aeff784fd6d73cadaf13ec45996vboxsync