[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