static void worker_wait_cb(worker_pool_t *pool)
{
- int running, queued;
systemd_zone_load_timeout_notify();
- worker_pool_status(pool, true, &running, &queued);
- systemd_tasks_status_notify(running + queued);
+
+ static uint64_t last_ns = 0;
+ struct timespec now = time_now();
+ uint64_t now_ns = 1000000000 * now.tv_sec + now.tv_nsec;
+ /* Too frequent worker_pool_status() call with many zones is expensive. */
+ if (now_ns - last_ns > 1000000000) {
+ int running, queued;
+ worker_pool_status(pool, true, &running, &queued);
+ systemd_tasks_status_notify(running + queued);
+ last_ns = now_ns;
+ }
}
int server_start(server_t *server, bool async)