Fix race over RtcEventLogImpl::task_queue_
RtcEventLogImpl::task_queue_ is a std::unique_ptr<rtc::TaskQueue>. When a unique_ptr is destroyed, it first sets its internal pointer to point to null, and only then invokes the destructor of that object. However, the code in RtcEventLogImpl relies on rtc::TaskQueue's property, that its destructor blocks on executing tasks. We solve by manually invoking the destructor, and only resetting the internal pointer thereafter. In theory, we could have changed the unique_ptr to a raw pointer at this point. We avoid that, so as to keep the ownership clearer to readers of the code. Bug: webrtc:10085 Change-Id: I54bbf5d6bae019757ca2e31ee960d558058ccc42 Reviewed-on: https://webrtc-review.googlesource.com/c/112598 Commit-Queue: Elad Alon <eladalon@webrtc.org> Reviewed-by: Björn Terelius <terelius@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25875}
This commit is contained in:
@ -159,6 +159,12 @@ RtcEventLogImpl::~RtcEventLogImpl() {
|
||||
|
||||
// If we're logging to the output, this will stop that. Blocking function.
|
||||
StopLogging();
|
||||
|
||||
// We want to block on any executing task by invoking ~TaskQueue() before
|
||||
// we set unique_ptr's internal pointer to null.
|
||||
rtc::TaskQueue* tq = task_queue_.get();
|
||||
delete tq;
|
||||
task_queue_.release();
|
||||
}
|
||||
|
||||
bool RtcEventLogImpl::StartLogging(std::unique_ptr<RtcEventLogOutput> output,
|
||||
|
Reference in New Issue
Block a user