summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-04-01 21:30:52 +0300
committerYonit Halperin <yhalperi@redhat.com>2013-04-22 16:30:54 -0400
commitd146ae0d926075bcedf93a654c793065c3bebf66 (patch)
treef700cebdda28cf285b3edafb53dacb84afc61b84
parente3bc21957086ce03edcb3867affc2d820291fe75 (diff)
downloadspice-d146ae0d926075bcedf93a654c793065c3bebf66.tar.gz
spice-d146ae0d926075bcedf93a654c793065c3bebf66.tar.xz
spice-d146ae0d926075bcedf93a654c793065c3bebf66.zip
server/red_worker: assign timer callbacks to worker_core, using spice_timer_queue
display channel - supplying timeouts interface to red_channel, in order to allow periodic latency monitoring (see next patch).
-rw-r--r--server/red_worker.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 3d27f412..ab21c545 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -80,6 +80,7 @@
#include "dispatcher.h"
#include "main_channel.h"
#include "migration_protocol.h"
+#include "spice_timer_queue.h"
//#define COMPRESS_STAT
//#define DUMP_BITMAP
@@ -10090,6 +10091,11 @@ static void worker_watch_remove(SpiceWatch *watch)
}
SpiceCoreInterface worker_core = {
+ .timer_add = spice_timer_queue_add,
+ .timer_start = spice_timer_set,
+ .timer_cancel = spice_timer_cancel,
+ .timer_remove = spice_timer_remove,
+
.watch_update_mask = worker_watch_update_mask,
.watch_add = worker_watch_add,
.watch_remove = worker_watch_remove,
@@ -11860,6 +11866,10 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
spice_warn_if(init_data->n_surfaces > NUM_SURFACES);
worker->n_surfaces = init_data->n_surfaces;
+ if (!spice_timer_queue_create()) {
+ spice_error("failed to create timer queue");
+ }
+
message = RED_WORKER_MESSAGE_READY;
write_message(worker->channel, &message);
}
@@ -11893,10 +11903,14 @@ SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
worker->event_timeout = INF_EVENT_WAIT;
for (;;) {
int i, num_events;
+ unsigned int timers_queue_timeout;
+ timers_queue_timeout = spice_timer_queue_get_timeout_ms();
worker->event_timeout = MIN(red_get_streams_timout(worker), worker->event_timeout);
+ worker->event_timeout = MIN(timers_queue_timeout, worker->event_timeout);
num_events = poll(worker->poll_fds, MAX_EVENT_SOURCES, worker->event_timeout);
red_handle_streams_timout(worker);
+ spice_timer_queue_cb();
if (worker->display_channel) {
/* during migration, in the dest, the display channel can be initialized