#ifndef FML_SHELL_COMMON_TASK_RUNNER_MERGER_H_
#define FML_SHELL_COMMON_TASK_RUNNER_MERGER_H_
#include "flutter/fml/macros.h"
#include "flutter/fml/memory/ref_counted.h"
#include "flutter/fml/message_loop_task_queues.h"
namespace fml {
class MessageLoopImpl;
enum class GpuThreadStatus { kRemainsMerged, kRemainsUnmerged, kUnmergedNow };
class GpuThreadMerger : public fml::RefCountedThreadSafe<GpuThreadMerger> {
public:
void MergeWithLease(size_t lease_term);
void ExtendLeaseTo(size_t lease_term);
GpuThreadStatus DecrementLease();
bool IsMerged() const;
GpuThreadMerger(fml::TaskQueueId platform_queue_id,
fml::TaskQueueId gpu_queue_id);
bool IsOnRasterizingThread();
private:
static const int kLeaseNotSet;
fml::TaskQueueId platform_queue_id_;
fml::TaskQueueId gpu_queue_id_;
fml::RefPtr<fml::MessageLoopTaskQueues> task_queues_;
std::atomic_int lease_term_;
bool is_merged_;
FML_FRIEND_REF_COUNTED_THREAD_SAFE(GpuThreadMerger);
FML_FRIEND_MAKE_REF_COUNTED(GpuThreadMerger);
FML_DISALLOW_COPY_AND_ASSIGN(GpuThreadMerger);
};
}
#endif