/* * Copyright 2018 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
// Signaled whenever a new task is pending.
rtc::Event flag_notify_;
Mutex pending_lock_;
// Indicates if the worker thread needs to shutdown now. bool thread_should_quit_ RTC_GUARDED_BY(pending_lock_) = false;
// Holds the next order to use for the next task to be // put into one of the pending queues.
OrderId thread_posting_order_ RTC_GUARDED_BY(pending_lock_) = 0;
// The list of all pending tasks that need to be processed in the // FIFO queue ordering on the worker thread.
std::queue<std::pair<OrderId, absl::AnyInvocable<void() &&>>> pending_queue_
RTC_GUARDED_BY(pending_lock_);
// The list of all pending tasks that need to be processed at a future // time based upon a delay. On the off change the delayed task should // happen at exactly the same time interval as another task then the // task is processed based on FIFO ordering. std::priority_queue was // considered but rejected due to its inability to extract the // move-only value out of the queue without the presence of a hack.
std::map<DelayedEntryTimeout, absl::AnyInvocable<void() &&>> delayed_queue_
RTC_GUARDED_BY(pending_lock_);
// Contains the active worker thread assigned to processing // tasks (including delayed tasks). // Placing this last ensures the thread doesn't touch uninitialized attributes // throughout it's lifetime.
rtc::PlatformThread thread_;
};
// Ensure remaining deleted tasks are destroyed with Current() set up to this // task queue.
std::queue<std::pair<OrderId, absl::AnyInvocable<void() &&>>> pending_queue;
{
MutexLock lock(&pending_lock_);
pending_queue_.swap(pending_queue);
}
pending_queue = {}; #if RTC_DCHECK_IS_ON
MutexLock lock(&pending_lock_);
RTC_DCHECK(pending_queue_.empty()); #endif
}
void TaskQueueStdlib::NotifyWake() { // The queue holds pending tasks to complete. Either tasks are to be // executed immediately or tasks are to be run at some future delayed time. // For immediate tasks the task queue's thread is busy running the task and // the thread will not be waiting on the flag_notify_ event. If no immediate // tasks are available but a delayed task is pending then the thread will be // waiting on flag_notify_ with a delayed time-out of the nearest timed task // to run. If no immediate or pending tasks are available, the thread will // wait on flag_notify_ until signaled that a task has been added (or the // thread to be told to shutdown).
// In all cases, when a new immediate task, delayed task, or request to // shutdown the thread is added the flag_notify_ is signaled after. If the // thread was waiting then the thread will wake up immediately and re-assess // what task needs to be run next (i.e. run a task now, wait for the nearest // timed delayed task, or shutdown the thread). If the thread was not waiting // then the thread will remained signaled to wake up the next time any // attempt to wait on the flag_notify_ event occurs.
// Any immediate or delayed pending task (or request to shutdown the thread) // must always be added to the queue prior to signaling flag_notify_ to wake // up the possibly sleeping thread. This prevents a race condition where the // thread is notified to wake up but the task queue's thread finds nothing to // do so it waits once again to be signaled where such a signal may never // happen.
flag_notify_.Set();
}
class TaskQueueStdlibFactory final : public TaskQueueFactory { public:
std::unique_ptr<TaskQueueBase, TaskQueueDeleter> CreateTaskQueue(
absl::string_view name,
Priority priority) const override { return std::unique_ptr<TaskQueueBase, TaskQueueDeleter>( new TaskQueueStdlib(name, TaskQueuePriorityToThreadPriority(priority)));
}
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.