Add a debug-only guard to check if code is running on the task runner

Change-Id: I10953bf5bb0c7f823c15d3bf3640a03a9c2ff43d
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/1815070
Commit-Queue: Max Yakimakha <yakimakha@chromium.org>
Reviewed-by: Jordan Bayles <jophba@chromium.org>
diff --git a/platform/impl/network_reader_unittest.cc b/platform/impl/network_reader_unittest.cc
index 02e1c30..b6a3c58 100644
--- a/platform/impl/network_reader_unittest.cc
+++ b/platform/impl/network_reader_unittest.cc
@@ -73,6 +73,8 @@
     t();
   }
 
+  bool IsRunningOnTaskRunner() override { return true; }
+
   uint32_t tasks_posted;
   uint32_t delayed_tasks_posted;
 };
diff --git a/platform/impl/task_runner.cc b/platform/impl/task_runner.cc
index 0f142ed..3e957a1 100644
--- a/platform/impl/task_runner.cc
+++ b/platform/impl/task_runner.cc
@@ -43,7 +43,12 @@
   }
 }
 
+bool TaskRunnerImpl::IsRunningOnTaskRunner() {
+  return task_runner_thread_id_ == std::this_thread::get_id();
+}
+
 void TaskRunnerImpl::RunUntilStopped() {
+  task_runner_thread_id_ = std::this_thread::get_id();
   const bool was_running = is_running_.exchange(true);
   OSP_CHECK(!was_running);
 
@@ -115,6 +120,7 @@
     ScheduleDelayedTasks();
     RunCurrentTasksBlocking();
   }
+  task_runner_thread_id_ = std::thread::id();
 }
 
 void TaskRunnerImpl::ScheduleDelayedTasks() {
diff --git a/platform/impl/task_runner.h b/platform/impl/task_runner.h
index f80641d..569b747 100644
--- a/platform/impl/task_runner.h
+++ b/platform/impl/task_runner.h
@@ -10,6 +10,7 @@
 #include <map>
 #include <memory>
 #include <mutex>  // NOLINT
+#include <thread>
 #include <utility>
 #include <vector>
 
@@ -56,6 +57,7 @@
   ~TaskRunnerImpl() final;
   void PostPackagedTask(Task task) final;
   void PostPackagedTaskWithDelay(Task task, Clock::duration delay) final;
+  bool IsRunningOnTaskRunner() final;
 
   // Tasks will only be executed if RunUntilStopped has been called, and
   // RequestStopSoon has not. Important note: TaskRunner does NOT do any
@@ -150,6 +152,8 @@
   // empty, and is swapped with |tasks_| when it is time to run the Tasks.
   std::vector<TaskWithMetadata> running_tasks_;
 
+  std::thread::id task_runner_thread_id_;
+
   OSP_DISALLOW_COPY_AND_ASSIGN(TaskRunnerImpl);
 };
 }  // namespace platform