summaryrefslogtreecommitdiff
path: root/tracer+android.ha
diff options
context:
space:
mode:
Diffstat (limited to 'tracer+android.ha')
-rw-r--r--tracer+android.ha43
1 files changed, 43 insertions, 0 deletions
diff --git a/tracer+android.ha b/tracer+android.ha
new file mode 100644
index 0000000..2e69527
--- /dev/null
+++ b/tracer+android.ha
@@ -0,0 +1,43 @@
+use fmt;
+use io;
+use memio;
+use strings;
+use trace;
+
+type Tracer = struct {
+ trace::tracer,
+};
+
+fn newtracer() Tracer =
+ Tracer {
+ log = &tracer_log,
+ };
+
+fn tracer_log(
+ tr: *trace::tracer,
+ ctx: nullable *trace::context,
+ lvl: trace::level,
+ fmt: str,
+ fields: fmt::field...
+) void = {
+ // XXX: ideally there would be a statically allocated buffer for
+ // reasonably short messages and allocation would only happen for
+ // messages longer than that. ideally ideally there would be locking so
+ // we wouldn't need to allocate at all.
+ const buf = memio::dynamic_from(alloc([], 256));
+ defer io::close(&buf)!;
+
+ let ctx_ = ctx;
+ for (true) match (ctx_) {
+ case let ctx__: *trace::context =>
+ fmt::fprintf(&buf, ctx__.fmt, ctx__.fields...)!;
+ io::write(&buf, [0x3a, 0x20])!; // ": "
+ ctx_ = ctx__.next;
+ case null => break;
+ };
+
+ fmt::fprintfln(&buf, fmt, fields...)!;
+
+ const prio = 6 - lvl: int;
+ androlog(prio, memio::string(&buf)!);
+};