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

Unified Diff: runtime/vm/isolate.cc

Issue 25909002: Sampling profiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/isolate.cc
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b89db64127603e35e642051b503d8e6f1a61d801..bc5f163e305172cc3b04972b42df746ecebf5f57 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -22,8 +22,10 @@
#include "vm/object_store.h"
#include "vm/parser.h"
#include "vm/port.h"
+#include "vm/profiler.h"
#include "vm/reusable_handles.h"
#include "vm/service.h"
+#include "vm/signal_handler.h"
#include "vm/simulator.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
@@ -309,6 +311,8 @@ Isolate::Isolate()
stack_frame_index_(-1),
object_histogram_(NULL),
object_id_ring_(NULL),
+ profiler_data_(NULL),
+ profiler_data_mutex_(new Mutex()),
REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
reusable_handles_() {
if (FLAG_print_object_histogram && (Dart::vm_isolate() != NULL)) {
@@ -330,6 +334,8 @@ Isolate::~Isolate() {
#endif
delete mutex_;
mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate.
+ delete profiler_data_mutex_;
+ profiler_data_mutex_ = NULL;
delete message_handler_;
message_handler_ = NULL; // Fail fast if we send messages to a dead isolate.
ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted.
@@ -337,7 +343,15 @@ Isolate::~Isolate() {
}
void Isolate::SetCurrent(Isolate* current) {
+ ScopedSignalBlocker ssb;
+ Isolate* old_isolate = Current();
+ if (old_isolate != NULL) {
+ ProfilerManager::DescheduleIsolate(old_isolate);
+ }
Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current));
+ if (current != NULL) {
+ ProfilerManager::ScheduleIsolate(current);
+ }
}
@@ -397,6 +411,10 @@ Isolate* Isolate::Init(const char* name_prefix) {
"\tisolate: %s\n", result->name());
}
}
+
+ // Setup for profiling.
+ ProfilerManager::SetupIsolateForProfiling(result);
+
return result;
}
@@ -444,6 +462,21 @@ void Isolate::SetStackLimit(uword limit) {
}
+bool Isolate::GetStackBounds(uintptr_t* lower, uintptr_t* upper) {
+ uintptr_t stack_lower = stack_limit();
+ if (stack_lower == static_cast<uintptr_t>(~0)) {
+ stack_lower = saved_stack_limit();
+ }
+ if (stack_lower == static_cast<uintptr_t>(~0)) {
+ return false;
+ }
+ uintptr_t stack_upper = stack_lower + GetSpecifiedStackSize();
+ *lower = stack_lower;
+ *upper = stack_upper;
+ return true;
+}
+
+
void Isolate::ScheduleInterrupts(uword interrupt_bits) {
// TODO(turnidge): Can't use MutexLocker here because MutexLocker is
// a StackResource, which requires a current isolate. Should
@@ -674,6 +707,13 @@ void Isolate::Shutdown() {
StackZone stack_zone(this);
HandleScope handle_scope(this);
+ ScopedSignalBlocker ssb;
+
+ ProfilerManager::DescheduleIsolate(this);
+
+ // ProfilerManager::WriteTracing(this, this->name(), this->main_port());
siva 2013/11/11 03:51:54 why is this commented out?
Cutch 2013/11/18 20:48:54 Was for debugging. Removed.
+
+
if (FLAG_print_object_histogram) {
heap()->CollectAllGarbage();
object_histogram()->Print();
@@ -715,6 +755,7 @@ void Isolate::Shutdown() {
// TODO(5411455): For now just make sure there are no current isolates
// as we are shutting down the isolate.
SetCurrent(NULL);
+ ProfilerManager::ShutdownIsolateForProfiling(this);
}

Powered by Google App Engine
This is Rietveld 408576698