[block]WIP: adding tracing interface to block layer

Change-Id: I9b913bbff6a584d37ba8482320cf93947e6f44e8
diff --git a/system/dev/block/block/rules.mk b/system/dev/block/block/rules.mk
index 6ee1f39..d662fea 100644
--- a/system/dev/block/block/rules.mk
+++ b/system/dev/block/block/rules.mk
@@ -19,7 +19,18 @@
     system/ulib/zxcpp \
     system/ulib/fbl \
     system/ulib/fzl \
+    system/ulib/trace-provider \
+    system/ulib/trace \
+    system/ulib/async.cpp \
+    system/ulib/async \
+    system/ulib/async-loop.cpp \
+    system/ulib/async-loop \
 
-MODULE_LIBS := system/ulib/c system/ulib/driver system/ulib/zircon
+MODULE_LIBS := system/ulib/c \
+    system/ulib/driver \
+    system/ulib/zircon \
+    system/ulib/async.default \
+    system/ulib/fdio \
+    system/ulib/trace-engine
 
 include make/module.mk
diff --git a/system/dev/block/block/server.cpp b/system/dev/block/block/server.cpp
index e980e8a..6a42eb8 100644
--- a/system/dev/block/block/server.cpp
+++ b/system/dev/block/block/server.cpp
@@ -7,8 +7,11 @@
 #include <stdbool.h>
 #include <string.h>
 
+// DDK Includes
 #include <ddk/device.h>
 #include <ddk/protocol/block.h>
+#include <ddk/debug.h>
+
 #include <fbl/algorithm.h>
 #include <fbl/alloc_checker.h>
 #include <fbl/auto_call.h>
@@ -21,6 +24,13 @@
 #include <zircon/syscalls.h>
 #include <lib/zx/fifo.h>
 
+// Tracing Includes
+#include <lib/async-loop/cpp/loop.h>
+#include <lib/async/cpp/task.h>
+#include <lib/async/cpp/time.h>
+#include <trace-provider/provider.h>
+#include <trace/event.h>
+
 #include "server.h"
 
 namespace {
@@ -91,6 +101,52 @@
 
 }  // namespace
 
+
+async::Loop loop;
+trace::TraceProvider provider(loop.async());
+
+/*
+zx_status_t status;
+async_loop_t* loop;
+trace_provider_t* trace_provider;
+trace_async_id_t async_id;
+
+
+void register_trace(void) {
+    // Create a message loop.
+    status = async_loop_create(NULL, &loop);
+    if (status != ZX_OK) {
+        zxlogf(ERROR, "Failed to create a message loop.\n");
+        zxlogf(ERROR, "----------Failed to register the tracing interface.----------\n");
+        return;
+    }
+
+    // Start a thread for the loop to run on.
+    // We could instead use async_loop_run() to run on the current thread.
+    status = async_loop_start_thread(loop, "loop", NULL);
+    if (status != ZX_OK) {
+        zxlogf(ERROR, "Failed to start a thread.\n");
+        zxlogf(ERROR, "----------Failed to register the tracing interface.----------\n");
+        return;
+    } 
+
+    // Create the trace provider.
+    async_t* async = async_loop_get_dispatcher(loop);
+    trace_provider = trace_provider_create(async);
+    if (!trace_provider) {
+        zxlogf(ERROR, "Failed to create a trace provider.\n");
+        zxlogf(ERROR, "----------Failed to register the tracing interface.----------\n");
+    }
+
+    zxlogf(TRACE, "----------Tracing interface is registered successfully!-------\n");
+}
+
+void close_trace(void) {
+    trace_provider_destroy(trace_provider);
+    async_loop_shutdown(loop);
+    zxlogf(TRACE, "----------Tracing interface is closed successfully!----------\n");
+}
+*/
 TransactionGroup::TransactionGroup(zx_handle_t fifo, txnid_t txnid) :
     fifo_(fifo), flags_(0), ctr_(0) {
     memset(&response_, 0, sizeof(response_));
@@ -100,6 +156,7 @@
 TransactionGroup::~TransactionGroup() {}
 
 zx_status_t TransactionGroup::Enqueue(bool do_respond) {
+    
     fbl::AutoLock lock(&lock_);
     if (flags_ & kTxnFlagRespond) {
         // Can't get more than one response for a txn