diff options
author | Adam Jackson <ajax@redhat.com> | 2013-09-10 14:18:18 -0400 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-10-14 11:07:37 +1000 |
commit | 5ac4bfca64bd75474e550b26bc1195a5ca245752 (patch) | |
tree | 1728070abf861616de52bdb43c8953cb526df0f3 /dix | |
parent | 44d502c6f1d03a9e548f0941cde0228b6fde8394 (diff) |
input: calloc minimization for xi2mask_new
There's no reason to do this as (nmasks + 2) callocs, and it's a
surprisingly hot path. Turns out you hit this ~once per passive grab,
and you do a few bajillion passive grab changes every time you enter or
leave the overview in gnome-shell. According to a callgrind of Xorg
with gnome-shell-perf-tool run against it:
Ir before: 721437275
Ir after: 454227086
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'dix')
-rw-r--r-- | dix/inpututils.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/dix/inpututils.c b/dix/inpututils.c index 9e38e1742..a10a7c761 100644 --- a/dix/inpututils.c +++ b/dix/inpututils.c @@ -960,8 +960,15 @@ XI2Mask * xi2mask_new_with_size(size_t nmasks, size_t size) { int i; + int alloc_size; + unsigned char *cursor; + XI2Mask *mask; - XI2Mask *mask = calloc(1, sizeof(*mask)); + alloc_size = sizeof(struct _XI2Mask) + + nmasks * sizeof(unsigned char *) + + nmasks * size; + + mask = calloc(1, alloc_size); if (!mask) return NULL; @@ -969,20 +976,14 @@ xi2mask_new_with_size(size_t nmasks, size_t size) mask->nmasks = nmasks; mask->mask_size = size; - mask->masks = calloc(mask->nmasks, sizeof(*mask->masks)); - if (!mask->masks) - goto unwind; + mask->masks = (unsigned char **)(mask + 1); + cursor = (unsigned char *)(mask + 1) + nmasks * sizeof(unsigned char *); - for (i = 0; i < mask->nmasks; i++) { - mask->masks[i] = calloc(1, mask->mask_size); - if (!mask->masks[i]) - goto unwind; + for (i = 0; i < nmasks; i++) { + mask->masks[i] = cursor; + cursor += size; } return mask; - - unwind: - xi2mask_free(&mask); - return NULL; } /** @@ -1003,14 +1004,9 @@ xi2mask_new(void) void xi2mask_free(XI2Mask **mask) { - int i; - if (!(*mask)) return; - for (i = 0; (*mask)->masks && i < (*mask)->nmasks; i++) - free((*mask)->masks[i]); - free((*mask)->masks); free((*mask)); *mask = NULL; } |