mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Merge branch 'master' of https://github.com/odin-lang/Odin
This commit is contained in:
@@ -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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package prof_spall
|
package spall
|
||||||
|
|
||||||
import "core:os"
|
import "core:os"
|
||||||
import "core:time"
|
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 {
|
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.data = data
|
||||||
buffer.tid = tid
|
buffer.tid = tid
|
||||||
buffer.pid = pid
|
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) {
|
buffer_flush :: proc(ctx: ^Context, buffer: ^Buffer) {
|
||||||
|
start := _trace_now(ctx)
|
||||||
os.write(ctx.fd, buffer.data[:buffer.head])
|
os.write(ctx.fd, buffer.data[:buffer.head])
|
||||||
buffer.head = 0
|
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) {
|
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):]), raw_data(name), name_len)
|
||||||
mem.copy(raw_data(buffer[size_of(Begin_Event)+name_len:]), raw_data(args), args_len)
|
mem.copy(raw_data(buffer[size_of(Begin_Event)+name_len:]), raw_data(args), args_len)
|
||||||
ok = true
|
ok = true
|
||||||
|
|
||||||
return
|
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))
|
ev := (^End_Event)(raw_data(buffer))
|
||||||
event_size = size_of(End_Event)
|
event_size = size_of(End_Event)
|
||||||
if event_size > len(buffer) {
|
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.tid = u32le(tid)
|
||||||
ev.ts = f64le(ts)
|
ev.ts = f64le(ts)
|
||||||
ok = true
|
ok = true
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
returns the input string `s` with all runes set to upper case
|
||||||
always allocates using the `allocator`
|
always allocates using the `allocator`
|
||||||
|
|
||||||
strings.to_lower("test") -> TEST
|
strings.to_upper("test") -> TEST
|
||||||
strings.to_lower("Test") -> TEST
|
strings.to_upper("Test") -> TEST
|
||||||
*/
|
*/
|
||||||
to_upper :: proc(s: string, allocator := context.allocator) -> string {
|
to_upper :: proc(s: string, allocator := context.allocator) -> string {
|
||||||
b: Builder
|
b: Builder
|
||||||
|
|||||||
Reference in New Issue
Block a user