diff --git a/site/tests/io.uce b/site/tests/io.uce index 205ebc2..8113ddd 100644 --- a/site/tests/io.uce +++ b/site/tests/io.uce @@ -151,7 +151,13 @@ RENDER(Request& context) check("to_u64() / to_s64() / to_f64() / to_bool()", to_u64(cfg["u64"], 7) == 42 && to_u64(cfg["bad"], 7) == 7 && to_s64(cfg["s64"], 5) == -12 && to_s64(cfg["bad"], 5) == 5 && to_f64(cfg["f64"], 1.0) > 3.49 && to_f64(cfg["bad"], 1.25) == 1.25 && to_bool(cfg["yes"], false) && !to_bool(cfg["no"], true) && !to_bool("unknown", false), var_dump(cfg)); DValue perf = request_perf(); - check("request_perf()", perf.get_type_name() != "invalid", json_encode(perf)); + bool perf_stable = perf["worker_pid"].to_u64() > 0 && perf["running_us"].to_f64() > 0; + for(u64 i = 0; i < 512 && perf_stable; i++) + { + perf = request_perf(); + perf_stable = perf["worker_pid"].to_u64() > 0 && perf["running_us"].to_f64() > 0; + } + check("request_perf() stages stable repeated snapshots", perf_stable, json_encode(perf)); u64 parsed_epoch = time_parse("1970-01-01 00:00:05 UTC"); String utc_year = time_format_utc("%Y", parsed_epoch); diff --git a/src/wasm/worker.cpp b/src/wasm/worker.cpp index 205ce87..4142e9b 100644 --- a/src/wasm/worker.cpp +++ b/src/wasm/worker.cpp @@ -1711,23 +1711,29 @@ private: })); if(mod == "env" && name == "uce_host_request_perf") return(add([self](Caller, Span args, Span results) -> Result { - DValue response; - if(self->request_perf.active) + String encoded; + if(!self->hostcall_staged("request_perf", encoded)) { - f64 now = time_precise(); - response["worker_pid"] = (f64)self->request_perf.worker_pid; - response["parent_pid"] = (f64)self->request_perf.parent_pid; - response["request_count"] = (f64)self->request_perf.request_count; - if(self->request_perf.time_start > 0 && self->request_perf.time_init > 0) - response["accept_us"] = (f64)((self->request_perf.time_start - self->request_perf.time_init) * 1000000.0); - if(self->request_perf.time_start > 0) - response["running_us"] = (f64)((now - self->request_perf.time_start) * 1000000.0); - if(self->request_perf.time_init > 0) - response["total_us"] = (f64)((now - self->request_perf.time_init) * 1000000.0); - if(self->workspace_birth_us > 0) - response["workspace_birth_us"] = (f64)self->workspace_birth_us; + DValue response; + if(self->request_perf.active) + { + f64 now = time_precise(); + response["worker_pid"] = (f64)self->request_perf.worker_pid; + response["parent_pid"] = (f64)self->request_perf.parent_pid; + response["request_count"] = (f64)self->request_perf.request_count; + if(self->request_perf.time_start > 0 && self->request_perf.time_init > 0) + response["accept_us"] = (f64)((self->request_perf.time_start - self->request_perf.time_init) * 1000000.0); + if(self->request_perf.time_start > 0) + response["running_us"] = (f64)((now - self->request_perf.time_start) * 1000000.0); + if(self->request_perf.time_init > 0) + response["total_us"] = (f64)((now - self->request_perf.time_init) * 1000000.0); + if(self->workspace_birth_us > 0) + response["workspace_birth_us"] = (f64)self->workspace_birth_us; + } + encoded = ucb_encode(response); + if(args[2].i32() == 0) + self->hostcall_stage("request_perf", encoded); } - String encoded = ucb_encode(response); u32 cap = (u32)args[3].i32(); int32_t buf = args[2].i32(); if(buf != 0 && cap >= encoded.size())