From 25fd9820eee30082264bbaee9c023e8d3f2cf710 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 01:25:51 -0500 Subject: [PATCH 01/12] trace tool gets built with --release --- buildkite/src/Jobs/Release/TraceTool.dhall | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildkite/src/Jobs/Release/TraceTool.dhall b/buildkite/src/Jobs/Release/TraceTool.dhall index d4a0e4997f4..bb01eee5068 100644 --- a/buildkite/src/Jobs/Release/TraceTool.dhall +++ b/buildkite/src/Jobs/Release/TraceTool.dhall @@ -25,12 +25,12 @@ Pipeline.build steps = [ Command.build Command.Config::{ - commands = RunInToolchain.runInToolchain ([] : List Text) "cd src/app/trace-tool && PATH=/home/opam/.cargo/bin:$PATH cargo build" + commands = RunInToolchain.runInToolchain ([] : List Text) "cd src/app/trace-tool && PATH=/home/opam/.cargo/bin:$PATH cargo build --release" , label = "Build trace-tool" , key = "build-trace-tool" , target = Size.Small , docker = None Docker.Type - , artifact_paths = [ S.contains "src/app/trace-tool/target/debug/trace-tool" ] + , artifact_paths = [ S.contains "src/app/trace-tool/target/release/trace-tool" ] } ] } From d2e90250534b24cdaf838363c32bb7198446a3a3 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 02:03:57 -0500 Subject: [PATCH 02/12] TraceTool dhall correct dirty path --- buildkite/src/Jobs/Release/TraceTool.dhall | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildkite/src/Jobs/Release/TraceTool.dhall b/buildkite/src/Jobs/Release/TraceTool.dhall index bb01eee5068..7c6d5134a08 100644 --- a/buildkite/src/Jobs/Release/TraceTool.dhall +++ b/buildkite/src/Jobs/Release/TraceTool.dhall @@ -18,7 +18,7 @@ in Pipeline.build Pipeline.Config::{ spec = JobSpec::{ - dirtyWhen = [ S.contains "src/app/trace-tool", S.strictlyStart (S.contains "buildkite/src/Jobs/TraceTool") ], + dirtyWhen = [ S.contains "src/app/trace-tool", S.strictlyStart (S.contains "buildkite/src/Jobs/Release/TraceTool") ], path = "Release", name = "TraceTool" }, From 2ae9c2fd4d575048178acacb1025549af4f20419 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 02:04:23 -0500 Subject: [PATCH 03/12] try making the bigstring one-time-use --- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index fbc74b1df90..87b12f93441 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -6,9 +6,9 @@ module Scheduler = Async_kernel_scheduler let current_wr = ref None let emit_event = - let buf = Bigstring.create 512 in fun event -> Option.iter !current_wr ~f:(fun wr -> + let buf = Bigstring.create 512 in try Webkit_trace_event_binary_output.emit_event ~buf wr event with exn -> Writer.writef wr "failed to write o1trace event: %s\n" From 857457d045f62908e18f3efc8247eea076bd7515 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 03:17:43 -0500 Subject: [PATCH 04/12] Thread_switch is supposed to be edge triggered --- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index 87b12f93441..ca9b2d563f8 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -97,9 +97,13 @@ module T = struct end) () + let most_recent_id = ref (-1) + let on_job_enter (fiber : O1trace.Thread.Fiber.t) = - emit_event - (new_thread_event (O1trace.Thread.name fiber.thread) Thread_switch) + if fiber.id <> !most_recent_id then ( + most_recent_id := fiber.id ; + emit_event + (new_thread_event (O1trace.Thread.name fiber.thread) Thread_switch) ) let on_job_exit _fiber _time_elapsed = () From 88c70d50ac89e8f2b93dff67a7fed55bb4785028 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 06:31:52 -0500 Subject: [PATCH 05/12] some progress towards usable trace --- src/lib/o1trace/execution_timer.ml | 2 + src/lib/o1trace/o1trace.mli | 5 +- src/lib/o1trace/plugins.ml | 2 + src/lib/o1trace/thread.ml | 7 ++- .../webkit_event/o1trace_webkit_event.ml | 61 ++++++++----------- 5 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/lib/o1trace/execution_timer.ml b/src/lib/o1trace/execution_timer.ml index 2c5e4728b91..1be108ad570 100644 --- a/src/lib/o1trace/execution_timer.ml +++ b/src/lib/o1trace/execution_timer.ml @@ -26,4 +26,6 @@ let on_job_enter _fiber = () let on_job_exit fiber elapsed_time = record_elapsed_time fiber elapsed_time +let on_new_fiber _fiber = () + let elapsed_time_of_thread thread = !(Plugins.plugin_state (module T) thread) diff --git a/src/lib/o1trace/o1trace.mli b/src/lib/o1trace/o1trace.mli index d697afe9d63..33f68b625ed 100644 --- a/src/lib/o1trace/o1trace.mli +++ b/src/lib/o1trace/o1trace.mli @@ -15,8 +15,11 @@ module Thread : sig val dump_thread_graph : unit -> bytes module Fiber : sig - type t = Thread.Fiber.t = { id : int; parent : t option; thread : Thread.t } + type t = Thread.Fiber.t = + { id : int; parent : t option; thread : Thread.t; key : string list } end + + val iter_fibers : f:(Fiber.t -> unit) -> unit end module Plugins : module type of Plugins diff --git a/src/lib/o1trace/plugins.ml b/src/lib/o1trace/plugins.ml index f070d01d8dd..d840ab3d815 100644 --- a/src/lib/o1trace/plugins.ml +++ b/src/lib/o1trace/plugins.ml @@ -29,6 +29,8 @@ module type Plugin_intf = sig val on_job_enter : Thread.Fiber.t -> unit val on_job_exit : Thread.Fiber.t -> Time_ns.Span.t -> unit + + val on_new_fiber : Thread.Fiber.t -> unit end module Register_plugin (Plugin_spec : Plugin_spec_intf) () : diff --git a/src/lib/o1trace/thread.ml b/src/lib/o1trace/thread.ml index 6454e73e494..4a1f000778e 100644 --- a/src/lib/o1trace/thread.ml +++ b/src/lib/o1trace/thread.ml @@ -69,7 +69,8 @@ module Fiber = struct let next_id = ref 1 - type t = { id : int; parent : t option; thread : thread } [@@deriving sexp_of] + type t = { id : int; parent : t option; thread : thread; key : string list } + [@@deriving sexp_of] let ctx_id : t Type_equal.Id.t = Type_equal.Id.create ~name:"fiber" sexp_of_t @@ -87,7 +88,7 @@ module Fiber = struct fiber | None -> let thread = register name in - let fiber = { id = !next_id; parent; thread } in + let fiber = { id = !next_id; parent; thread; key } in incr next_id ; Hashtbl.set fibers ~key ~data:fiber ; Option.iter parent ~f:(fun p -> Graph.add_edge graph p.thread.name name) ; @@ -103,3 +104,5 @@ end let of_context ctx = let%map.Option fiber = Fiber.of_context ctx in fiber.thread + +let iter_fibers ~f = Hashtbl.iter Fiber.fibers ~f diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index ca9b2d563f8..a97979534db 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -5,14 +5,14 @@ module Scheduler = Async_kernel_scheduler let current_wr = ref None -let emit_event = - fun event -> - Option.iter !current_wr ~f:(fun wr -> - let buf = Bigstring.create 512 in - try Webkit_trace_event_binary_output.emit_event ~buf wr event - with exn -> - Writer.writef wr "failed to write o1trace event: %s\n" - (Exn.to_string exn) ) +let emit_event' wr event = + let buf = Bigstring.create 512 in + try Webkit_trace_event_binary_output.emit_event ~buf wr event + with exn -> + Writer.writef wr "failed to write o1trace event: %s\n" (Exn.to_string exn) + +let emit_event event = + Option.iter !current_wr ~f:(fun wr -> emit_event' wr event) let timestamp () = Time_stamp_counter.now () |> Time_stamp_counter.to_int63 |> Int63.to_int_exn @@ -28,21 +28,10 @@ let new_event (k : event_kind) : event = ; tid = 0 } -(* This will track ids per thread. If we need to track ids per fiber, - we will need to feed the fiber id into the plugin hooks. *) -let id_of_thread = - let ids = String.Table.create () in - let next_id = ref 0 in - let alloc_id () = - let id = !next_id in - incr next_id ; id - in - fun thread_name -> Hashtbl.find_or_add ids thread_name ~default:alloc_id - -let new_thread_event ?(include_name = false) thread_name event_kind = +let new_thread_event ?(include_name = false) thread_key tid event_kind = { (new_event event_kind) with - tid = id_of_thread thread_name - ; name = (if include_name then thread_name else "") + tid + ; name = (if include_name then String.concat ~sep:"/" thread_key else "") } (* @@ -97,34 +86,36 @@ module T = struct end) () - let most_recent_id = ref (-1) + let most_recent_id = ref 0 let on_job_enter (fiber : O1trace.Thread.Fiber.t) = if fiber.id <> !most_recent_id then ( most_recent_id := fiber.id ; - emit_event - (new_thread_event (O1trace.Thread.name fiber.thread) Thread_switch) ) + emit_event (new_thread_event fiber.key fiber.id Thread_switch) ) let on_job_exit _fiber _time_elapsed = () - (* - let on_cycle_end () = - let sch = Scheduler.t () in - emit_event (new_thread_event thread_name Cycle_end) ; - *) + let on_new_fiber (fiber : O1trace.Thread.Fiber.t) = + emit_event (new_thread_event ~include_name:true fiber.key fiber.id New_thread) end +let cancel = ref (ref false) + let start_tracing wr = if Option.is_some !current_wr then (* log an error, do nothing *) () else ( current_wr := Some wr ; + let cancel = !cancel in + (* FIXME: these handlers cannot be removed without further + changes to async_kernel. Instead, we will leak a ref and + accumulate a bunch of NOOPs every time we call [stop_tracing] *) + Scheduler.Expert.run_every_cycle_end (fun () -> + if not !cancel then emit_event (new_event Cycle_end) ) ; emit_event (new_event Pid_is) ; - O1trace.Thread.iter_threads ~f:(fun thread -> + O1trace.Thread.iter_fibers ~f:(fun fiber -> emit_event - (new_thread_event ~include_name:true - (O1trace.Thread.name thread) - New_thread ) ) ; + (new_thread_event ~include_name:true fiber.key fiber.id New_thread) ) ; O1trace.Plugins.enable_plugin (module T) ) let stop_tracing () = @@ -132,5 +123,7 @@ let stop_tracing () = () else ( emit_event (new_event Trace_end) ; + !cancel := true ; + cancel := ref false ; current_wr := None ; O1trace.Plugins.disable_plugin (module T) ) From b0f95a0aec648be16a96670e71614d71dc16d1c0 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Tue, 9 Jan 2024 06:57:24 -0500 Subject: [PATCH 06/12] don't spam Cycle_end --- src/lib/o1trace/o1trace.ml | 7 ++++++- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 5 ++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lib/o1trace/o1trace.ml b/src/lib/o1trace/o1trace.ml index 62514d5db2e..f1a34754a5b 100644 --- a/src/lib/o1trace/o1trace.ml +++ b/src/lib/o1trace/o1trace.ml @@ -22,6 +22,10 @@ let on_job_exit ctx elapsed_time = Option.iter (Thread.Fiber.of_context ctx) ~f:(fun thread -> on_job_exit' thread elapsed_time ) +let on_new_fiber (fiber : Thread.Fiber.t) = + Plugins.dispatch (fun (module Plugin : Plugins.Plugin_intf) -> + Plugin.on_new_fiber fiber ) + let current_sync_fiber = ref None (* grabs the parent fiber, returning the fiber (if available) and a reset function to call after exiting the child fiber *) @@ -72,7 +76,8 @@ let exec_thread ~exec_same_thread ~exec_new_thread name = | Some fiber -> fiber | None -> - Thread.Fiber.register name parent + let fib = Thread.Fiber.register name parent in + on_new_fiber fib ; fib in exec_new_thread fiber in diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index a97979534db..52e2cd2e30e 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -96,7 +96,8 @@ module T = struct let on_job_exit _fiber _time_elapsed = () let on_new_fiber (fiber : O1trace.Thread.Fiber.t) = - emit_event (new_thread_event ~include_name:true fiber.key fiber.id New_thread) + emit_event + (new_thread_event ~include_name:true fiber.key fiber.id New_thread) end let cancel = ref (ref false) @@ -110,8 +111,6 @@ let start_tracing wr = (* FIXME: these handlers cannot be removed without further changes to async_kernel. Instead, we will leak a ref and accumulate a bunch of NOOPs every time we call [stop_tracing] *) - Scheduler.Expert.run_every_cycle_end (fun () -> - if not !cancel then emit_event (new_event Cycle_end) ) ; emit_event (new_event Pid_is) ; O1trace.Thread.iter_fibers ~f:(fun fiber -> emit_event From 6a675bba52b5c83dbada59d97b1a93011e755eca Mon Sep 17 00:00:00 2001 From: emberian Date: Wed, 10 Jan 2024 11:35:35 -0500 Subject: [PATCH 07/12] restore the emit_event io buffer the io library copies this into an internal buffer as i expected, this wasn't the source of any data corruption --- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index 52e2cd2e30e..a82c7af3613 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -5,11 +5,12 @@ module Scheduler = Async_kernel_scheduler let current_wr = ref None -let emit_event' wr event = +let emit_event' = let buf = Bigstring.create 512 in - try Webkit_trace_event_binary_output.emit_event ~buf wr event - with exn -> - Writer.writef wr "failed to write o1trace event: %s\n" (Exn.to_string exn) + fun wr event -> + try Webkit_trace_event_binary_output.emit_event ~buf wr event + with exn -> + Writer.writef wr "failed to write o1trace event: %s\n" (Exn.to_string exn) let emit_event event = Option.iter !current_wr ~f:(fun wr -> emit_event' wr event) From 9407f68b0d290d004a5402780eef1a1df4e79031 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Wed, 10 Jan 2024 13:21:19 -0500 Subject: [PATCH 08/12] do use Cycle_end to precisely time job ends --- src/lib/o1trace/execution_timer.ml | 2 ++ src/lib/o1trace/o1trace.ml | 8 ++++++-- src/lib/o1trace/plugins.ml | 2 ++ src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 7 ++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/lib/o1trace/execution_timer.ml b/src/lib/o1trace/execution_timer.ml index 1be108ad570..edcf0f2d554 100644 --- a/src/lib/o1trace/execution_timer.ml +++ b/src/lib/o1trace/execution_timer.ml @@ -28,4 +28,6 @@ let on_job_exit fiber elapsed_time = record_elapsed_time fiber elapsed_time let on_new_fiber _fiber = () +let on_cycle_end () = () + let elapsed_time_of_thread thread = !(Plugins.plugin_state (module T) thread) diff --git a/src/lib/o1trace/o1trace.ml b/src/lib/o1trace/o1trace.ml index f1a34754a5b..b9c759637fe 100644 --- a/src/lib/o1trace/o1trace.ml +++ b/src/lib/o1trace/o1trace.ml @@ -109,7 +109,7 @@ let sync_thread name f = let ctx = with_o1trace ~name ctx in match Scheduler.Private.with_execution_context (Scheduler.Private.t ()) ctx - ~f:(fun () -> Result.try_with f) + ~f:(fun () -> Result.try_with f ) with | Error exn -> Exn.reraise exn "exception caught by O1trace.sync_thread" @@ -118,7 +118,11 @@ let sync_thread name f = on_job_exit' fiber elapsed_time ; result ) -let () = Stdlib.(Async_kernel.Tracing.fns := { on_job_enter; on_job_exit }) +let () = + Stdlib.(Async_kernel.Tracing.fns := { on_job_enter; on_job_exit }) ; + Scheduler.Expert.run_every_cycle_end (fun () -> + Plugins.dispatch (fun (module Plugin : Plugins.Plugin_intf) -> + Plugin.on_cycle_end () ) ) (* let () = diff --git a/src/lib/o1trace/plugins.ml b/src/lib/o1trace/plugins.ml index d840ab3d815..f9f4e24650d 100644 --- a/src/lib/o1trace/plugins.ml +++ b/src/lib/o1trace/plugins.ml @@ -31,6 +31,8 @@ module type Plugin_intf = sig val on_job_exit : Thread.Fiber.t -> Time_ns.Span.t -> unit val on_new_fiber : Thread.Fiber.t -> unit + + val on_cycle_end : unit -> unit end module Register_plugin (Plugin_spec : Plugin_spec_intf) () : diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index a82c7af3613..46543b56c9d 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -99,16 +99,15 @@ module T = struct let on_new_fiber (fiber : O1trace.Thread.Fiber.t) = emit_event (new_thread_event ~include_name:true fiber.key fiber.id New_thread) -end -let cancel = ref (ref false) + let on_cycle_end () = emit_event (new_event Cycle_end) +end let start_tracing wr = if Option.is_some !current_wr then (* log an error, do nothing *) () else ( current_wr := Some wr ; - let cancel = !cancel in (* FIXME: these handlers cannot be removed without further changes to async_kernel. Instead, we will leak a ref and accumulate a bunch of NOOPs every time we call [stop_tracing] *) @@ -123,7 +122,5 @@ let stop_tracing () = () else ( emit_event (new_event Trace_end) ; - !cancel := true ; - cancel := ref false ; current_wr := None ; O1trace.Plugins.disable_plugin (module T) ) From 476c2b94526c21c377a176d56e5c559310b629b4 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Wed, 10 Jan 2024 15:51:25 -0500 Subject: [PATCH 09/12] don't spam Cycle_end --- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index 46543b56c9d..444039baf64 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -5,9 +5,12 @@ module Scheduler = Async_kernel_scheduler let current_wr = ref None +let emitted_since_cycle_ended = ref false + let emit_event' = let buf = Bigstring.create 512 in fun wr event -> + emitted_since_cycle_ended := true ; try Webkit_trace_event_binary_output.emit_event ~buf wr event with exn -> Writer.writef wr "failed to write o1trace event: %s\n" (Exn.to_string exn) @@ -100,7 +103,9 @@ module T = struct emit_event (new_thread_event ~include_name:true fiber.key fiber.id New_thread) - let on_cycle_end () = emit_event (new_event Cycle_end) + let on_cycle_end () = + if !emitted_since_cycle_ended then emit_event (new_event Cycle_end) ; + emitted_since_cycle_ended := false end let start_tracing wr = From 2b50e18db49aab6641531aabfd041efe43a04885 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Wed, 10 Jan 2024 15:56:32 -0500 Subject: [PATCH 10/12] remove vestigial comment --- src/lib/o1trace/webkit_event/o1trace_webkit_event.ml | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index 444039baf64..f8e288fe1c2 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -113,9 +113,6 @@ let start_tracing wr = () else ( current_wr := Some wr ; - (* FIXME: these handlers cannot be removed without further - changes to async_kernel. Instead, we will leak a ref and - accumulate a bunch of NOOPs every time we call [stop_tracing] *) emit_event (new_event Pid_is) ; O1trace.Thread.iter_fibers ~f:(fun fiber -> emit_event From 99bb178f684f453c81fdc8fc2a2c989802c42f62 Mon Sep 17 00:00:00 2001 From: emberian Date: Wed, 10 Jan 2024 17:21:30 -0500 Subject: [PATCH 11/12] Use Fiber.key --- src/lib/o1trace/o1trace.mli | 2 ++ src/lib/o1trace/thread.ml | 2 ++ .../webkit_event/o1trace_webkit_event.ml | 17 ++++++----------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/lib/o1trace/o1trace.mli b/src/lib/o1trace/o1trace.mli index 33f68b625ed..9cb2cb59c71 100644 --- a/src/lib/o1trace/o1trace.mli +++ b/src/lib/o1trace/o1trace.mli @@ -17,6 +17,8 @@ module Thread : sig module Fiber : sig type t = Thread.Fiber.t = { id : int; parent : t option; thread : Thread.t; key : string list } + + val key : t -> string list end val iter_fibers : f:(Fiber.t -> unit) -> unit diff --git a/src/lib/o1trace/thread.ml b/src/lib/o1trace/thread.ml index 4a1f000778e..f830b4bbbbf 100644 --- a/src/lib/o1trace/thread.ml +++ b/src/lib/o1trace/thread.ml @@ -99,6 +99,8 @@ module Fiber = struct Execution_context.with_local ctx ctx_id (Some t) let of_context ctx = Execution_context.find_local ctx ctx_id + + let key { thread = { name; _ }; parent; _ } = fiber_key name parent end let of_context ctx = diff --git a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml index f8e288fe1c2..166d100907e 100644 --- a/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml +++ b/src/lib/o1trace/webkit_event/o1trace_webkit_event.ml @@ -32,11 +32,8 @@ let new_event (k : event_kind) : event = ; tid = 0 } -let new_thread_event ?(include_name = false) thread_key tid event_kind = - { (new_event event_kind) with - tid - ; name = (if include_name then String.concat ~sep:"/" thread_key else "") - } +let new_thread_event ?(include_name = "") tid event_kind = + { (new_event event_kind) with tid; name = include_name } (* @@ -95,13 +92,13 @@ module T = struct let on_job_enter (fiber : O1trace.Thread.Fiber.t) = if fiber.id <> !most_recent_id then ( most_recent_id := fiber.id ; - emit_event (new_thread_event fiber.key fiber.id Thread_switch) ) + emit_event (new_thread_event fiber.id Thread_switch) ) let on_job_exit _fiber _time_elapsed = () let on_new_fiber (fiber : O1trace.Thread.Fiber.t) = - emit_event - (new_thread_event ~include_name:true fiber.key fiber.id New_thread) + let fullname = String.concat ~sep:"/" (O1trace.Thread.Fiber.key fiber) in + emit_event (new_thread_event ~include_name:fullname fiber.id New_thread) let on_cycle_end () = if !emitted_since_cycle_ended then emit_event (new_event Cycle_end) ; @@ -114,9 +111,7 @@ let start_tracing wr = else ( current_wr := Some wr ; emit_event (new_event Pid_is) ; - O1trace.Thread.iter_fibers ~f:(fun fiber -> - emit_event - (new_thread_event ~include_name:true fiber.key fiber.id New_thread) ) ; + O1trace.Thread.iter_fibers ~f:T.on_new_fiber ; O1trace.Plugins.enable_plugin (module T) ) let stop_tracing () = From 37209c80980789da4fcef5d5ea4b13434ca180c4 Mon Sep 17 00:00:00 2001 From: ember arlynx Date: Wed, 10 Jan 2024 18:16:49 -0500 Subject: [PATCH 12/12] why did my macos ocamlformat lead me astray :( --- src/lib/o1trace/o1trace.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/o1trace/o1trace.ml b/src/lib/o1trace/o1trace.ml index b9c759637fe..efbc9ba04bb 100644 --- a/src/lib/o1trace/o1trace.ml +++ b/src/lib/o1trace/o1trace.ml @@ -109,7 +109,7 @@ let sync_thread name f = let ctx = with_o1trace ~name ctx in match Scheduler.Private.with_execution_context (Scheduler.Private.t ()) ctx - ~f:(fun () -> Result.try_with f ) + ~f:(fun () -> Result.try_with f) with | Error exn -> Exn.reraise exn "exception caught by O1trace.sync_thread"