[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