> > 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 (;;) { Ack Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel