summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2011-08-04 16:39:09 +0300
committerAlon Levy <alevy@redhat.com>2011-08-23 18:27:53 +0300
commit16ed3f9f25ce9e069d4a95562fc6d04bddd779cf (patch)
treea1f12f7275545eb205bf59208f91182c50a9ef57 /server
parentf84dfeb0aac4b6b49bc447a2140cbc7c2882de51 (diff)
downloadspice-16ed3f9f25ce9e069d4a95562fc6d04bddd779cf.tar.gz
spice-16ed3f9f25ce9e069d4a95562fc6d04bddd779cf.tar.xz
spice-16ed3f9f25ce9e069d4a95562fc6d04bddd779cf.zip
drawables count for debug
Diffstat (limited to 'server')
-rw-r--r--server/red_worker.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index e767623e..43d0bae5 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -885,6 +885,8 @@ typedef struct RedWorker {
Ring current_list;
uint32_t current_size;
uint32_t drawable_count;
+ uint32_t red_drawable_count;
+ uint32_t glz_drawable_count;
uint32_t transparent_count;
uint32_t shadows_count;
@@ -1674,6 +1676,7 @@ static inline void put_red_drawable(RedWorker *worker, RedDrawable *drawable, ui
return;
}
+ worker->red_drawable_count--;
release_info_ext.group_id = group_id;
release_info_ext.info = drawable->release_info;
worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
@@ -1737,6 +1740,7 @@ static inline void release_drawable(RedWorker *worker, Drawable *drawable)
put_red_drawable(worker, drawable->red_drawable,
drawable->group_id, drawable->self_bitmap);
free_drawable(worker, drawable);
+ worker->drawable_count--;
}
}
@@ -1820,8 +1824,6 @@ static void red_flush_source_surfaces(RedWorker *worker, Drawable *drawable)
static inline void current_remove_drawable(RedWorker *worker, Drawable *item)
{
- worker->drawable_count--;
-
if (item->tree_item.effect != QXL_EFFECT_OPAQUE) {
worker->transparent_count--;
}
@@ -2300,8 +2302,8 @@ static inline void __current_add_drawable(RedWorker *worker, Drawable *drawable,
surface = &worker->surfaces[surface_id];
ring_add_after(&drawable->tree_item.base.siblings_link, pos);
ring_add(&worker->current_list, &drawable->list_link);
- worker->drawable_count++;
ring_add(&surface->current_list, &drawable->surface_list_link);
+ worker->current_size++;
drawable->refs++;
}
@@ -3220,7 +3222,6 @@ static inline int red_current_add(RedWorker *worker, Ring *ring, Drawable *drawa
print_base_item("ADD", &item->base);
ASSERT(!region_is_empty(&item->base.rgn));
- worker->current_size++;
region_init(&exclude_rgn);
now = ring_next(ring, ring);
@@ -3365,7 +3366,6 @@ static inline int red_current_add_with_shadow(RedWorker *worker, Ring *ring, Dra
return FALSE;
}
print_base_item("ADDSHADOW", &item->tree_item.base);
- worker->current_size++;
// item and his shadow must initially be placed in the same container.
// for now putting them on root.
@@ -3629,6 +3629,8 @@ static Drawable *get_drawable(RedWorker *worker, uint8_t effect, RedDrawable *re
while (!(drawable = alloc_drawable(worker))) {
free_one_drawable(worker, FALSE);
}
+ worker->drawable_count++;
+ worker->red_drawable_count++;
memset(drawable, 0, sizeof(Drawable));
drawable->refs = 1;
clock_gettime(CLOCK_MONOTONIC, &time);
@@ -4689,6 +4691,7 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *
*ring_is_empty = FALSE;
while (!display_is_connected(worker) ||
+ // TODO: change to average pipe size?
red_channel_min_pipe_size(&worker->display_channel->common.base) <= max_pipe_size) {
if (!worker->qxl->st->qif->get_command(worker->qxl, &ext_cmd)) {
*ring_is_empty = TRUE;;
@@ -4778,6 +4781,9 @@ static void red_free_some(RedWorker *worker)
DisplayChannelClient *dcc;
RingItem *item;
+ red_printf_debug(3, "#draw=%d, #red_draw=%d, #glz_draw=%d", worker->drawable_count,
+ worker->red_drawable_count,
+ worker->glz_drawable_count);
WORKER_FOREACH_DCC(worker, item, dcc) {
GlzSharedDictionary *glz_dict = dcc ? dcc->glz_dict : NULL;
@@ -5065,7 +5071,7 @@ static RedGlzDrawable *red_display_get_glz_drawable(DisplayChannelClient *dcc, D
ring_item_init(&ret->drawable_link);
ring_add_before(&ret->link, &dcc->glz_drawables);
ring_add(&drawable->glz_ring, &ret->drawable_link);
-
+ dcc->common.worker->glz_drawable_count++;
return ret;
}
@@ -5125,7 +5131,7 @@ static void red_display_free_glz_drawable_instance(DisplayChannelClient *dcc,
}
put_red_drawable(worker, glz_drawable->red_drawable,
glz_drawable->group_id, glz_drawable->self_bitmap);
-
+ worker->glz_drawable_count--;
if (ring_item_is_linked(&glz_drawable->link)) {
ring_remove(&glz_drawable->link);
}
@@ -5476,6 +5482,7 @@ static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *im
if (this_cc == drawable_cc) {
red_display_free_glz_drawable_instance(drawable_cc, glz_drawable_instance);
} else {
+ red_printf("error");
pthread_mutex_lock(&drawable_cc->glz_drawables_inst_to_free_lock);
ring_add_before(&glz_drawable_instance->free_link,
&drawable_cc->glz_drawables_inst_to_free);
@@ -8639,6 +8646,9 @@ static void display_channel_client_on_disconnect(RedChannelClient *rcc)
if (!red_channel_is_connected(rcc->channel)) {
red_display_destroy_compress_bufs(display_channel);
}
+ red_printf_debug(3, "#draw=%d, #red_draw=%d, #glz_draw=%d", worker->drawable_count,
+ worker->red_drawable_count,
+ worker->glz_drawable_count);
}
void red_disconnect_all_display_TODO_remove_me(RedChannel *channel)
@@ -10411,16 +10421,28 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
break;
case RED_WORKER_MESSAGE_OOM:
ASSERT(worker->running);
+ // streams? but without streams also leak
+ red_printf_debug(1, "OOM1 #draw=%u, #red_draw=%u, #glz_draw=%u current %u pipes %u",
+ worker->drawable_count,
+ worker->red_drawable_count,
+ worker->glz_drawable_count,
+ worker->current_size,
+ worker->display_channel ?
+ red_channel_sum_pipes_size(display_red_channel) : 0);
while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
red_channel_push(&worker->display_channel->common.base);
}
if (worker->qxl->st->qif->flush_resources(worker->qxl) == 0) {
- red_printf("oom current %u pipes %u", worker->current_size,
- worker->display_channel ?
- red_channel_sum_pipes_size(display_red_channel) : 0);
red_free_some(worker);
worker->qxl->st->qif->flush_resources(worker->qxl);
}
+ red_printf_debug(1, "OOM2 #draw=%u, #red_draw=%u, #glz_draw=%u current %u pipes %u",
+ worker->drawable_count,
+ worker->red_drawable_count,
+ worker->glz_drawable_count,
+ worker->current_size,
+ worker->display_channel ?
+ red_channel_sum_pipes_size(display_red_channel) : 0);
clear_bit(RED_WORKER_PENDING_OOM, worker->pending);
break;
case RED_WORKER_MESSAGE_RESET_CURSOR: