Chromium Code Reviews| Index: Source/platform/heap/ThreadState.cpp |
| diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp |
| index 75a6c81ed865246377001d1202159aba14d2abff..1b28e26edaac27933a5485dace518ad79f7c5550 100644 |
| --- a/Source/platform/heap/ThreadState.cpp |
| +++ b/Source/platform/heap/ThreadState.cpp |
| @@ -104,7 +104,7 @@ static Mutex& threadAttachMutex() |
| static double lockingTimeout() |
| { |
| - // Wait time for parking all threads is at most 500 MS. |
| + // Wait time for parking all threads is at most 100 MS. |
| return 0.100; |
| } |
| @@ -186,10 +186,17 @@ public: |
| ASSERT(ThreadState::current()->isAtSafePoint()); |
| } |
| - void checkAndPark(ThreadState* state) |
| + void checkAndPark(ThreadState* state, SafePointAwareMutexLocker* locker = 0) |
|
haraken
2014/06/17 12:25:41
Does the |locker| need to be an optional parameter
wibling-chromium
2014/06/17 12:38:21
I prefer it that way to avoid having to pass in 0
|
| { |
| ASSERT(!state->isSweepInProgress()); |
| if (!acquireLoad(&m_canResume)) { |
| + // If we are leaving the safepoint from a SafePointAwareMutexLocker |
| + // call out to release the lock before going to sleep. This enables |
| + // lock to be acquired in the sweep phase, e.g. during weak processing |
|
Mads Ager (chromium)
2014/06/17 11:57:19
lock to be -> the lock to be
wibling-chromium
2014/06/17 12:06:40
Done.
|
| + // or finalization. The SafePointAwareLocker will reenter the safepoint |
| + // and reacquire the lock after leaving this safepoint. |
| + if (locker) |
| + locker->reset(); |
| pushAllRegisters(this, state, parkAfterPushRegisters); |
| state->performPendingSweep(); |
| } |
| @@ -201,10 +208,10 @@ public: |
| pushAllRegisters(this, state, enterSafePointAfterPushRegisters); |
| } |
| - void leaveSafePoint(ThreadState* state) |
| + void leaveSafePoint(ThreadState* state, SafePointAwareMutexLocker* locker = 0) |
| { |
| if (atomicIncrement(&m_unparkedThreadCount) > 0) |
| - checkAndPark(state); |
| + checkAndPark(state, locker); |
| } |
| private: |
| @@ -745,8 +752,11 @@ void ThreadState::safePoint(StackState stackState) |
| { |
| checkThread(); |
| performPendingGC(stackState); |
| + ASSERT(!m_atSafePoint); |
|
haraken
2014/06/17 12:25:41
Just to confirm: The SafePointAwareLocker is reent
wibling-chromium
2014/06/17 12:38:21
The SafePointAwareLocker is only entering the safe
haraken
2014/06/17 14:25:36
Thanks, makes a lot of sense!
|
| m_stackState = stackState; |
| + m_atSafePoint = true; |
| s_safePointBarrier->checkAndPark(this); |
| + m_atSafePoint = false; |
|
haraken
2014/06/17 12:25:41
Nice catch. We should have had these lines...
|
| m_stackState = HeapPointersOnStack; |
| } |
| @@ -791,11 +801,11 @@ void ThreadState::enterSafePoint(StackState stackState, void* scopeMarker) |
| s_safePointBarrier->enterSafePoint(this); |
| } |
| -void ThreadState::leaveSafePoint() |
| +void ThreadState::leaveSafePoint(SafePointAwareMutexLocker* locker) |
| { |
| checkThread(); |
| ASSERT(m_atSafePoint); |
| - s_safePointBarrier->leaveSafePoint(this); |
| + s_safePointBarrier->leaveSafePoint(this, locker); |
| m_atSafePoint = false; |
| m_stackState = HeapPointersOnStack; |
| clearSafePointScopeMarker(); |