From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- server/red_record_qxl.c | 12 ++++++++++++ server/red_record_qxl.h | 2 ++ server/red_worker.c | 24 ++++-------------------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/server/red_record_qxl.c b/server/red_record_qxl.c index 481eb16..a72a200 100644 --- a/server/red_record_qxl.c +++ b/server/red_record_qxl.c @@ -792,3 +792,15 @@ void red_record_dev_input_primary_surface_create(FILE *fd, write_binary(fd, "data", line_0 ? abs(surface->stride)*surface->height : 0, line_0); } + +void red_record_event(FILE *fd, int what, uint32_t type, unsigned long ts) +{ + static int counter = 0; + + // TODO: record the size of the packet in the header. This would make + // navigating it much faster (well, I can add an index while I'm at it..) + // and make it trivial to get a histogram from a file. + // But to implement that I would need some temporary buffer for each event. + // (that can be up to VGA_FRAMEBUFFER large) + fprintf(fd, "event %d %d %u %lu\n", counter++, what, type, ts); +} diff --git a/server/red_record_qxl.h b/server/red_record_qxl.h index 1be9e41..f7dcdc0 100644 --- a/server/red_record_qxl.h +++ b/server/red_record_qxl.h @@ -41,4 +41,6 @@ void red_record_cursor_cmd(FILE *fd, RedMemSlotInfo *slots, int group_id, void red_record_dev_input_primary_surface_create( FILE *fd, QXLDevSurfaceCreate *surface, uint8_t *line_0); +void red_record_event(FILE *fd, int what, uint32_t type, unsigned long ts); + #endif diff --git a/server/red_worker.c b/server/red_worker.c index 0540249..98a39dd 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -167,7 +167,6 @@ static inline red_time_t timespec_to_red_time(struct timespec *time) return time->tv_sec * (1000 * 1000 * 1000) + time->tv_nsec; } -#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT) static clockid_t clock_id; typedef unsigned long stat_time_t; @@ -180,6 +179,7 @@ static stat_time_t stat_now(void) return ts.tv_nsec + ts.tv_sec * 1000 * 1000 * 1000; } +#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT) double stat_cpu_time_to_sec(stat_time_t time) { return (double)time / (1000 * 1000 * 1000); @@ -5019,24 +5019,10 @@ static RedDrawable *red_drawable_new(void) return red; } -static void red_record_event(RedWorker *worker, int what, uint32_t type) -{ - struct timespec ts; - static int counter = 0; - - // TODO: record the size of the packet in the header. This would make - // navigating it much faster (well, I can add an index while I'm at it..) - // and make it trivial to get a histogram from a file. - // But to implement that I would need some temporary buffer for each event. - // (that can be up to VGA_FRAMEBUFFER large) - clock_gettime(worker->record_clock_id, &ts); - fprintf(worker->record_fd, "event %d %d %d %ld\n", counter++, what, type, - ts.tv_nsec + ts.tv_sec * 1000 * 1000 * 1000); -} - static void red_record_command(RedWorker *worker, QXLCommandExt ext_cmd) { - red_record_event(worker, 0, ext_cmd.cmd.type); + red_record_event(worker->record_fd, 0, ext_cmd.cmd.type, stat_now()); + switch (ext_cmd.cmd.type) { case QXL_CMD_DRAW: red_record_drawable(worker->record_fd, &worker->mem_slots, ext_cmd.group_id, @@ -11939,7 +11925,7 @@ static void worker_dispatcher_record(void *opaque, uint32_t message_type, void * RedWorker *worker = opaque; if (worker->record_fd) { - red_record_event(worker, 1, message_type); + red_record_event(worker->record_fd, 1, message_type, stat_now()); } } @@ -12247,11 +12233,9 @@ SPICE_GNUC_NORETURN void *red_worker_main(void *arg) spice_assert(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW && MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message -#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT) if (pthread_getcpuclockid(pthread_self(), &clock_id)) { spice_error("pthread_getcpuclockid failed"); } -#endif red_init(worker, (WorkerInitData *)arg); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel