VirtualBox

Ignore:
Timestamp:
Apr 6, 2012 9:05:19 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77321
Message:

RTSpinlock: Redid the interface, eliminating NoInts and Tmp. Whether a spinlock is interrupt safe or not is now defined at creation time, preventing stupid bugs arrising from calling the wrong acquire and/or release methods somewhere. The saved flags are stored in the spinlock strucutre, eliminating the annoying Tmp variable. Needs testing on each platform before fixing the build burn.

File:
1 edited

Legend:

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

    r39456 r40806  
    5858*******************************************************************************/
    5959#ifdef IN_RING0
    60 # define RT_THREAD_LOCK_TMP(Tmp)    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER
    61 # define RT_THREAD_LOCK_RW(Tmp)     RTSpinlockAcquireNoInts(g_ThreadSpinlock, &(Tmp))
    62 # define RT_THREAD_UNLOCK_RW(Tmp)   RTSpinlockReleaseNoInts(g_ThreadSpinlock, &(Tmp))
    63 # define RT_THREAD_LOCK_RD(Tmp)     RTSpinlockAcquireNoInts(g_ThreadSpinlock, &(Tmp))
    64 # define RT_THREAD_UNLOCK_RD(Tmp)   RTSpinlockReleaseNoInts(g_ThreadSpinlock, &(Tmp))
     60# define RT_THREAD_LOCK_RW()        RTSpinlockAcquire(g_ThreadSpinlock)
     61# define RT_THREAD_UNLOCK_RW()      RTSpinlockRelease(g_ThreadSpinlock)
     62# define RT_THREAD_LOCK_RD()        RTSpinlockAcquire(g_ThreadSpinlock)
     63# define RT_THREAD_UNLOCK_RD()      RTSpinlockRelease(g_ThreadSpinlock)
    6564#else
    66 # define RT_THREAD_LOCK_TMP(Tmp)
    67 # define RT_THREAD_LOCK_RW(Tmp)     rtThreadLockRW()
    68 # define RT_THREAD_UNLOCK_RW(Tmp)   rtThreadUnLockRW()
    69 # define RT_THREAD_LOCK_RD(Tmp)     rtThreadLockRD()
    70 # define RT_THREAD_UNLOCK_RD(Tmp)   rtThreadUnLockRD()
     65# define RT_THREAD_LOCK_RW()        rtThreadLockRW()
     66# define RT_THREAD_UNLOCK_RW()      rtThreadUnLockRW()
     67# define RT_THREAD_LOCK_RD()        rtThreadLockRD()
     68# define RT_THREAD_UNLOCK_RD()      rtThreadUnLockRD()
    7169#endif
    7270
     
    167165     */
    168166    Assert(g_ThreadSpinlock == NIL_RTSPINLOCK);
    169     rc = RTSpinlockCreate(&g_ThreadSpinlock);
     167    rc = RTSpinlockCreate(&g_ThreadSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "RTThread");
    170168    if (RT_SUCCESS(rc))
    171169    {
     
    406404
    407405    {
    408         RT_THREAD_LOCK_TMP(Tmp);
    409         RT_THREAD_LOCK_RW(Tmp);
     406        RT_THREAD_LOCK_RW();
    410407
    411408        /*
     
    450447        }
    451448
    452         RT_THREAD_UNLOCK_RW(Tmp);
     449        RT_THREAD_UNLOCK_RW();
    453450    }
    454451}
     
    479476static void rtThreadRemove(PRTTHREADINT pThread)
    480477{
    481     RT_THREAD_LOCK_TMP(Tmp);
    482     RT_THREAD_LOCK_RW(Tmp);
     478    RT_THREAD_LOCK_RW();
    483479    if (ASMAtomicBitTestAndClear(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE_BIT))
    484480        rtThreadRemoveLocked(pThread);
    485     RT_THREAD_UNLOCK_RW(Tmp);
     481    RT_THREAD_UNLOCK_RW();
    486482}
    487483
     
    512508     * Simple tree lookup.
    513509     */
    514     RT_THREAD_LOCK_TMP(Tmp);
    515     RT_THREAD_LOCK_RD(Tmp);
     510    RT_THREAD_LOCK_RD();
    516511    pThread = (PRTTHREADINT)RTAvlPVGet(&g_ThreadTree, (void *)NativeThread);
    517     RT_THREAD_UNLOCK_RD(Tmp);
     512    RT_THREAD_UNLOCK_RD();
    518513    return pThread;
    519514}
     
    12411236                 * Do the job.
    12421237                 */
    1243                 RT_THREAD_LOCK_TMP(Tmp);
    1244                 RT_THREAD_LOCK_RW(Tmp);
     1238                RT_THREAD_LOCK_RW();
    12451239                rc = rtThreadNativeSetPriority(pThread, enmType);
    12461240                if (RT_SUCCESS(rc))
    12471241                    ASMAtomicXchgSize(&pThread->enmType, enmType);
    1248                 RT_THREAD_UNLOCK_RW(Tmp);
     1242                RT_THREAD_UNLOCK_RW();
    12491243                if (RT_FAILURE(rc))
    12501244                    Log(("RTThreadSetType: failed on thread %p (%s), rc=%Rrc!!!\n", Thread, pThread->szName, rc));
     
    13021296int rtThreadDoCalcDefaultPriority(RTTHREADTYPE enmType)
    13031297{
    1304     RT_THREAD_LOCK_TMP(Tmp);
    1305     RT_THREAD_LOCK_RW(Tmp);
     1298    RT_THREAD_LOCK_RW();
    13061299    int rc = rtSchedNativeCalcDefaultPriority(enmType);
    1307     RT_THREAD_UNLOCK_RW(Tmp);
     1300    RT_THREAD_UNLOCK_RW();
    13081301    return rc;
    13091302}
     
    13501343     * scheduling attributes defined by the specified process priority.
    13511344     */
    1352     RT_THREAD_LOCK_TMP(Tmp);
    1353     RT_THREAD_LOCK_RW(Tmp);
     1345    RT_THREAD_LOCK_RW();
    13541346    int rc = rtProcNativeSetPriority(enmPriority);
    13551347    if (RT_SUCCESS(rc))
     
    13701362        }
    13711363    }
    1372     RT_THREAD_UNLOCK_RW(Tmp);
     1364    RT_THREAD_UNLOCK_RW();
    13731365    LogFlow(("rtThreadDoSetProcPriority: returns %Rrc\n", rc));
    13741366    return rc;
     
    15261518DECLHIDDEN(void) rtThreadClearTlsEntry(RTTLS iTls)
    15271519{
    1528     RT_THREAD_LOCK_TMP(Tmp);
    1529     RT_THREAD_LOCK_RD(Tmp);
     1520    RT_THREAD_LOCK_RD();
    15301521    RTAvlPVDoWithAll(&g_ThreadTree, true /* fFromLeft*/, rtThreadClearTlsEntryCallback, (void *)(uintptr_t)iTls);
    1531     RT_THREAD_UNLOCK_RD(Tmp);
     1522    RT_THREAD_UNLOCK_RD();
    15321523}
    15331524
Note: See TracChangeset for help on using the changeset viewer.

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