sel4bench: add flog.h, a header for fast logging

logging.h assumes it is post-processing the logs
flog.h is for logging that takes place during
the benchmark.
diff --git a/libsel4bench/Kconfig b/libsel4bench/Kconfig
index 3a6bd53..46833ba 100644
--- a/libsel4bench/Kconfig
+++ b/libsel4bench/Kconfig
@@ -8,7 +8,7 @@
 # @TAG(NICTA_BSD)
 #
 
-config LIB_SEL4_BENCH
+menuconfig LIB_SEL4_BENCH
     bool "libsel4bench"
     default y
     depends on HAVE_LIB_SEL4 && HAVE_LIBC && HAVE_LIB_UTILS
@@ -16,5 +16,12 @@
     help
         Benchmarking library and functionality for various platforms
 
+config FLOG
+    bool "Enable fast logging library?"
+    default n
+    depends on LIB_SEL4_BENCH
+    help 
+        Provide flog.h functions. If this is false, flog.h functions will be #ifdef'd out. 
+
 config HAVE_LIB_SEL4_BENCH
     bool
diff --git a/libsel4bench/include/sel4bench/flog.h b/libsel4bench/include/sel4bench/flog.h
new file mode 100644
index 0000000..bb51961
--- /dev/null
+++ b/libsel4bench/include/sel4bench/flog.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016, NICTA
+ *
+ * This software may be distributed and modified according to the terms of
+ * the BSD 2-Clause license. Note that NO WARRANTY is provided.
+ * See "LICENSE_BSD2.txt" for details.
+ *
+ * @TAG(NICTA_BSD)
+ */
+
+#pragma once
+
+#include <autoconf.h>
+#include <sel4bench/sel4bench.h>
+#include <stdlib.h>
+#include <utils/util.h>
+
+typedef struct {
+    ccnt_t *results;
+    size_t length;
+    size_t next;
+    ccnt_t start;
+} flog_t;
+
+#ifdef CONFIG_FLOG
+static inline flog_t *
+flog_init(ccnt_t *results, int length) 
+{
+    flog_t *flog = calloc(1, sizeof(flog));
+    if (unlikely(flog == NULL)) {
+        ZF_LOGE("Failed to allocate flog");
+        return NULL;
+    }
+
+    flog->results = results;
+    flog->length = length;
+
+    return flog;
+}
+
+static inline void
+flog_end(flog_t *flog) {
+    ccnt_t end;
+    SEL4BENCH_READ_CCNT(end);
+    if (likely(flog->start != 0 && flog->next < flog->length)) {
+        flog->results[flog->next] = end - flog->start;
+        flog->next++;
+    }
+}
+
+static inline void
+flog_start(flog_t *flog) {
+    SEL4BENCH_READ_CCNT(flog->start);
+}
+
+#else
+
+#define flog_init(r, l)
+#define flog_end(f)
+#define flog_start(f)
+
+#endif /* CONFIG_FLOG */