1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-05 09:20:04 +00:00

[vm/concurrency] Allow calling SafepointRwLock::IsCurrentThreadReader() inside safepoint operation scope

Currently `IsCurrentThreadReader()` can only be called outside
safepoint operations. We'll loosen that restriction for future CLs
which require calling this method inside safepoint operations.

Change-Id: I23a99cc535df47c1dbd41f92e29e669e7ddd921f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170685
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Martin Kustermann 2020-11-06 14:46:22 +00:00 committed by commit-bot@chromium.org
parent 466f2fd8a7
commit 391bc8d33d

View File

@ -322,11 +322,11 @@ class SafepointRwLock {
#if defined(DEBUG)
bool IsCurrentThreadReader() {
SafepointMonitorLocker ml(&monitor_);
ThreadId id = OSThread::GetCurrentThreadId();
if (IsCurrentThreadWriter()) {
return true;
}
MutexLocker ml(&reader_ids_mutex_);
for (intptr_t i = readers_ids_.length() - 1; i >= 0; i--) {
if (readers_ids_.At(i) == id) {
return true;
@ -356,7 +356,10 @@ class SafepointRwLock {
ml.Wait();
}
#if defined(DEBUG)
readers_ids_.Add(OSThread::GetCurrentThreadId());
{
MutexLocker ml(&reader_ids_mutex_);
readers_ids_.Add(OSThread::GetCurrentThreadId());
}
#endif
++state_;
return true;
@ -365,16 +368,19 @@ class SafepointRwLock {
SafepointMonitorLocker ml(&monitor_);
ASSERT(state_ > 0);
#if defined(DEBUG)
intptr_t i = readers_ids_.length() - 1;
ThreadId id = OSThread::GetCurrentThreadId();
while (i >= 0) {
if (readers_ids_.At(i) == id) {
readers_ids_.RemoveAt(i);
break;
{
MutexLocker ml(&reader_ids_mutex_);
intptr_t i = readers_ids_.length() - 1;
ThreadId id = OSThread::GetCurrentThreadId();
while (i >= 0) {
if (readers_ids_.At(i) == id) {
readers_ids_.RemoveAt(i);
break;
}
i--;
}
i--;
ASSERT(i >= 0);
}
ASSERT(i >= 0);
#endif
if (--state_ == 0) {
ml.NotifyAll();
@ -411,6 +417,7 @@ class SafepointRwLock {
intptr_t state_ = 0;
#if defined(DEBUG)
Mutex reader_ids_mutex_;
MallocGrowableArray<ThreadId> readers_ids_;
#endif
ThreadId writer_id_ = OSThread::kInvalidThreadId;