Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: runtime/vm/profiler.cc

Issue 455833002: Only read PC marker when we are executing Dart code (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/utils.h" 5 #include "platform/utils.h"
6 6
7 #include "vm/allocation.h" 7 #include "vm/allocation.h"
8 #include "vm/atomic.h" 8 #include "vm/atomic.h"
9 #include "vm/code_patcher.h" 9 #include "vm/code_patcher.h"
10 #include "vm/isolate.h" 10 #include "vm/isolate.h"
(...skipping 1663 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 uword* fp = reinterpret_cast<uword*>(sample->fp()); 1674 uword* fp = reinterpret_cast<uword*>(sample->fp());
1675 uword* sp = reinterpret_cast<uword*>(sample->sp()); 1675 uword* sp = reinterpret_cast<uword*>(sample->sp());
1676 1676
1677 // If FP == SP, the pc marker hasn't been pushed. 1677 // If FP == SP, the pc marker hasn't been pushed.
1678 if (fp > sp) { 1678 if (fp > sp) {
1679 #if defined(TARGET_OS_WINDOWS) 1679 #if defined(TARGET_OS_WINDOWS)
1680 // If the fp is at the beginning of a page, it may be unsafe to access 1680 // If the fp is at the beginning of a page, it may be unsafe to access
1681 // the pc marker, because we are reading it from a different thread on 1681 // the pc marker, because we are reading it from a different thread on
1682 // Windows. The marker is below fp and the previous page may be a guard 1682 // Windows. The marker is below fp and the previous page may be a guard
1683 // page. 1683 // page.
1684 COMPILE_ASSERT(kPcMarkerSlotFromFp < 0);
1684 const intptr_t kPageMask = VirtualMemory::PageSize() - 1; 1685 const intptr_t kPageMask = VirtualMemory::PageSize() - 1;
1685 if ((sample->fp() & kPageMask) == 0) { 1686 if ((sample->fp() & kPageMask) == 0) {
1686 return; 1687 return;
1687 } 1688 }
1688 #endif 1689 #endif
1689 const uword pc_marker = *(fp + kPcMarkerSlotFromFp); 1690 const uword pc_marker = *(fp + kPcMarkerSlotFromFp);
1690 sample->set_pc_marker(pc_marker); 1691 sample->set_pc_marker(pc_marker);
1691 } 1692 }
1692 } 1693 }
1693 1694
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2041 ASSERT(counters != NULL); 2042 ASSERT(counters != NULL);
2042 counters->Increment(isolate->vm_tag()); 2043 counters->Increment(isolate->vm_tag());
2043 2044
2044 // Setup sample. 2045 // Setup sample.
2045 Sample* sample = sample_buffer->ReserveSample(); 2046 Sample* sample = sample_buffer->ReserveSample();
2046 sample->Init(isolate, OS::GetCurrentTimeMicros(), state.tid); 2047 sample->Init(isolate, OS::GetCurrentTimeMicros(), state.tid);
2047 sample->set_vm_tag(isolate->vm_tag()); 2048 sample->set_vm_tag(isolate->vm_tag());
2048 sample->set_user_tag(isolate->user_tag()); 2049 sample->set_user_tag(isolate->user_tag());
2049 sample->set_sp(state.sp); 2050 sample->set_sp(state.sp);
2050 sample->set_fp(state.fp); 2051 sample->set_fp(state.fp);
2051 #if !(defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64)) 2052 if (isolate->vm_tag() == VMTag::kDartTagId) {
2052 // It is never safe to read other thread's stack unless on Win64 2053 // We should only read the PC marker when executing Dart code.
2053 // other thread is inside Dart code. 2054 SetPCMarkerIfSafe(sample);
2054 SetPCMarkerIfSafe(sample); 2055 }
2055 #endif
2056
2057 // Walk the call stack. 2056 // Walk the call stack.
2058 if (FLAG_profile_vm) { 2057 if (FLAG_profile_vm) {
2059 // Always walk the native stack collecting both native and Dart frames. 2058 // Always walk the native stack collecting both native and Dart frames.
2060 ProfilerNativeStackWalker stackWalker(sample, 2059 ProfilerNativeStackWalker stackWalker(sample,
2061 stack_lower, 2060 stack_lower,
2062 stack_upper, 2061 stack_upper,
2063 state.pc, 2062 state.pc,
2064 state.fp, 2063 state.fp,
2065 state.sp); 2064 state.sp);
2066 stackWalker.walk(); 2065 stackWalker.walk();
(...skipping 25 matching lines...) Expand all
2092 stack_upper, 2091 stack_upper,
2093 state.pc, 2092 state.pc,
2094 state.fp, 2093 state.fp,
2095 state.sp); 2094 state.sp);
2096 stackWalker.walk(); 2095 stackWalker.walk();
2097 } 2096 }
2098 } 2097 }
2099 } 2098 }
2100 2099
2101 } // namespace dart 2100 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698