44# Copyright, 2025, by Samuel Williams.
55
66require "io/stream"
7- require_relative "wrapper "
7+ require_relative "connection "
88
99module Async
1010 module Container
@@ -19,47 +19,96 @@ def initialize(instance, endpoint = Supervisor.endpoint)
1919 @endpoint = endpoint
2020 end
2121
22+ def dispatch ( call )
23+ method_name = "do_#{ call . message [ :do ] } "
24+ self . public_send ( method_name , call )
25+ end
26+
2227 def connect
23- unless @wrapper
28+ unless @connection
2429 peer = @endpoint . connect
2530 stream = IO ::Stream ( peer )
26- @wrapper = Wrapper . new ( stream )
31+ @connection = Connection . new ( stream , 0 , instance : @instance )
2732
28- @wrapper . write ( action : "register" , instance : @instance )
33+ # Register the instance with the server:
34+ Async do
35+ @connection . call ( do : :register , state : @instance )
36+ end
2937 end
3038
31- return @wrapper unless block_given?
39+ return @connection unless block_given?
3240
3341 begin
34- yield @wrapper
42+ yield @connection
3543 ensure
36- @wrapper . close
44+ @connection . close
3745 end
3846 end
3947
4048 def close
41- if wrapper = @wrapper
42- @wrapper = nil
43- wrapper . close
49+ if connection = @connection
50+ @connection = nil
51+ connection . close
52+ end
53+ end
54+
55+ private def dump ( call )
56+ if path = call [ :path ]
57+ File . open ( path , "w" ) do |file |
58+ yield file
59+ end
60+
61+ call . finish ( path : path )
62+ else
63+ buffer = StringIO . new
64+ yield buffer
65+
66+ call . finish ( data : buffer . string )
67+ end
68+ end
69+
70+ def do_scheduler_dump ( call )
71+ dump ( call ) do |file |
72+ Fiber . scheduler . print_hierarchy ( file )
4473 end
4574 end
4675
47- def do_memory_dump ( wrapper , message )
48- Console . info ( self , "Memory dump:" , message )
49- path = message [ :path ]
76+ def do_memory_dump ( call )
77+ require "objspace"
5078
51- File . open ( path , "w" ) do |file |
79+ dump ( call ) do |file |
5280 ObjectSpace . dump_all ( output : file )
5381 end
5482 end
5583
84+ def do_thread_dump ( call )
85+ dump ( call ) do |file |
86+ Thread . list . each do |thread |
87+ file . puts ( thread . inspect )
88+ file . puts ( thread . backtrace )
89+ end
90+ end
91+ end
92+
93+ def do_garbage_profile_start ( connection , message )
94+ Console . info ( self , "Garbage profile start:" , message )
95+ GC ::Profiler . enable
96+ end
97+
98+ def do_garbage_profile_stop ( connection , message )
99+ Console . info ( self , "Garbage profile stop:" , message )
100+ GC ::Profiler . disable
101+
102+ dump ( connection , message ) do |file |
103+ file . puts GC ::Profiler . result
104+ end
105+ end
106+
56107 def run
57108 Async do |task |
58109 loop do
59- Console . info ( self , "Connecting to supervisor..." )
60- connect do |wrapper |
61- Console . info ( self , "Connected to supervisor." )
62- wrapper . run ( self )
110+ connect do |connection |
111+ connection . run ( self )
63112 end
64113 rescue => error
65114 Console . error ( self , "Unexpected error while running client!" , exception : error )
0 commit comments