Files
sdk/runtime/vm/runtime_entry.cc
T
Siva Annamalai 90750551f2 1. Avoid potential dead lock due to lock-order-inversion
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=3448)
  Cycle in lock order graph: M206 (0x7b18000006c0) => M202 (0x7b0c00000ff0) => M206

  Mutex M202 acquired here while holding mutex M206 in thread T5:
    #0 pthread_mutex_lock <null> (dart+0x00000058e8ee)
    #1 dart::Mutex::Lock() /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/os_thread_linux.cc:274 (dart+0x0000009bd79b)
    #2 MutexLocker /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/lockers.h:61 (dart+0x00000074a007)
    #3 dart::FreeList::TryAllocate(long, bool) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/freelist.cc:65 (dart+0x000000872d2c)
    #4 dart::PageSpace::TryAllocateInternal(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy, bool, bool) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.cc:392 (dart+0x0000009c0180)
    #5 dart::PageSpace::TryAllocate(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.h:195 (dart+0x000000877158)
    #6 dart::Heap::AllocateOld(long, dart::HeapPage::PageType) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:92 (dart+0x000000876f45)
    #7 dart::Heap::Allocate(long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.h:67 (dart+0x00000092ab33)

  Mutex M206 acquired here while holding mutex M202 in thread T5:
    #0 pthread_mutex_lock <null> (dart+0x00000058e8ee)
    #1 dart::Monitor::Enter() /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/os_thread_linux.cc:380 (dart+0x0000009be02b)
    #2 MonitorLocker /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/lockers.h:139 (dart+0x000000722f17)
    #3 SweeperTask /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/gc_sweeper.cc:112 (dart+0x000000b3391f)
    #4 dart::GCSweeper::SweepConcurrent(dart::Isolate*, dart::HeapPage*, dart::HeapPage*, dart::FreeList*) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/gc_sweeper.cc:171 (dart+0x000000b336e6)
    #5 dart::PageSpace::MarkSweep(bool) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.cc:952 (dart+0x0000009c1f6b)
    #6 dart::Heap::CollectOldSpaceGarbage(dart::Thread*, dart::Heap::ApiCallbacks, dart::Heap::GCReason) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:401 (dart+0x000000878e11)
    #7 dart::Heap::CollectAllGarbage() /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:444 (dart+0x000000877244)
    #8 dart::Heap::AllocateOld(long, dart::HeapPage::PageType) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:102 (dart+0x000000876fac)
    #9 dart::Heap::Allocate(long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.h:67 (dart+0x00000092ab33)

2. Remove unsafe access to usage data for an insignificant ASSERT.
WARNING: ThreadSanitizer: data race (pid=7617)
  Atomic write of size 8 at 0x7b840000fdf0 by thread T4:
    #0 __tsan_atomic64_fetch_add <null> (dart+0x0000005b59e7)
    #1 dart::AtomicOperations::IncrementBy(long*, long) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/atomic_linux.h:30 (dart+0x00000076a235)
    #2 dart::PageSpace::TryAllocateInternal(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy, bool, bool) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.cc:398 (dart+0x0000009c0233)
    #3 dart::PageSpace::TryAllocate(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.h:195 (dart+0x000000877158)
    #4 dart::Heap::AllocateOld(long, dart::HeapPage::PageType) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:82 (dart+0x000000876eec)
    #5 dart::Heap::Allocate(long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.h:67 (dart+0x00000092ab33)
    #6 dart::Object::Allocate(long, long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/object.cc:1866 (dart+0x00000092dd92)

  Previous read of size 8 at 0x7b840000fdf0 by thread T3:
    #0 dart::PageSpace::TryAllocateInternal(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy, bool, bool) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.cc:426 (dart+0x0000009c026b)
    #1 dart::PageSpace::TryAllocate(long, dart::HeapPage::PageType, dart::PageSpace::GrowthPolicy) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/pages.h:195 (dart+0x000000877158)
    #2 dart::Heap::AllocateOld(long, dart::HeapPage::PageType) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.cc:82 (dart+0x000000876eec)
    #3 dart::Heap::Allocate(long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/heap.h:67 (dart+0x00000092ab33)
    #4 dart::Object::Allocate(long, long, dart::Heap::Space) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/object.cc:1866 (dart+0x00000092dd92)
    #5 dart::StackMap::New(long, dart::BitmapBuilder*, long) /usr/local/google/home/asiva/workspace/dart-ws3/sdk/out/DebugX64/../../runtime/vm/object.cc:12164 (dart+0x00000096796a)

R=vegorov@google.com

Review-Url: https://codereview.chromium.org/2609643002 .
2017-01-05 11:27:10 -08:00

47 lines
1.7 KiB
C++

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "vm/runtime_entry.h"
#include "vm/object.h"
#include "vm/symbols.h"
#include "vm/verifier.h"
namespace dart {
#if defined(TESTING) || defined(DEBUG)
void VerifyOnTransition() {
Thread* thread = Thread::Current();
TransitionGeneratedToVM transition(thread);
thread->isolate()->heap()->WaitForSweeperTasks(thread);
SafepointOperationScope safepoint_scope(thread);
VerifyPointersVisitor::VerifyPointers();
thread->isolate()->heap()->Verify();
}
#endif
// Add function to a class and that class to the class dictionary so that
// frame walking can be used.
const Function& RegisterFakeFunction(const char* name, const Code& code) {
Thread* thread = Thread::Current();
const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Library& lib = Library::Handle(Library::CoreLibrary());
const Class& owner_class = Class::Handle(
Class::New(lib, class_name, script, TokenPosition::kNoSource));
const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
const Function& function = Function::ZoneHandle(Function::New(
function_name, RawFunction::kRegularFunction, true, false, false, false,
false, owner_class, TokenPosition::kMinSource));
const Array& functions = Array::Handle(Array::New(1));
functions.SetAt(0, function);
owner_class.SetFunctions(functions);
lib.AddClass(owner_class);
function.AttachCode(code);
return function;
}
} // namespace dart