On Wed, Sep 11, 2013 at 11:44:35AM -0400, Jasper St. Pierre wrote: > Though I'd love to look into the gnome-shell issue more (changing to the > overview should not call XIGrabKey/XIUngrabKey a ton of times), the > handling in the server here was ridiculous and this is obviously an > improvement. > > Reviewed-by: Jasper St. Pierre <[email protected]>
merged, thanks. Cheers, Peter > On Tue, Sep 10, 2013 at 2:18 PM, Adam Jackson <[email protected]> wrote: > > > 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 <[email protected]> > > --- > > dix/inpututils.c | 30 +++++++++++++----------------- > > 1 file changed, 13 insertions(+), 17 deletions(-) > > > > diff --git a/dix/inpututils.c b/dix/inpututils.c > > index 9e38e17..a10a7c7 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; > > } > > -- > > 1.8.3.1 > > > > _______________________________________________ > > [email protected]: X.Org development > > Archives: http://lists.x.org/archives/xorg-devel > > Info: http://lists.x.org/mailman/listinfo/xorg-devel > > > > > > -- > Jasper > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
