6d313d3797
R=johnmccutchan@google.com, turnidge@google.com Review URL: https://codereview.chromium.org//137483010 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32930 260f80e4-7a28-3924-810f-c04153c831b5
145 lines
3.8 KiB
C++
145 lines
3.8 KiB
C++
// Copyright (c) 2014, 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.
|
|
|
|
#ifndef VM_TIMER_SCOPE_H_
|
|
#define VM_TIMER_SCOPE_H_
|
|
|
|
#include "vm/allocation.h"
|
|
#include "vm/flags.h"
|
|
#include "vm/os.h"
|
|
#include "vm/timer.h"
|
|
|
|
namespace dart {
|
|
|
|
// Transition from executing VM code to executing Native code.
|
|
class VmToNativeTimerScope : public ValueObject {
|
|
public:
|
|
explicit VmToNativeTimerScope(Isolate* isolate) {
|
|
native_timer_ = &(isolate->timer_list().time_native_execution());
|
|
native_timer_->Start();
|
|
}
|
|
~VmToNativeTimerScope() {
|
|
native_timer_->Stop();
|
|
}
|
|
|
|
private:
|
|
Timer* native_timer_;
|
|
DISALLOW_COPY_AND_ASSIGN(VmToNativeTimerScope);
|
|
};
|
|
|
|
// Transition from executing Native code to executing VM code.
|
|
class NativeToVmTimerScope : public ValueObject {
|
|
public:
|
|
explicit NativeToVmTimerScope(Isolate* isolate)
|
|
: dart_running_(false),
|
|
timer_list_(&(isolate->timer_list())) {
|
|
Timer* dart_timer = &(timer_list_->time_dart_execution());
|
|
// Currently when a native function is setup without the auto scope
|
|
// setup parameter (leaf function) we would have the dart timer still
|
|
// running as we have not done any transitioning. If for some reason
|
|
// such a native function makes API call backs we should account for
|
|
// that.
|
|
if (dart_timer->running()) {
|
|
dart_running_ = true;
|
|
dart_timer->Stop();
|
|
} else {
|
|
Timer* native_timer = &(timer_list_->time_native_execution());
|
|
native_timer->Stop();
|
|
}
|
|
}
|
|
~NativeToVmTimerScope() {
|
|
if (dart_running_) {
|
|
Timer* dart_timer = &(timer_list_->time_dart_execution());
|
|
dart_timer->Start();
|
|
} else {
|
|
Timer* native_timer = &(timer_list_->time_native_execution());
|
|
native_timer->Start();
|
|
}
|
|
}
|
|
|
|
private:
|
|
bool dart_running_;
|
|
TimerList* timer_list_;
|
|
DISALLOW_COPY_AND_ASSIGN(NativeToVmTimerScope);
|
|
};
|
|
|
|
// Transition from executing Dart code to executing Native code.
|
|
class DartToNativeTimerScope : public ValueObject {
|
|
public:
|
|
explicit DartToNativeTimerScope(Isolate* isolate) {
|
|
dart_timer_ = &(isolate->timer_list().time_dart_execution());
|
|
native_timer_ = &(isolate->timer_list().time_native_execution());
|
|
dart_timer_->Stop();
|
|
native_timer_->Start();
|
|
}
|
|
~DartToNativeTimerScope() {
|
|
native_timer_->Stop();
|
|
dart_timer_->Start();
|
|
}
|
|
|
|
private:
|
|
Timer* native_timer_;
|
|
Timer* dart_timer_;
|
|
DISALLOW_COPY_AND_ASSIGN(DartToNativeTimerScope);
|
|
};
|
|
|
|
// Transition from executing Dart code to executing VM code.
|
|
class DartToVmTimerScope : public ValueObject {
|
|
public:
|
|
explicit DartToVmTimerScope(Isolate* isolate) {
|
|
dart_timer_ = &(isolate->timer_list().time_dart_execution());
|
|
dart_timer_->Stop();
|
|
}
|
|
~DartToVmTimerScope() {
|
|
dart_timer_->Start();
|
|
}
|
|
|
|
private:
|
|
Timer* dart_timer_;
|
|
DISALLOW_COPY_AND_ASSIGN(DartToVmTimerScope);
|
|
};
|
|
|
|
// The class TimerScope is used to start and stop a timer within a scope.
|
|
// It is used as follows:
|
|
// {
|
|
// TIMERSCOPE(name_of_timer);
|
|
// ....
|
|
// .....
|
|
// code that needs to be timed.
|
|
// ....
|
|
// }
|
|
class TimerScope : public StackResource {
|
|
public:
|
|
TimerScope(bool flag, Timer* timer, BaseIsolate* isolate)
|
|
: StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
|
|
if (flag_) {
|
|
if (!timer_->running()) {
|
|
timer_->Start();
|
|
} else {
|
|
nested_ = true;
|
|
}
|
|
}
|
|
}
|
|
~TimerScope() {
|
|
if (flag_) {
|
|
if (!nested_) {
|
|
timer_->Stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
bool flag_;
|
|
bool nested_;
|
|
Timer* timer_;
|
|
DISALLOW_COPY_AND_ASSIGN(TimerScope);
|
|
};
|
|
|
|
#define TIMERSCOPE(isolate, name) \
|
|
TimerScope vm_internal_timer_(true, &(isolate->timer_list().name()), isolate)
|
|
|
|
} // namespace dart
|
|
|
|
#endif // VM_TIMER_SCOPE_H_
|