#ifndef BASE_TRACING_PERFETTO_TASK_RUNNER_H_
#define BASE_TRACING_PERFETTO_TASK_RUNNER_H_
#include "base/base_export.h"
#include "base/cancelable_callback.h"
#include "base/synchronization/lock.h"
#include "base/task/sequenced_task_runner.h"
#include "base/timer/timer.h"
#include "build/build_config.h"
#include "third_party/perfetto/include/perfetto/base/task_runner.h"
#if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA)
#include <map>
#include "base/files/file_descriptor_watcher_posix.h"
#endif
namespace base {
namespace tracing {
class BASE_EXPORT PerfettoTaskRunner : public perfetto::base::TaskRunner {
public:
explicit PerfettoTaskRunner(
scoped_refptr<base::SequencedTaskRunner> task_runner);
~PerfettoTaskRunner() override;
PerfettoTaskRunner(const PerfettoTaskRunner&) = delete;
void operator=(const PerfettoTaskRunner&) = delete;
void PostTask(std::function<void()> task) override;
void PostDelayedTask(std::function<void()> task, uint32_t delay_ms) override;
bool RunsTasksOnCurrentThread() const override;
void SetTaskRunner(scoped_refptr<base::SequencedTaskRunner> task_runner);
scoped_refptr<base::SequencedTaskRunner> GetOrCreateTaskRunner();
bool HasTaskRunner() const { return !!task_runner_; }
void AddFileDescriptorWatch(perfetto::base::PlatformHandle,
std::function<void()>) override;
void RemoveFileDescriptorWatch(perfetto::base::PlatformHandle) override;
void ResetTaskRunnerForTesting(
scoped_refptr<base::SequencedTaskRunner> task_runner);
private:
void OnDeferredTasksDrainTimer();
scoped_refptr<base::SequencedTaskRunner> task_runner_;
#if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA)
struct FDControllerAndCallback {
std::unique_ptr<base::FileDescriptorWatcher::Controller> controller;
base::CancelableOnceClosure callback;
FDControllerAndCallback();
~FDControllerAndCallback();
};
std::map<int, FDControllerAndCallback> fd_controllers_;
#endif
};
}
}
#endif