diff options
Diffstat (limited to 'xrdp/xrdp_cache.c')
| -rw-r--r-- | xrdp/xrdp_cache.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c index 20445b63..f9df7ad5 100644 --- a/xrdp/xrdp_cache.c +++ b/xrdp/xrdp_cache.c @@ -1,4 +1,3 @@ - /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -60,11 +59,12 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) { int i; int j; - int min_use; + int oldest; int cache_id; int cache_idx; struct xrdp_bitmap* b; + self->bitmap_stamp++; /* look for match */ for (i = 0; i < 3; i++) { @@ -72,35 +72,35 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) { if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) { - self->bitmap_items[i][j].use_count++; - DEBUG(("found bitmap at %d %d\n", i, j)); + self->bitmap_items[i][j].stamp = self->bitmap_stamp; + DEBUG(("found bitmap at %d %d\n\r", i, j)); return MAKELONG(i, j); } } } - /* look for least used */ + /* look for oldest */ cache_id = 0; cache_idx = 0; - min_use = 999999; + oldest = 0x7fffffff; for (i = 0; i < 3; i++) { for (j = 0; j < 600; j++) { - if (self->bitmap_items[i][j].use_count < min_use) + if (self->bitmap_items[i][j].stamp < oldest) { - min_use = self->bitmap_items[i][j].use_count; + oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } - DEBUG(("adding bitmap at %d %d\n", cache_id, cache_idx)); + DEBUG(("adding bitmap at %d %d\n\r", cache_id, cache_idx)); /* set, send bitmap and return */ xrdp_bitmap_delete(self->bitmap_items[cache_id][cache_idx].bitmap); b = xrdp_bitmap_create(bitmap->width, bitmap->height, bitmap->bpp, 0); xrdp_bitmap_copy_box(bitmap, b, 0, 0, bitmap->width, bitmap->height); self->bitmap_items[cache_id][cache_idx].bitmap = b; - self->bitmap_items[cache_id][cache_idx].use_count++; + self->bitmap_items[cache_id][cache_idx].stamp = self->bitmap_stamp; xrdp_orders_send_raw_bitmap(self->orders, b, cache_id, cache_idx); return MAKELONG(cache_id, cache_idx); } @@ -109,8 +109,8 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette) { int i; - int min_use; - int min_use_index; + int oldest; + int index; if (self == 0) return 0; @@ -118,33 +118,33 @@ int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette) return 0; if (self->wm->screen->bpp > 8) return 0; + self->palette_stamp++; /* look for match */ for (i = 0; i < 6; i++) { if (g_memcmp(palette, self->palette_items[i].palette, 256 * sizeof(int)) == 0) { - self->palette_items[i].use_count++; + self->palette_items[i].stamp = self->palette_stamp; return i; } } - /* look for least used */ - min_use_index = 0; - min_use = 999999; + /* look for oldest */ + index = 0; + oldest = 0x7fffffff; for (i = 0; i < 6; i++) { - if (self->palette_items[i].use_count < min_use) + if (self->palette_items[i].stamp < oldest) { - min_use = self->palette_items[i].use_count; - min_use_index = i; + oldest = self->palette_items[i].stamp; + index = i; } } /* set, send palette and return */ - g_memcpy(self->palette_items[min_use_index].palette, palette, - 256 * sizeof(int)); - self->palette_items[min_use_index].use_count++; - xrdp_orders_send_palette(self->orders, palette, min_use_index); - return min_use_index; + g_memcpy(self->palette_items[index].palette, palette, 256 * sizeof(int)); + self->palette_items[index].stamp = self->palette_stamp; + xrdp_orders_send_palette(self->orders, palette, index); + return index; } /*****************************************************************************/ @@ -153,12 +153,13 @@ int xrdp_cache_add_char(struct xrdp_cache* self, { int i; int j; - int min_use; + int oldest; int f; int c; int datasize; struct xrdp_font_item* fi; + self->char_stamp++; /* look for match */ for (i = 7; i < 12; i++) { @@ -166,23 +167,23 @@ int xrdp_cache_add_char(struct xrdp_cache* self, { if (xrdp_font_item_compare(&self->char_items[i][j].font_item, font_item)) { - self->char_items[i][j].use_count++; + self->char_items[i][j].stamp = self->char_stamp; DEBUG(("found font at %d %d\n\r", i, j)); return MAKELONG(i, j); } } } - /* look for least used */ + /* look for oldest */ f = 0; c = 0; - min_use = 999999; + oldest = 0x7fffffff; for (i = 7; i < 12; i++) { for (j = 0; j < 250; j++) { - if (self->char_items[i][j].use_count < min_use) + if (self->char_items[i][j].stamp < oldest) { - min_use = self->char_items[i][j].use_count; + oldest = self->char_items[i][j].stamp; f = i; c = j; } @@ -199,7 +200,7 @@ int xrdp_cache_add_char(struct xrdp_cache* self, fi->baseline = font_item->baseline; fi->width = font_item->width; fi->height = font_item->height; - self->char_items[f][c].use_count++; + self->char_items[f][c].stamp = self->char_stamp; xrdp_orders_send_font(self->orders, fi, f, c); return MAKELONG(f, c); } |
