X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fpiecewise.c;fp=hacks%2Fpiecewise.c;h=d8cc58d5e947465ee71c60c62f82b3bdf32f1b35;hb=bc7b7a8eb122206d239ec0e693676bcce31be1aa;hp=9de3bdaa75707e9ef3ef2fd575ea070d31220679;hpb=ffd8c0873576a9e3065696a624dce6b766b77062;p=xscreensaver diff --git a/hacks/piecewise.c b/hacks/piecewise.c index 9de3bdaa..d8cc58d5 100644 --- a/hacks/piecewise.c +++ b/hacks/piecewise.c @@ -370,6 +370,7 @@ void event_insert(event **eq, event *e) { if (!*eq) { e->l = e->r = 0; *eq = e; + return; /* avoid leak */ } event_cut_y = e->y; @@ -381,6 +382,8 @@ void event_insert(event **eq, event *e) { e->r = 0; /* doing this instead of dying might be dangerous */ (*eq)->l = e; } + else + free(e); /* don't leak! */ } else if (e->y < (*eq)->y) { e->l = (*eq)->l; @@ -478,7 +481,7 @@ void fringe_intersect(event **eq, double y, fringe *lo, fringe *hi) { #define CHECK(xi, yi) (y <= yi && ((xi < lo->c->x) ^ lo->side) && ((xi < hi->c->x) ^ hi->side)) #define ADD_CROSS(xi, yi, ilo, ihi) { \ - e = malloc(sizeof(event)); \ + e = malloc(sizeof(event)); /* #### LEAK */ \ e->kind = CROSS; \ e->x = xi; e->y = yi; \ e->lo = ilo; e->hi = ihi; \ @@ -786,6 +789,25 @@ XrmOptionDescRec options [] = { { 0, 0, 0, 0 } }; +static void +check_for_leaks (void) +{ +#ifdef HAVE_SBRK + static unsigned long early_brk = 0; + unsigned long max = 30 * 1024 * 1024; /* 30 MB */ + int b = (unsigned long) sbrk(0); + if (early_brk == 0) + early_brk = b; + else if (b > early_brk + max) + { + fprintf (stderr, "%s: leaked %lu MB -- aborting!\n", + progname, ((b - early_brk) >> 20)); + exit (1); + } +#endif /* HAVE_SBRK */ +} + + void screenhack(Display *dpy, Window window) { int i; Bool dbuf; @@ -888,5 +910,6 @@ void screenhack(Display *dpy, Window window) { screenhack_handle_events(dpy); if (delay) usleep(delay); + check_for_leaks(); } }