@@ -11,6 +11,7 @@ use event_worker::events::{
11
11
use futures_util:: FutureExt ;
12
12
use log:: { debug, error} ;
13
13
use sb_core:: conn_sync:: ConnSync ;
14
+ use sb_core:: { MetricSource , RuntimeMetricSource , WorkerMetricSource } ;
14
15
use sb_workers:: context:: { UserWorkerMsgs , WorkerContextInitOpts } ;
15
16
use std:: any:: Any ;
16
17
use std:: future:: { pending, Future } ;
@@ -87,7 +88,7 @@ impl Worker {
87
88
UnboundedSender < UnixStreamEntry > ,
88
89
UnboundedReceiver < UnixStreamEntry > ,
89
90
) ,
90
- booter_signal : Sender < Result < ( ) , Error > > ,
91
+ booter_signal : Sender < Result < MetricSource , Error > > ,
91
92
termination_token : Option < TerminationToken > ,
92
93
) {
93
94
let worker_name = self . worker_name . clone ( ) ;
@@ -101,24 +102,48 @@ impl Worker {
101
102
102
103
let method_cloner = self . clone ( ) ;
103
104
let timing = opts. timing . take ( ) ;
104
- let is_user_worker = opts. conf . is_user_worker ( ) ;
105
+ let worker_kind = opts. conf . to_worker_kind ( ) ;
106
+ let maybe_main_worker_opts = opts. conf . as_main_worker ( ) . cloned ( ) ;
105
107
106
108
let cancel = self . cancel . clone ( ) ;
107
- let rt = if is_user_worker {
109
+ let rt = if worker_kind . is_user_worker ( ) {
108
110
& rt:: USER_WORKER_RT
109
111
} else {
110
112
& rt:: PRIMARY_WORKER_RT
111
113
} ;
112
114
113
115
let _worker_handle = rt. spawn_pinned ( move || {
114
116
tokio:: task:: spawn_local ( async move {
115
- let ( maybe_cpu_usage_metrics_tx, maybe_cpu_usage_metrics_rx) = is_user_worker
117
+ let ( maybe_cpu_usage_metrics_tx, maybe_cpu_usage_metrics_rx) = worker_kind
118
+ . is_user_worker ( )
116
119
. then ( unbounded_channel :: < CPUUsageMetrics > )
117
120
. unzip ( ) ;
118
121
119
122
let result = match DenoRuntime :: new ( opts) . await {
120
123
Ok ( mut new_runtime) => {
121
- let _ = booter_signal. send ( Ok ( ( ) ) ) ;
124
+ let metric_src = {
125
+ let js_runtime = & mut new_runtime. js_runtime ;
126
+ let metric_src = WorkerMetricSource :: from_js_runtime ( js_runtime) ;
127
+
128
+ if worker_kind. is_main_worker ( ) {
129
+ let opts = maybe_main_worker_opts. unwrap ( ) ;
130
+ let state = js_runtime. op_state ( ) ;
131
+ let mut state_mut = state. borrow_mut ( ) ;
132
+ let metric_src = RuntimeMetricSource :: new (
133
+ metric_src. clone ( ) ,
134
+ opts. event_worker_metric_src
135
+ . and_then ( |it| it. into_worker ( ) . ok ( ) ) ,
136
+ opts. shared_metric_src ,
137
+ ) ;
138
+
139
+ state_mut. put ( metric_src. clone ( ) ) ;
140
+ MetricSource :: Runtime ( metric_src)
141
+ } else {
142
+ MetricSource :: Worker ( metric_src)
143
+ }
144
+ } ;
145
+
146
+ let _ = booter_signal. send ( Ok ( metric_src) ) ;
122
147
123
148
// CPU TIMER
124
149
let ( termination_event_tx, termination_event_rx) =
@@ -127,7 +152,7 @@ impl Worker {
127
152
let _cpu_timer;
128
153
129
154
// TODO: Allow customization of supervisor
130
- let termination_fut = if is_user_worker {
155
+ let termination_fut = if worker_kind . is_user_worker ( ) {
131
156
// cputimer is returned from supervisor and assigned here to keep it in scope.
132
157
let Ok ( maybe_timer) = create_supervisor (
133
158
worker_key. unwrap_or ( Uuid :: nil ( ) ) ,
@@ -209,7 +234,7 @@ impl Worker {
209
234
let result = data. await ;
210
235
211
236
if let Some ( token) = termination_token. as_ref ( ) {
212
- if !is_user_worker {
237
+ if !worker_kind . is_user_worker ( ) {
213
238
let _ = termination_fut. await ;
214
239
}
215
240
0 commit comments