aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-03-12 12:39:41 +0000
committergingerBill <bill@gingerbill.org>2023-03-12 12:39:41 +0000
commitf0ef10aa57fa8999f5ef08c9bda88591ced58b80 (patch)
tree4bba05a8d60e68a3ddb757d6f08a7c1f54589c6f
parentbf91fcc6f72b854b6a63403f38b5c8d6817cb10d (diff)
parent2d894a01644b22fa8e9f3cdc9555f7fdfeff107a (diff)
Merge branch 'master' of https://github.com/odin-lang/Odin
-rw-r--r--core/prof/spall/doc.odin26
-rw-r--r--core/prof/spall/spall.odin13
-rw-r--r--core/strings/conversion.odin4
3 files changed, 38 insertions, 5 deletions
diff --git a/core/prof/spall/doc.odin b/core/prof/spall/doc.odin
new file mode 100644
index 000000000..0f3cc8bb8
--- /dev/null
+++ b/core/prof/spall/doc.odin
@@ -0,0 +1,26 @@
+/*
+import "core:prof/spall"
+
+spall_ctx: spall.Context
+spall_buffer: spall.Buffer
+
+foo :: proc() {
+ spall.SCOPED_EVENT(&spall_ctx, &spall_buffer, #procedure)
+}
+
+main :: proc() {
+ spall_ctx = spall.context_create("trace_test.spall")
+ defer spall.context_destroy(&spall_ctx)
+
+ buffer_backing := make([]u8, spall.BUFFER_DEFAULT_SIZE)
+ spall_buffer = spall.buffer_create(buffer_backing)
+ defer spall.buffer_destroy(&spall_ctx, &spall_buffer)
+
+ spall.SCOPED_EVENT(&spall_ctx, &spall_buffer, #procedure)
+
+ for i := 0; i < 9001; i += 1 {
+ foo()
+ }
+}
+*/
+package spall
diff --git a/core/prof/spall/spall.odin b/core/prof/spall/spall.odin
index ff8c69222..6a78c466e 100644
--- a/core/prof/spall/spall.odin
+++ b/core/prof/spall/spall.odin
@@ -1,4 +1,4 @@
-package prof_spall
+package spall
import "core:os"
import "core:time"
@@ -95,7 +95,7 @@ context_destroy :: proc(ctx: ^Context) {
}
buffer_create :: proc(data: []byte, tid: u32 = 0, pid: u32 = 0) -> (buffer: Buffer, ok: bool) #optional_ok {
- assert(len(data) > 0)
+ assert(len(data) >= 1024)
buffer.data = data
buffer.tid = tid
buffer.pid = pid
@@ -105,8 +105,13 @@ buffer_create :: proc(data: []byte, tid: u32 = 0, pid: u32 = 0) -> (buffer: Buff
}
buffer_flush :: proc(ctx: ^Context, buffer: ^Buffer) {
+ start := _trace_now(ctx)
os.write(ctx.fd, buffer.data[:buffer.head])
buffer.head = 0
+ end := _trace_now(ctx)
+
+ buffer.head += _build_begin(buffer.data[buffer.head:], "Spall Trace Buffer Flush", "", start, buffer.tid, buffer.pid)
+ buffer.head += _build_end(buffer.data[buffer.head:], end, buffer.tid, buffer.pid)
}
buffer_destroy :: proc(ctx: ^Context, buffer: ^Buffer) {
@@ -171,10 +176,11 @@ _build_begin :: proc "contextless" (buffer: []u8, name: string, args: string, ts
mem.copy(raw_data(buffer[size_of(Begin_Event):]), raw_data(name), name_len)
mem.copy(raw_data(buffer[size_of(Begin_Event)+name_len:]), raw_data(args), args_len)
ok = true
+
return
}
-_build_end :: proc(buffer: []u8, ts: f64, tid: u32, pid: u32) -> (event_size: int, ok: bool) #optional_ok {
+_build_end :: proc "contextless" (buffer: []u8, ts: f64, tid: u32, pid: u32) -> (event_size: int, ok: bool) #optional_ok {
ev := (^End_Event)(raw_data(buffer))
event_size = size_of(End_Event)
if event_size > len(buffer) {
@@ -186,6 +192,7 @@ _build_end :: proc(buffer: []u8, ts: f64, tid: u32, pid: u32) -> (event_size: in
ev.tid = u32le(tid)
ev.ts = f64le(ts)
ok = true
+
return
}
diff --git a/core/strings/conversion.odin b/core/strings/conversion.odin
index ab827490d..8a67618da 100644
--- a/core/strings/conversion.odin
+++ b/core/strings/conversion.odin
@@ -78,8 +78,8 @@ to_lower :: proc(s: string, allocator := context.allocator) -> string {
returns the input string `s` with all runes set to upper case
always allocates using the `allocator`
- strings.to_lower("test") -> TEST
- strings.to_lower("Test") -> TEST
+ strings.to_upper("test") -> TEST
+ strings.to_upper("Test") -> TEST
*/
to_upper :: proc(s: string, allocator := context.allocator) -> string {
b: Builder