summaryrefslogtreecommitdiff
path: root/tracer+android.ha
blob: 2e69527a69e200e2dbffc3b55375da29916edfbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)!);
};