void *worker (void *arg) { worker_t *worker = arg; long prev_count = -1; client_t **prevp = &worker->clients; uint64_t c = 0; worker->running = 1; worker->wakeup_ms = (int64_t)0; worker->time_ms = timing_get_time(); while (1) { client_t *client = *prevp; uint64_t sched_ms = worker->time_ms + 12; c = 0; while (client) { if (client->worker != worker) abort(); /* process client details but skip those that are not ready yet */ if (client->flags & CLIENT_ACTIVE) { int ret = 0; client_t *nx = client->next_on_worker; int process = (worker->running == 0 || client->schedule_ms <= sched_ms) ? 1 : 0; if (process) { if (c > 300 && c & 1) // only process alternate clients after so many process = 0; } else if (client->wakeup && *client->wakeup) { if (c & 1) process = 1; // enable this one to pass through else client->schedule_ms = worker->time_ms; } if (process) { c++; if ((c & 31) == 0) { // update these after so many to keep in sync worker->time_ms = timing_get_time(); worker->current_time.tv_sec = (time_t)(worker->time_ms/1000); } ret = client->ops->process (client); if (ret < 0) { client->worker = NULL; if (client->ops->release) client->ops->release (client); } if (ret) { worker->count--; if (nx == NULL) /* is this the last client */ worker->last_p = prevp; client = *prevp = nx; continue; } } if ((client->flags & CLIENT_ACTIVE) && client->schedule_ms < worker->wakeup_ms) worker->wakeup_ms = client->schedule_ms; } prevp = &client->next_on_worker; client = *prevp; } if (prev_count != worker->count) { DEBUG2 ("%p now has %d clients", worker, worker->count); prev_count = worker->count; } if (worker->running == 0) { if (global.running == ICE_RUNNING) break; if (worker->count == 0 && worker->pending_count == 0) break; } prevp = worker_wait (worker); } worker_relocate_clients (worker); INFO0 ("shutting down"); return NULL; }
void *worker (void *arg) { worker_t *worker = arg; long prev_count = -1; client_t **prevp = &worker->clients; worker->running = 1; worker->wakeup_ms = (int64_t)0; worker->time_ms = timing_get_time(); while (1) { client_t *client = *prevp; uint64_t sched_ms = worker->time_ms + 2; while (client) { if (client->worker != worker) abort(); /* process client details but skip those that are not ready yet */ if (client->flags & CLIENT_ACTIVE) { int ret = 0; client_t *nx = client->next_on_worker; if (worker->running == 0 || client->schedule_ms <= sched_ms) { ret = client->ops->process (client); if (ret < 0) { client->worker = NULL; if (client->ops->release) client->ops->release (client); } if (ret) { worker->count--; if (nx == NULL) /* is this the last client */ worker->last_p = prevp; client = *prevp = nx; continue; } } if ((client->flags & CLIENT_ACTIVE) && client->schedule_ms < worker->wakeup_ms) worker->wakeup_ms = client->schedule_ms; } prevp = &client->next_on_worker; client = *prevp; } if (prev_count != worker->count) { DEBUG2 ("%p now has %d clients", worker, worker->count); prev_count = worker->count; } if (worker->running == 0) { if (global.running == ICE_RUNNING) break; if (worker->count == 0 && worker->pending_count == 0) break; } prevp = worker_wait (worker); } worker_relocate_clients (worker); INFO0 ("shutting down"); return NULL; }
void *worker (void *arg) { worker_t *worker = arg; long prev_count = -1; client_t **prevp = &worker->clients; uint64_t c = 0; worker->running = 1; worker->wakeup_ms = (int64_t)0; worker->time_ms = timing_get_time(); while (1) { client_t *client = *prevp; uint64_t sched_ms = worker->time_ms + 12; c = 0; while (client) { if (client->worker != worker) abort(); /* process client details but skip those that are not ready yet */ if (client->flags & CLIENT_ACTIVE) { int ret = 0; client_t *nx = client->next_on_worker; int process = 1; if (worker->running) // force all active clients to run on worker shutdown { if (client->schedule_ms <= sched_ms) { if (c > 9000 && client->wakeup == NULL) process = 0; } else if (client->wakeup == NULL || *client->wakeup == 0) { process = 0; } } if (process) { if ((c & 511) == 0) { // update these periodically to keep in sync worker->time_ms = worker_check_time_ms (worker); worker->current_time.tv_sec = (time_t)(worker->time_ms/1000); } c++; ret = client->ops->process (client); if (ret < 0) { client->worker = NULL; if (client->ops->release) client->ops->release (client); } if (ret) { worker->count--; if (nx == NULL) /* is this the last client */ worker->last_p = prevp; client = *prevp = nx; continue; } } if ((client->flags & CLIENT_ACTIVE) && client->schedule_ms < worker->wakeup_ms) worker->wakeup_ms = client->schedule_ms; } prevp = &client->next_on_worker; client = *prevp; } if (prev_count != worker->count) { DEBUG2 ("%p now has %d clients", worker, worker->count); prev_count = worker->count; } if (worker->running == 0) { if (global.running == ICE_RUNNING) break; if (worker->count == 0 && worker->pending_count == 0) break; } prevp = worker_wait (worker); } worker_relocate_clients (worker); INFO0 ("shutting down"); return NULL; }