blob: f7108d7f0a1e7a09d78d0924492148a3ec988092 [file] [log] [blame]
// Copyright 2018 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 COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_EXECUTOR_H_
#define COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_EXECUTOR_H_
// Cronet sample is expected to be used outside of Chromium infrastructure,
// and as such has to rely on STL directly instead of //base alternatives.
#include <condition_variable>
#include <mutex>
#include <queue>
#include <thread>
#include "cronet_c.h"
// Sample implementation of Cronet_Executor interface using static
// methods to map C API into instance of C++ class.
class SampleExecutor {
public:
SampleExecutor();
~SampleExecutor();
// Gets Cronet_ExecutorPtr implemented by |this|.
Cronet_ExecutorPtr GetExecutor();
// Shuts down the executor, so all pending tasks are destroyed without
// getting executed.
void ShutdownExecutor();
private:
// Runs tasks in |task_queue_| until |stop_thread_loop_| is set to true.
void RunTasksInQueue();
static void ThreadLoop(SampleExecutor* executor);
// Adds |runnable| to |task_queue_| to execute on |executor_thread_|.
void Execute(Cronet_RunnablePtr runnable);
// Implementation of Cronet_Executor methods.
static void Execute(Cronet_ExecutorPtr self, Cronet_RunnablePtr runnable);
// Synchronise access to |task_queue_| and |stop_thread_loop_|;
std::mutex lock_;
// Tasks to run.
std::queue<Cronet_RunnablePtr> task_queue_;
// Notified if task is added to |task_queue_| or |stop_thread_loop_| is set.
std::condition_variable task_available_;
// Set to true to stop running tasks.
bool stop_thread_loop_ = false;
// Thread on which tasks are executed.
std::thread executor_thread_;
Cronet_ExecutorPtr const executor_;
};
#endif // COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_EXECUTOR_H_