diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h b/chromium/third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h new file mode 100644 index 00000000000..1cd7ee89188 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h @@ -0,0 +1,73 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_UTIL_THREAD_LOAD_TRACKER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_UTIL_THREAD_LOAD_TRACKER_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "base/time/time.h" +#include "third_party/blink/renderer/platform/platform_export.h" + +namespace blink { +namespace scheduler { + +// This class tracks thread load level, i.e. percentage of wall time spent +// running tasks. +// In order to avoid bias it reports load level at regular intervals. +// Every |reporting_interval_| time units, it reports the average thread load +// level computed using a sliding window of width |reporting_interval_|. +class PLATFORM_EXPORT ThreadLoadTracker { + public: + // Callback is called with (current_time, load_level) parameters. + using Callback = base::RepeatingCallback<void(base::TimeTicks, double)>; + + ThreadLoadTracker(base::TimeTicks now, + const Callback& callback, + base::TimeDelta reporting_interval); + ~ThreadLoadTracker(); + + void Pause(base::TimeTicks now); + void Resume(base::TimeTicks now); + + // Note: this does not change |thread_state_|. + void Reset(base::TimeTicks now); + + void RecordTaskTime(base::TimeTicks start_time, base::TimeTicks end_time); + + void RecordIdle(base::TimeTicks now); + + // TODO(altimin): Count wake-ups. + + private: + enum class ThreadState { kActive, kPaused }; + + enum class TaskState { kTaskRunning, kIdle }; + + // This function advances |time_| to |now|, calling |callback_| + // in the process (multiple times if needed). + void Advance(base::TimeTicks now, TaskState task_state); + + double Load(); + + // |time_| is the last timestamp LoadTracker knows about. + base::TimeTicks time_; + base::TimeTicks next_reporting_time_; + + ThreadState thread_state_; + base::TimeTicks last_state_change_time_; + + base::TimeDelta reporting_interval_; + + // Recorded run time in window + // [next_reporting_time - reporting_interval, next_reporting_time]. + base::TimeDelta run_time_inside_window_; + + Callback callback_; +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_UTIL_THREAD_LOAD_TRACKER_H_ |