semmutex-win.cpp revision 47d9037afecc80d7a107338f0adfda45c1224fed
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * IPRT - Mutex Semaphores, Windows.
aae8a6a38fd27661046ab1d06cb2cb5c096c40edvboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * available from http://www.virtualbox.org. This file is free software;
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * General Public License (GPL) as published by the Free Software
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * The contents of this file may alternatively be used under the terms
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * of the Common Development and Distribution License Version 1.0
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * VirtualBox OSE distribution, in which case the provisions of the
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * CDDL are applicable instead of those of the GPL.
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync * You may elect to license modified versions of this file under the
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * terms and conditions of either the GPL or the CDDL or both.
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * additional information or have any questions.
90eb38579e280c6a0e466177b2a9632ab9eb8c44vboxsync/*******************************************************************************
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync* Header Files *
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync*******************************************************************************/
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync/*******************************************************************************
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync* Defined Constants And Macros *
1759f65b60e18f669f6d569aebd4fb7217ab414fvboxsync*******************************************************************************/
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync/** Posix internal representation of a Mutex semaphore. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync /** Magic value (RTSEMMUTEX_MAGIC). */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync /** Recursion count. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync /** The owner thread. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync /** The mutex handle. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync /** Lock validator record associated with this mutex. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync/* Undefine debug mappings. */
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync * Create the semaphore.
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync RTSEMMUTEXINTERNAL *pThis = (RTSEMMUTEXINTERNAL *)RTMemAlloc(sizeof(*pThis));
f6dd48677b626c383d1a91cba7688abb0945af7dvboxsync RTLockValidatorRecExclInit(&pThis->ValidatorRec, NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, pThis,
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync * Validate.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, VERR_INVALID_HANDLE);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Close semaphore handle.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertReturn(ASMAtomicCmpXchgU32(&pThis->u32Magic, RTSEMMUTEX_MAGIC_DEAD, RTSEMMUTEX_MAGIC), VERR_INVALID_HANDLE);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync ASMAtomicWritePtr((void * volatile *)&pThis->hMtx, (void *)INVALID_HANDLE_VALUE);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertMsgFailed(("%p rc=%d lasterr=%d\n", pThis->hMtx, rc, GetLastError()));
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync RTLockValidatorRecExclDelete(&pThis->ValidatorRec);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Internal worker for RTSemMutexRequestNoResume and it's debug companion.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * @returns Same as RTSEmMutexRequestNoResume
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * @param MutexSem The mutex handle.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * @param cMillies The number of milliseconds to wait.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * @param pSrcPos The source position of the caller.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsyncDECL_FORCE_INLINE(int) rtSemMutexRequestNoResume(RTSEMMUTEX MutexSem, unsigned cMillies, PCRTLOCKVALSRCPOS pSrcPos)
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Validate.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, VERR_INVALID_HANDLE);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Check for recursive entry.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync ASMAtomicReadHandle(&pThis->hNativeOwner, &hNativeOwner);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync int rc9 = RTLockValidatorRecExclRecursion(&pThis->ValidatorRec, pSrcPos);
2afbe132eb7931e0125141eabe3a48e08f1ffab5vboxsync * Lock mutex semaphore.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync int rc9 = RTLockValidatorRecExclCheckOrderAndBlocking(&pThis->ValidatorRec, hThreadSelf, pSrcPos, true,
90ecd36a6e45ec33526541f68cf89c21ec578f83vboxsync RTThreadBlocking(hThreadSelf, RTTHREADSTATE_MUTEX, true);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies,
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_MUTEX);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync RTLockValidatorRecExclSetOwner(&pThis->ValidatorRec, hThreadSelf, pSrcPos, true);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync ASMAtomicWriteHandle(&pThis->hNativeOwner, hNativeSelf);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertMsgFailed(("Wait on MutexSem %p failed, rc=%d lasterr=%d\n", MutexSem, rc, GetLastError()));
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsyncRTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX MutexSem, unsigned cMillies)
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync return rtSemMutexRequestNoResume(MutexSem, cMillies, NULL);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_NORMAL_API();
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync return rtSemMutexRequestNoResume(MutexSem, cMillies, &SrcPos);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsyncRTDECL(int) RTSemMutexRequestNoResumeDebug(RTSEMMUTEX MutexSem, unsigned cMillies, RTHCUINTPTR uId, RT_SRC_POS_DECL)
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_DEBUG_API();
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync return rtSemMutexRequestNoResume(MutexSem, cMillies, &SrcPos);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Validate.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, VERR_INVALID_HANDLE);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync * Check ownership and recursions.
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync ASMAtomicReadHandle(&pThis->hNativeOwner, &hNativeOwner);
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync AssertMsgFailed(("Not owner of mutex %p!! hNativeSelf=%RTntrd Owner=%RTntrd cRecursions=%d\n",
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync pThis, hNativeSelf, hNativeOwner, pThis->cRecursions));
8c97c335e49609421316d92d2e0aff3e7f8eed04vboxsync int rc9 = RTLockValidatorRecExclUnwind(&pThis->ValidatorRec);
90eb38579e280c6a0e466177b2a9632ab9eb8c44vboxsync * Unlock mutex semaphore.
90eb38579e280c6a0e466177b2a9632ab9eb8c44vboxsync int rc9 = RTLockValidatorRecExclReleaseOwner(&pThis->ValidatorRec, false);
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync ASMAtomicWriteHandle(&pThis->hNativeOwner, NIL_RTNATIVETHREAD);
6ca8a1595bddf29de7894958ae74c255eb2693bevboxsync AssertMsgFailed(("%p/%p, rc=%Rrc lasterr=%d\n", pThis, pThis->hMtx, rc, GetLastError()));
90eb38579e280c6a0e466177b2a9632ab9eb8c44vboxsync * Validate.
90eb38579e280c6a0e466177b2a9632ab9eb8c44vboxsync AssertReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, false);