Create TraceLogging Framework

Changes based on Design Doc: https://docs.google.com/document/d/1pmZXIULMzDIuQJAQaJg0-rKrJ-eJlTYf7TRZYCBNXmo/edit?usp=sharing
- Create new TraceLogging Framework
- Define Macros for improved perf
- Define interface for platform-specific code
  - Add example interface implementation to be used in standalone mode
- Create UTs for above
- Integrate TraceLogging infra with existing TaskRunner and Informational Logging infras

Change-Id: I728b5742116468c48ffc999144c3d339d2547795
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/1612337
Commit-Queue: Ryan Keane <rwkeane@google.com>
Reviewed-by: Yuri Wiitala <miu@chromium.org>
Reviewed-by: Max Yakimakha <yakimakha@chromium.org>
Reviewed-by: mark a. foltz <mfoltz@chromium.org>
diff --git a/platform/impl/task_runner.cc b/platform/impl/task_runner.cc
index 89886dc..651e1fe 100644
--- a/platform/impl/task_runner.cc
+++ b/platform/impl/task_runner.cc
@@ -9,6 +9,14 @@
 namespace openscreen {
 namespace platform {
 
+TaskRunnerImpl::TaskWithMetadata::TaskWithMetadata(Task task)
+    : task_(std::move(task)), trace_ids_(TRACE_HIERARCHY) {}
+
+void TaskRunnerImpl::TaskWithMetadata::operator()() {
+  TRACE_SET_HIERARCHY(trace_ids_);
+  std::move(task_)();
+}
+
 TaskRunnerImpl::TaskRunnerImpl(platform::ClockNowFunctionPtr now_function,
                                TaskWaiter* event_waiter,
                                Clock::duration waiter_timeout)
@@ -21,7 +29,7 @@
 
 void TaskRunnerImpl::PostPackagedTask(Task task) {
   std::lock_guard<std::mutex> lock(task_mutex_);
-  tasks_.push_back(std::move(task));
+  tasks_.emplace_back(std::move(task));
   if (task_waiter_) {
     task_waiter_->OnTaskPosted();
   } else {
@@ -77,7 +85,7 @@
     running_tasks_.swap(tasks_);
   }
 
-  for (Task& task : running_tasks_) {
+  for (TaskWithMetadata& task : running_tasks_) {
     // Move the task to the stack so that its bound state is freed immediately
     // after being run.
     std::move(task)();
@@ -99,7 +107,7 @@
   }
 
   OSP_DVLOG << "Running " << running_tasks_.size() << " tasks...";
-  for (Task& task : running_tasks_) {
+  for (TaskWithMetadata& task : running_tasks_) {
     // Move the task to the stack so that its bound state is freed immediately
     // after being run.
     std::move(task)();