blob: 18041dd15e4a3d2e49e7409838b10624c4f1666a [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include "garnet/lib/debug_ipc/debug/file_line_function.h"
#include "lib/fxl/macros.h"
#include "lib/fxl/time/stopwatch.h"
namespace debug_ipc {
// BlockTimer ------------------------------------------------------------------
// Simple RAII-esque timer that prints the duration of a block if running on
// debug mode.
//
// Normally you would use it from the TIME_BLOCK macro (defined below), that
// will easily add the current calling site, but you can add your own locations
// in order to proxy calls (see message_loop.cc for an example).
class BlockTimer {
public:
// If |msg| is not null, it will be added to the debug msg.
// The easier way is to used the TIME_BLOCK_MSG macro.
BlockTimer(FileLineFunction origin, const char* msg = nullptr);
~BlockTimer(); // Will log on destruction.
// This is what get called on destruction. You can call it before destruction
// to trigger the timer before that. Will not trigger again.
void EndTimer();
// BlockTimers should only measure the block they're in. No weird stuff.
FXL_DISALLOW_COPY_AND_ASSIGN(BlockTimer);
FXL_DISALLOW_MOVE(BlockTimer);
private:
FileLineFunction origin_; // Where this timer was called from.
fxl::Stopwatch timer_;
bool should_log_;
const char* msg_;
};
// We use this macro to ensure the concatenation of the values. Oh macros :)
#define TIME_BLOCK_TOKEN(x, y) x##y
#define TIME_BLOCK_TOKEN2(x, y) TIME_BLOCK_TOKEN(x, y)
#define TIME_BLOCK() \
::debug_ipc::BlockTimer TIME_BLOCK_TOKEN2(block_timer_, __LINE__)(FROM_HERE)
#define TIME_BLOCK_MSG(msg) \
::debug_ipc::BlockTimer TIME_BLOCK_TOKEN2(block_timer_, __LINE__)(FROM_HERE, \
msg)
} // namespace debug_ipc