VirtualBox

Changeset 25570 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Dec 22, 2009 3:11:13 PM (15 years ago)
Author:
vboxsync
Message:

lockvalidator,semrw-posix.cpp: link the read and write records.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/lockvalidator.cpp

    r25567 r25570  
    159159    pRec->hLock         = hLock;
    160160    pRec->pszName       = pszName;
     161    pRec->pSibling      = NULL;
    161162
    162163    /* Lazily initialize the crossroads semaphore. */
     
    197198    ASMAtomicWriteHandle(&pRec->hThread, NIL_RTTHREAD);
    198199    ASMAtomicWriteHandle(&pRec->hClass, NIL_RTLOCKVALIDATORCLASS);
     200    if (pRec->pSibling)
     201    {
     202        /* ASSUMES sibling destruction doesn't involve any races.  */
     203        ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling->pSibling, NULL);
     204        ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling, NULL);
     205    }
    199206
    200207    rtLockValidatorSerializeDestructLeave();
     
    223230    pRec->pszName       = pszName;
    224231    pRec->fEnabled      = RTLockValidatorIsEnabled();
     232    pRec->pSibling      = NULL;
    225233
    226234    /* the table */
     
    232240    pRec->afPadding[1]  = false;
    233241    pRec->papOwners     = NULL;
    234     pRec->u64Alignment  = UINT64_MAX;
     242#if HC_ARCH_BITS == 32
     243    pRec->u32Alignment  = UINT32_MAX;
     244#endif
    235245}
    236246
     
    263273
    264274        RTMemFree((void *)pRec->papOwners);
     275    }
     276    if (pRec->pSibling)
     277    {
     278        /* ASSUMES sibling destruction doesn't involve any races.  */
     279        ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling->pSibling, NULL);
     280        ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling, NULL);
    265281    }
    266282    ASMAtomicWriteBool(&pRec->fReallocating, false);
     
    510526
    511527
     528RTDECL(int) RTLockValidatorMakeSiblings(void *pvRec1, void *pvRec2)
     529{
     530    /*
     531     * Validate input.
     532     */
     533    union
     534    {
     535        PRTLOCKVALIDATORREC     pRec;
     536        PRTLOCKVALIDATORSHARED  pShared;
     537        uint32_t               *pu32Magic;
     538        void                   *pv;
     539    } u1, u2;
     540    u1.pv = pvRec1;
     541    u2.pv = pvRec2;
     542
     543    AssertPtrReturn(u1.pv, VERR_SEM_LV_INVALID_PARAMETER);
     544    AssertReturn(   *u1.pu32Magic == RTLOCKVALIDATORREC_MAGIC
     545                 || *u1.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC
     546                 , VERR_SEM_LV_INVALID_PARAMETER);
     547
     548    AssertPtrReturn(u2.pv, VERR_SEM_LV_INVALID_PARAMETER);
     549    AssertReturn(   *u2.pu32Magic == RTLOCKVALIDATORREC_MAGIC
     550                 || *u2.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC
     551                 , VERR_SEM_LV_INVALID_PARAMETER);
     552
     553    /*
     554     * Link them.
     555     */
     556    if (    *u1.pu32Magic == RTLOCKVALIDATORREC_MAGIC
     557        &&  *u2.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC)
     558    {
     559        u1.pRec->pSibling    = u2.pShared;
     560        u2.pShared->pSibling = u1.pRec;
     561    }
     562    else if (    *u1.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC
     563             &&  *u2.pu32Magic == RTLOCKVALIDATORREC_MAGIC)
     564    {
     565        u1.pShared->pSibling = u2.pRec;
     566        u2.pRec->pSibling    = u1.pShared;
     567    }
     568    else
     569        AssertFailedReturn(VERR_SEM_LV_INVALID_PARAMETER); /* unsupported mix */
     570
     571    return VINF_SUCCESS;
     572}
     573
     574
    512575RTDECL(int) RTLockValidatorCheckOrder(PRTLOCKVALIDATORREC pRec, RTTHREAD hThread, PCRTLOCKVALIDATORSRCPOS pSrcPos)
    513576{
     
    860923            case RTTHREADSTATE_FAST_MUTEX:
    861924            case RTTHREADSTATE_MUTEX:
    862             case RTTHREADSTATE_RW_READ:
    863             case RTTHREADSTATE_RW_WRITE:
    864925            case RTTHREADSTATE_SPIN_MUTEX:
    865926            {
     
    889950            }
    890951
     952#if 0
     953            case RTTHREADSTATE_RW_READ:
     954            case RTTHREADSTATE_RW_WRITE:
     955            {
     956            }
     957#endif
     958
    891959            default:
    892960                RTAssertMsg2Weak(" Impossible!!! enmState=%s (%d)\n", RTThreadStateName(enmCurState), enmCurState);
     
    10661134                    case RTTHREADSTATE_FAST_MUTEX:
    10671135                    case RTTHREADSTATE_MUTEX:
    1068                     case RTTHREADSTATE_RW_WRITE:
    10691136                    case RTTHREADSTATE_SPIN_MUTEX:
    10701137                    {
     
    10821149                    }
    10831150
     1151#if 0
     1152                    case RTTHREADSTATE_RW_WRITE:
     1153                    {
     1154                        PRTLOCKVALIDATORREC pCurRec = pCur->LockValidator.pRec;
     1155                        if (    rtThreadGetState(pCur) != enmCurState
     1156                            ||  !VALID_PTR(pCurRec)
     1157                            ||  pCurRec->u32Magic != RTLOCKVALIDATORREC_MAGIC)
     1158                            continue;
     1159
     1160                        break;
     1161                    }
     1162
    10841163                    case RTTHREADSTATE_RW_READ:
    10851164                    {
     
    10961175                        break;
    10971176                    }
    1098 
     1177#endif
    10991178
    11001179                    default:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette