From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> The stat functions in worker are not generic enough to deserve to be "non-worker", so just pass the worker instance. --- server/red_worker.c | 59 +++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/server/red_worker.c b/server/red_worker.c index e5486c4..65961db 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -162,18 +162,8 @@ static inline red_time_t timespec_to_red_time(struct timespec *time) return (red_time_t) time->tv_sec * (1000 * 1000 * 1000) + time->tv_nsec; } -static clockid_t clock_id; - typedef unsigned long stat_time_t; -static stat_time_t stat_now(void) -{ - struct timespec ts; - - clock_gettime(clock_id, &ts); - 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) { @@ -214,11 +204,11 @@ static inline void stat_init(stat_info_t *info, const char *name) stat_reset(info); } -static inline void stat_add(stat_info_t *info, stat_time_t start) +static inline void stat_add(struct RedWorker *worker, stat_info_t *info, stat_time_t start) { stat_time_t time; ++info->count; - time = stat_now() - start; + time = stat_now(worker) - start; info->total += time; info->max = MAX(info->max, time); info->min = MIN(info->min, time); @@ -244,12 +234,13 @@ static inline void stat_compress_init(stat_info_t *info, const char *name) stat_reset(info); } -static inline void stat_compress_add(stat_info_t *info, stat_time_t start, int orig_size, +static inline void stat_compress_add(struct RedWorker *worker, stat_info_t *info, + stat_time_t start, int orig_size, int comp_size) { stat_time_t time; ++info->count; - time = stat_now() - start; + time = stat_now(worker) - start; info->total += time; info->max = MAX(info->max, time); info->min = MIN(info->min, time); @@ -869,6 +860,7 @@ typedef struct ItemTrace { typedef struct RedWorker { pthread_t thread; + clockid_t clockid; DisplayChannel *display_channel; CursorChannel *cursor_channel; QXLInstance *qxl; @@ -988,6 +980,16 @@ typedef struct BitmapData { } BitmapData; static inline int validate_surface(RedWorker *worker, uint32_t surface_id); + +static stat_time_t stat_now(RedWorker *worker) +{ + clockid_t clock_id = worker->clockid; + struct timespec ts; + + clock_gettime(clock_id, &ts); + return ts.tv_nsec + ts.tv_sec * 1000 * 1000 * 1000; +} + static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable); static void red_current_flush(RedWorker *worker, int surface_id); static void red_draw_drawable(RedWorker *worker, Drawable *item); @@ -2099,7 +2101,7 @@ static inline void __exclude_region(RedWorker *worker, Ring *ring, TreeItem *ite { QRegion and_rgn; #ifdef RED_WORKER_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif region_clone(&and_rgn, rgn); @@ -2169,7 +2171,7 @@ static void exclude_region(RedWorker *worker, Ring *ring, RingItem *ring_item, Q TreeItem **last, Drawable *frame_candidate) { #ifdef RED_WORKER_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif Ring *top_ring; @@ -3483,7 +3485,7 @@ static inline int red_current_add(RedWorker *worker, Ring *ring, Drawable *drawa { DrawItem *item = &drawable->tree_item; #ifdef RED_WORKER_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif RingItem *now; QRegion exclude_rgn; @@ -3630,7 +3632,7 @@ static inline int red_current_add_with_shadow(RedWorker *worker, Ring *ring, Dra SpicePoint *delta) { #ifdef RED_WORKER_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif Shadow *shadow = __new_shadow(worker, item, delta); @@ -4737,7 +4739,7 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int * if (worker->record_fd) red_record_qxl_command(worker->record_fd, &worker->mem_slots, ext_cmd, - stat_now()); + stat_now(worker)); stat_inc_counter(worker->command_counter, 1); worker->repoll_cmd_ring = 0; @@ -5761,7 +5763,7 @@ static inline int red_glz_compress_image(DisplayChannelClient *dcc, DisplayChannel *display_channel = DCC_TO_DC(dcc); RedWorker *worker = display_channel->common.worker; #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif spice_assert(bitmap_fmt_is_rgb(src->format)); GlzData *glz_data = &dcc->glz_data; @@ -5804,7 +5806,7 @@ static inline int red_glz_compress_image(DisplayChannelClient *dcc, goto glz; } #ifdef COMPRESS_STAT - start_time = stat_now(); + start_time = stat_now(worker); #endif zlib_data = &worker->zlib_data; @@ -5867,7 +5869,7 @@ static inline int red_lz_compress_image(DisplayChannelClient *dcc, int size; // size of the compressed data #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif lz_data->data.bufs_tail = red_display_alloc_compress_buf(dcc); @@ -5953,7 +5955,7 @@ static int red_jpeg_compress_image(DisplayChannelClient *dcc, SpiceImage *dest, uint8_t *lz_out_start_byte; #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif switch (src->format) { case SPICE_BITMAP_FMT_16BIT: @@ -6087,7 +6089,7 @@ static int red_lz4_compress_image(DisplayChannelClient *dcc, SpiceImage *dest, int lz4_size = 0; #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif lz4_data->data.bufs_tail = red_display_alloc_compress_buf(dcc); @@ -6153,7 +6155,7 @@ static inline int red_quic_compress_image(DisplayChannelClient *dcc, SpiceImage int size, stride; #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(); + stat_time_t start_time = stat_now(worker); #endif switch (src->format) { @@ -11656,7 +11658,7 @@ static void worker_dispatcher_record(void *opaque, uint32_t message_type, void * { RedWorker *worker = opaque; - red_record_event(worker->record_fd, 1, message_type, stat_now()); + red_record_event(worker->record_fd, 1, message_type, stat_now(worker)); } static void register_callbacks(Dispatcher *dispatcher) @@ -11960,9 +11962,8 @@ SPICE_GNUC_NORETURN static 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 - // TODO: call once unconditionnally - if (pthread_getcpuclockid(pthread_self(), &clock_id)) { - spice_error("pthread_getcpuclockid failed"); + if (pthread_getcpuclockid(pthread_self(), &worker->clockid)) { + spice_warning("getcpuclockid failed"); } for (;;) { -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel