Improve documentation of PendingTaskSafety
Bug: none Change-Id: Iff9bf0e1965663581ba34f45f71b9cf23032af7a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/207164 Reviewed-by: Tommi <tommi@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33250}
This commit is contained in:

committed by
Commit Bot

parent
bc1cdef4e8
commit
76d30a507d
@ -19,16 +19,22 @@
|
|||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
// Use this flag to drop pending tasks that have been posted to the "main"
|
// The PendingTaskSafetyFlag and the ScopedTaskSafety are designed to address
|
||||||
// thread/TQ and end up running after the owning instance has been
|
// the issue where you have a task to be executed later that has references,
|
||||||
// deleted. The owning instance signals deletion by calling SetNotAlive() from
|
// but cannot guarantee that the referenced object is alive when the task is
|
||||||
// its destructor.
|
// executed.
|
||||||
//
|
|
||||||
|
// This mechanism can be used with tasks that are created and destroyed
|
||||||
|
// on a single thread / task queue, and with tasks posted to the same
|
||||||
|
// thread/task queue, but tasks can be posted from any thread/TQ.
|
||||||
|
|
||||||
|
// Typical usage:
|
||||||
// When posting a task, post a copy (capture by-value in a lambda) of the flag
|
// When posting a task, post a copy (capture by-value in a lambda) of the flag
|
||||||
// instance and before performing the work, check the |alive()| state. Abort if
|
// reference and before performing the work, check the |alive()| state. Abort if
|
||||||
// alive() returns |false|:
|
// alive() returns |false|:
|
||||||
//
|
//
|
||||||
// // Running outside of the main thread.
|
// class ExampleClass {
|
||||||
|
// ....
|
||||||
// my_task_queue_->PostTask(ToQueuedTask(
|
// my_task_queue_->PostTask(ToQueuedTask(
|
||||||
// [safety = pending_task_safety_flag_, this]() {
|
// [safety = pending_task_safety_flag_, this]() {
|
||||||
// // Now running on the main thread.
|
// // Now running on the main thread.
|
||||||
@ -36,15 +42,19 @@ namespace webrtc {
|
|||||||
// return;
|
// return;
|
||||||
// MyMethod();
|
// MyMethod();
|
||||||
// }));
|
// }));
|
||||||
|
// ....
|
||||||
|
// ~ExampleClass() {
|
||||||
|
// pending_task_safety_flag_->SetNotAlive();
|
||||||
|
// }
|
||||||
|
// scoped_refptr<PendingTaskSafetyFlag> pending_task_safety_flag_
|
||||||
|
// = PendingTaskSafetyFlag::Create();
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// Or implicitly by letting ToQueuedTask do the checking:
|
// ToQueuedTask has an overload that makes this check automatic:
|
||||||
//
|
//
|
||||||
// // Running outside of the main thread.
|
|
||||||
// my_task_queue_->PostTask(ToQueuedTask(pending_task_safety_flag_,
|
// my_task_queue_->PostTask(ToQueuedTask(pending_task_safety_flag_,
|
||||||
// [this]() { MyMethod(); }));
|
// [this]() { MyMethod(); }));
|
||||||
//
|
//
|
||||||
// Note that checking the state only works on the construction/destruction
|
|
||||||
// thread of the ReceiveStatisticsProxy instance.
|
|
||||||
class PendingTaskSafetyFlag : public rtc::RefCountInterface {
|
class PendingTaskSafetyFlag : public rtc::RefCountInterface {
|
||||||
public:
|
public:
|
||||||
static rtc::scoped_refptr<PendingTaskSafetyFlag> Create();
|
static rtc::scoped_refptr<PendingTaskSafetyFlag> Create();
|
||||||
@ -62,11 +72,22 @@ class PendingTaskSafetyFlag : public rtc::RefCountInterface {
|
|||||||
RTC_NO_UNIQUE_ADDRESS SequenceChecker main_sequence_;
|
RTC_NO_UNIQUE_ADDRESS SequenceChecker main_sequence_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Makes using PendingTaskSafetyFlag very simple. Automatic PTSF creation
|
// The ScopedTaskSafety makes using PendingTaskSafetyFlag very simple.
|
||||||
// and signalling of destruction when the ScopedTaskSafety instance goes out
|
// It does automatic PTSF creation and signalling of destruction when the
|
||||||
// of scope.
|
// ScopedTaskSafety instance goes out of scope.
|
||||||
// Should be used by the class that wants tasks dropped after destruction.
|
//
|
||||||
// Requirements are that the instance be constructed and destructed on
|
// ToQueuedTask has an overload that takes a ScopedTaskSafety too, so there
|
||||||
|
// is no need to explicitly call the "flag" method.
|
||||||
|
//
|
||||||
|
// Example usage:
|
||||||
|
//
|
||||||
|
// my_task_queue->PostTask(ToQueuedTask(scoped_task_safety,
|
||||||
|
// [this]() {
|
||||||
|
// // task goes here
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This should be used by the class that wants tasks dropped after destruction.
|
||||||
|
// The requirement is that the instance has to be constructed and destructed on
|
||||||
// the same thread as the potentially dropped tasks would be running on.
|
// the same thread as the potentially dropped tasks would be running on.
|
||||||
class ScopedTaskSafety {
|
class ScopedTaskSafety {
|
||||||
public:
|
public:
|
||||||
|
Reference in New Issue
Block a user