VirtualBox

Changeset 90670 in vbox for trunk


Ignore:
Timestamp:
Aug 12, 2021 8:51:50 PM (3 years ago)
Author:
vboxsync
Message:

VMM/PDMCritSectRwEnterShared: Some code refactoring. bugref:6695

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PDMAllCritSectRw.cpp

    r90667 r90670  
    208208
    209209/**
     210 * Worker for pdmCritSectRwEnterShared returning with read-ownership of the CS.
     211 */
     212DECL_FORCE_INLINE(int) pdmCritSectRwEnterSharedGotIt(PPDMCRITSECTRW pThis, PCRTLOCKVALSRCPOS pSrcPos,
     213                                                     bool fNoVal, RTTHREAD hThreadSelf)
     214{
     215#if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3)
     216    if (!fNoVal)
     217        RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos);
     218#else
     219    RT_NOREF(pSrcPos, fNoVal, hThreadSelf);
     220#endif
     221
     222    /* got it! */
     223    STAM_REL_COUNTER_INC(&pThis->s.CTX_MID_Z(Stat,EnterShared));
     224    Assert((PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State) & RTCSRW_DIR_MASK) == (RTCSRW_DIR_READ << RTCSRW_DIR_SHIFT));
     225    return VINF_SUCCESS;
     226}
     227
     228
     229/**
    210230 * Worker that enters a read/write critical section with shard access.
    211231 *
     
    226246    AssertPtr(pThis);
    227247    AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
    228 
    229 #if !defined(PDMCRITSECTRW_STRICT) || !defined(IN_RING3)
    230     NOREF(pSrcPos);
    231     NOREF(fNoVal);
    232 #endif
    233248#ifdef IN_RING3
    234     NOREF(rcBusy);
    235     NOREF(pVM);
     249    RT_NOREF(rcBusy);
    236250#endif
    237251
     
    250264            return rc9;
    251265    }
     266#else
     267    RTTHREAD hThreadSelf = NIL_RTTHREAD;
    252268#endif
    253269
     
    270286            u64State |= c << RTCSRW_CNT_RD_SHIFT;
    271287            if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState))
    272             {
    273 #if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3)
    274                 if (!fNoVal)
    275                     RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos);
    276 #endif
    277                 break;
    278             }
     288                return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf);
    279289        }
    280290        else if ((u64State & (RTCSRW_CNT_RD_MASK | RTCSRW_CNT_WR_MASK)) == 0)
     
    286296            {
    287297                Assert(!pThis->s.Core.fNeedReset);
    288 #if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3)
    289                 if (!fNoVal)
    290                     RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos);
    291 #endif
    292                 break;
     298                return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf);
    293299            }
    294300        }
     
    354360                if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState))
    355361                {
     362# if !defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3)
     363                    hThreadSelf = RTThreadSelf();
     364# endif
     365
    356366                    for (uint32_t iLoop = 0; ; iLoop++)
    357367                    {
     
    363373                        if (RT_SUCCESS(rc))
    364374#  else
    365                         RTTHREAD hThreadSelf = RTThreadSelf();
    366375                        RTThreadBlocking(hThreadSelf, RTTHREADSTATE_RW_READ, false);
    367376#  endif
     
    402411                                if (ASMAtomicCmpXchgU64(&pThis->s.Core.u.s.u64State, u64State, u64OldState))
    403412                                    break;
     413
     414                                ASMNopPause();
     415                                AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
    404416                            }
    405417                            return rc;
     
    434446                                }
    435447                            }
    436                             break;
     448                            return pdmCritSectRwEnterSharedGotIt(pThis, pSrcPos, fNoVal, hThreadSelf);
    437449                        }
     450
     451                        ASMNopPause();
     452                        AssertReturn(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
     453                        ASMNopPause();
     454
    438455                        u64State = PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State);
    439456                    }
    440457
    441 # if defined(PDMCRITSECTRW_STRICT) && defined(IN_RING3)
    442                     if (!fNoVal)
    443                         RTLockValidatorRecSharedAddOwner(pThis->s.Core.pValidatorRead, hThreadSelf, pSrcPos);
    444 # endif
    445                     break;
     458                    /* not reached */
    446459                }
    447460            }
     
    469482        }
    470483
    471         if (pThis->s.Core.u32Magic != RTCRITSECTRW_MAGIC)
     484        ASMNopPause();
     485        if (RT_LIKELY(pThis->s.Core.u32Magic == RTCRITSECTRW_MAGIC))
     486        { /* likely */ }
     487        else
    472488            return VERR_SEM_DESTROYED;
    473 
    474489        ASMNopPause();
     490
    475491        u64State = PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State);
    476492        u64OldState = u64State;
    477493    }
    478 
    479     /* got it! */
    480     STAM_REL_COUNTER_INC(&pThis->s.CTX_MID_Z(Stat,EnterShared));
    481     Assert((PDMCRITSECTRW_READ_STATE(&pThis->s.Core.u.s.u64State) & RTCSRW_DIR_MASK) == (RTCSRW_DIR_READ << RTCSRW_DIR_SHIFT));
    482     return VINF_SUCCESS;
    483 
     494    /* not reached */
    484495}
    485496
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