Index: webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc |
diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc b/webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc |
index e908ccd5fb1bdfb4ff93665119dac1d056acc438..d8b6f09ca8e0abe695c1e6304d961bd0c94f8f93 100644 |
--- a/webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc |
+++ b/webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc |
@@ -27,8 +27,11 @@ |
#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
#include "webrtc/rtc_base/buffer.h" |
#include "webrtc/rtc_base/checks.h" |
+#include "webrtc/rtc_base/event.h" |
#include "webrtc/rtc_base/fakeclock.h" |
+#include "webrtc/rtc_base/ptr_util.h" |
#include "webrtc/rtc_base/random.h" |
+#include "webrtc/rtc_base/task_queue.h" |
#include "webrtc/test/gtest.h" |
#include "webrtc/test/testsupport/fileutils.h" |
@@ -397,6 +400,61 @@ void LogSessionAndReadBack(size_t rtp_count, |
remove(temp_filename.c_str()); |
} |
+const char* const TAG = "GREP_ME"; |
+ |
+class BlockTask : public rtc::QueuedTask { |
+ public: |
+ explicit BlockTask(int wait_time_ms) : wait_time_ms_(wait_time_ms) {} |
+ |
+ ~BlockTask() override { |
+ printf("%s ~BlockTask()\n", TAG); |
+ } |
+ |
+ bool Run() override { |
+ rtc::Event waiter(true, false); |
+ printf("%s BlockTask: Waiting.\n", TAG); |
+ waiter.Wait(wait_time_ms_); |
+ printf("%s BlockTask: Wait complete.\n", TAG); |
+ return true; |
+ } |
+ |
+ int wait_time_ms_; |
+}; |
+ |
+class PrinterTask : public rtc::QueuedTask { |
+ public: |
+ explicit PrinterTask(size_t id) : id_(id) {} |
+ |
+ ~PrinterTask() override { |
+ printf("%s ~PrinterTask(%lu)\n", TAG, id_); |
+ } |
+ |
+ bool Run() override { |
+ printf("%s PrinterTask(%lu)::Run()\n", TAG, id_); |
+ return true; |
+ } |
+ |
+ size_t id_; |
+}; |
+ |
+TEST(RandomLocationTest, ShowTaskQueueProblem) { |
+ std::unique_ptr<rtc::TaskQueue> queue = |
+ rtc::MakeUnique<rtc::TaskQueue>("queue"); |
+ |
+ // This task will block for a bit. |
+ queue->PostTask(rtc::WrapUnique<rtc::QueuedTask>(new BlockTask(2000))); |
+ |
+ // These tasks still get executed, despite the TaskQueue's destructor having |
+ // been invoked while they were still pending. |
+ for (int i = 0; i < 10; i++) { |
+ queue->PostTask(rtc::WrapUnique<rtc::QueuedTask>(new PrinterTask(i))); |
+ } |
+ |
+ printf("%s About to invoke ~TaskQueue()\n", TAG); |
+ queue.reset(); |
+ printf("%s ~TaskQueue() finished.\n", TAG); |
+} |
+ |
TEST(RtcEventLogTest, LogSessionAndReadBack) { |
// Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events |
// with no header extensions or CSRCS. |