[Spice-devel] [PATCH 6/9] worker: use a single clockid

Frediano Ziglio fziglio at redhat.com
Wed Oct 21 05:38:18 PDT 2015


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> 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


More information about the Spice-devel mailing list