1 /* 2 * Copyright 2019 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #ifndef API_TASK_QUEUE_TASK_QUEUE_BASE_H_ 11 #define API_TASK_QUEUE_TASK_QUEUE_BASE_H_ 12 13 #include <memory> 14 15 #include "api/task_queue/queued_task.h" 16 #include "rtc_base/system/rtc_export.h" 17 #include "rtc_base/thread_annotations.h" 18 19 namespace webrtc { 20 21 // Asynchronously executes tasks in a way that guarantees that they're executed 22 // in FIFO order and that tasks never overlap. Tasks may always execute on the 23 // same worker thread and they may not. To DCHECK that tasks are executing on a 24 // known task queue, use IsCurrent(). 25 class RTC_LOCKABLE RTC_EXPORT TaskQueueBase { 26 public: 27 // Starts destruction of the task queue. 28 // On return ensures no task are running and no new tasks are able to start 29 // on the task queue. 30 // Responsible for deallocation. Deallocation may happen syncrhoniously during 31 // Delete or asynchronously after Delete returns. 32 // Code not running on the TaskQueue should not make any assumption when 33 // TaskQueue is deallocated and thus should not call any methods after Delete. 34 // Code running on the TaskQueue should not call Delete, but can assume 35 // TaskQueue still exists and may call other methods, e.g. PostTask. 36 virtual void Delete() = 0; 37 38 // Schedules a task to execute. Tasks are executed in FIFO order. 39 // If |task->Run()| returns true, task is deleted on the task queue 40 // before next QueuedTask starts executing. 41 // When a TaskQueue is deleted, pending tasks will not be executed but they 42 // will be deleted. The deletion of tasks may happen synchronously on the 43 // TaskQueue or it may happen asynchronously after TaskQueue is deleted. 44 // This may vary from one implementation to the next so assumptions about 45 // lifetimes of pending tasks should not be made. 46 virtual void PostTask(std::unique_ptr<QueuedTask> task) = 0; 47 48 // Schedules a task to execute a specified number of milliseconds from when 49 // the call is made. The precision should be considered as "best effort" 50 // and in some cases, such as on Windows when all high precision timers have 51 // been used up, can be off by as much as 15 millseconds. 52 virtual void PostDelayedTask(std::unique_ptr<QueuedTask> task, 53 uint32_t milliseconds) = 0; 54 55 // Returns the task queue that is running the current thread. 56 // Returns nullptr if this thread is not associated with any task queue. 57 static TaskQueueBase* Current(); IsCurrent()58 bool IsCurrent() const { return Current() == this; } 59 60 protected: 61 class CurrentTaskQueueSetter { 62 public: 63 explicit CurrentTaskQueueSetter(TaskQueueBase* task_queue); 64 CurrentTaskQueueSetter(const CurrentTaskQueueSetter&) = delete; 65 CurrentTaskQueueSetter& operator=(const CurrentTaskQueueSetter&) = delete; 66 ~CurrentTaskQueueSetter(); 67 68 private: 69 TaskQueueBase* const previous_; 70 }; 71 72 // Users of the TaskQueue should call Delete instead of directly deleting 73 // this object. 74 virtual ~TaskQueueBase() = default; 75 }; 76 77 struct TaskQueueDeleter { operatorTaskQueueDeleter78 void operator()(TaskQueueBase* task_queue) const { task_queue->Delete(); } 79 }; 80 81 } // namespace webrtc 82 83 #endif // API_TASK_QUEUE_TASK_QUEUE_BASE_H_ 84