diff --git a/src/builder/b-comms.c b/src/builder/b-comms.c
index 1740f38..0ebf7d7 100644
--- a/src/builder/b-comms.c
+++ b/src/builder/b-comms.c
@@ -589,6 +589,7 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul)
struct sai_plat_server, sul_load_report);
sai_load_report_t *lr = calloc(1, sizeof(*lr));
struct sai_plat *sp = NULL;
+ char somebody_not_idle = 0;
if (!lr)
return;
@@ -628,6 +629,7 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul)
/* If the instance is idle, its load is 0, regardless of system load. */
load = 0;
} else {
+ somebody_not_idle = 1;
/* The instance is busy, try to get a specific load for it. */
load = saib_get_cgroup_cpu(ns);
if (load < 0)
@@ -650,8 +652,9 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul)
if (lws_ss_request_tx(spm->ss))
lwsl_debug("%s: request tx failed\n", __func__);
- /* Reschedule the timer */
- lws_sul_schedule(builder.context, 0, &spm->sul_load_report,
+ if (somebody_not_idle)
+ /* Reschedule the timer only if at least one active instance */
+ lws_sul_schedule(builder.context, 0, &spm->sul_load_report,
saib_sul_load_report_cb, SAI_LOAD_REPORT_US);
}
diff --git a/src/builder/b-load.c b/src/builder/b-load.c
index 9d37f16..2074661 100644
--- a/src/builder/b-load.c
+++ b/src/builder/b-load.c
@@ -1,7 +1,7 @@
/*
* Sai builder - platform-specific load reporting
*
- * Copyright (C) 2021 Andy Green <andy@warmcat.com>
+ * Copyright (C) 2025 Andy Green <andy@warmcat.com>
*
* This file is part of Sai.
*
diff --git a/src/builder/b-task.c b/src/builder/b-task.c
index c827217..b7d0828 100644
--- a/src/builder/b-task.c
+++ b/src/builder/b-task.c
@@ -727,6 +727,11 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len)
lwsl_notice("%s: cancelling suspend grace time\n", __func__);
lws_sul_cancel(&ns->builder->sul_idle);
+ /* if we weren't, we should report load on instances now we're busy */
+ if (lws_dll2_is_detached(&spm->sul_load_report.list))
+ lws_sul_schedule(ns->builder->context, 0, &spm->sul_load_report,
+ saib_sul_load_report_cb, 1);
+
/*
* Let the mirror thread get on with things...
*
@@ -780,17 +785,41 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len)
case SAIB_RX_VIEWERSTATE:
{
sai_viewer_state_t *vs = (sai_viewer_state_t *)a.dest;
+ char any_busy = 0;
+
lwsl_notice("Received viewer state update: %u viewers\n",
vs->viewers);
spm->viewer_count = vs->viewers;
- if (vs->viewers)
- /* At least one viewer, start reporting */
- lws_sul_schedule(builder.context, 0, &spm->sul_load_report,
- saib_sul_load_report_cb, SAI_LOAD_REPORT_US);
- else
+ if (!vs->viewers) {
lws_sul_cancel(&spm->sul_load_report);
+ break;
+ }
+
+ /* are there any busy instances */
+
+ lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1,
+ builder.sai_plat_owner.head) {
+ sp = lws_container_of(d, sai_plat_t, sai_plat_list);
+
+ lws_start_foreach_dll(struct lws_dll2 *, d, sp->nspawn_owner.head) {
+ struct sai_nspawn *ns = lws_container_of(d, struct sai_nspawn, list);
+
+ if (ns->state == NSSTATE_BUILD)
+ any_busy = 1;
+
+ } lws_end_foreach_dll(d);
+ } lws_end_foreach_dll_safe(d, d1);
+
+ if (!any_busy) {
+ lws_sul_cancel(&spm->sul_load_report);
+ break;
+ }
+
+ /* At least one viewer, start reporting */
+ lws_sul_schedule(builder.context, 0, &spm->sul_load_report,
+ saib_sul_load_report_cb, 1);
}
break;
diff --git a/src/server/s-comms.c b/src/server/s-comms.c
index 9fe5685..51c86fe 100644
--- a/src/server/s-comms.c
+++ b/src/server/s-comms.c
@@ -849,6 +849,8 @@ callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user,
LWS_WRITE_TEXT) < 0)
return -1;
+ lws_callback_on_writable(pss->wsi);
+
goto passthru;
}
break;
diff --git a/src/server/s-websrv.c b/src/server/s-websrv.c
index ffb3afb..9ad9faa 100644
--- a/src/server/s-websrv.c
+++ b/src/server/s-websrv.c
@@ -494,8 +494,8 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
sum_viewers_cb, &total_viewers);
m->vhd->browser_viewer_count = total_viewers;
- lwsl_notice("%s: Client viewer count %u, total is now %u\n",
- __func__, m->viewers, m->vhd->browser_viewer_count);
+ lwsl_notice("%s: Client viewer count %u\n",
+ __func__, m->vhd->browser_viewer_count);
/* Broadcast the new viewer state to all connected builders */
lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) {