From d91275d959071c4f857a81bb9257a5c28975a0fa Mon Sep 17 00:00:00 2001 From: Dan Cross Date: Sun, 12 Oct 2025 01:14:35 +0000 Subject: [PATCH] memory: replace most of memory.c with Rust mem Replace `wmalloc` et al with wrappers around the Rust allocation library. --- WINGs/findfile.c | 6 +- WINGs/handlers.c | 4 +- WINGs/memory.c | 176 +------------------------------ WINGs/widgets.c | 3 +- WPrefs.app/Docks.c | 2 +- WPrefs.app/Focus.c | 2 +- WPrefs.app/HotCornerShortcuts.c | 2 +- WPrefs.app/Makefile.am | 1 + src/appmenu.c | 4 +- src/dialog.c | 31 +----- src/dock.c | 12 +-- src/event.c | 6 +- src/geomview.c | 2 +- src/main.c | 8 +- src/misc.c | 12 +-- src/properties.c | 12 +-- src/rootmenu.c | 8 +- src/session.c | 6 +- src/superfluous.c | 4 +- src/switchpanel.c | 3 +- src/window.c | 12 +-- src/xdnd.c | 4 +- util/Makefile.am | 33 ++++-- util/getstyle.c | 6 +- util/wmiv.c | 18 ++-- util/wmmenugen_misc.c | 2 +- util/wmsetbg.c | 4 +- util/wxcopy.c | 11 +- wmaker-rs/src/lib.rs | 3 +- wmaker-rs/src/memory.rs | 180 ++++++++++++++++++++++++++++++++ wmlib/Makefile.am | 3 +- wmlib/app.c | 12 ++- wmlib/menu.c | 30 +++--- wrlib/Makefile.am | 3 +- wrlib/context.c | 32 +++--- wrlib/convert.c | 44 ++++---- wrlib/convolve.c | 6 +- wrlib/load.c | 18 ++-- wrlib/load_gif.c | 6 +- wrlib/load_jpeg.c | 6 +- wrlib/load_png.c | 14 +-- wrlib/load_ppm.c | 8 +- wrlib/load_webp.c | 14 +-- wrlib/load_xpm.c | 8 +- wrlib/load_xpm_normalized.c | 42 ++++---- wrlib/raster.c | 12 ++- wrlib/save_jpeg.c | 6 +- wrlib/save_png.c | 6 +- wrlib/save_xpm.c | 6 +- wrlib/scale.c | 28 ++--- wrlib/tests/testgrad.c | 12 +-- wrlib/xutil.c | 24 +++-- 52 files changed, 475 insertions(+), 442 deletions(-) create mode 100644 wmaker-rs/src/memory.rs diff --git a/WINGs/findfile.c b/WINGs/findfile.c index bb2ce7f0..03026aee 100644 --- a/WINGs/findfile.c +++ b/WINGs/findfile.c @@ -456,7 +456,7 @@ int wcopy_file(const char *dest_dir, const char *src_file, const char *dest_file return -1; } - buffer = malloc(buffer_size); /* Don't use wmalloc to avoid the memset(0) we don't need */ + buffer = wmalloc(buffer_size); if (buffer == NULL) { werror(_("could not allocate memory for the copy buffer")); close(fd_dst); @@ -508,14 +508,14 @@ int wcopy_file(const char *dest_dir, const char *src_file, const char *dest_file if (close(fd_dst) != 0) { werror(_("could not close the file \"%s\": %s"), path_dst, strerror(errno)); cleanup_and_return_failure: - free(buffer); + wfree(buffer); close(fd_src); unlink(path_dst); wfree(path_dst); return -1; } - free(buffer); + wfree(buffer); wfree(path_dst); close(fd_src); diff --git a/WINGs/handlers.c b/WINGs/handlers.c index 88682867..264fb14c 100644 --- a/WINGs/handlers.c +++ b/WINGs/handlers.c @@ -126,7 +126,7 @@ WMHandlerID WMAddTimerHandler(int milliseconds, WMCallback * callback, void *cda { TimerHandler *handler; - handler = malloc(sizeof(TimerHandler)); + handler = wmalloc(sizeof(TimerHandler)); if (!handler) return NULL; @@ -214,7 +214,7 @@ WMHandlerID WMAddIdleHandler(WMCallback * callback, void *cdata) { IdleHandler *handler; - handler = malloc(sizeof(IdleHandler)); + handler = wmalloc(sizeof(IdleHandler)); if (!handler) return NULL; diff --git a/WINGs/memory.c b/WINGs/memory.c index e05e17a8..256f6516 100644 --- a/WINGs/memory.c +++ b/WINGs/memory.c @@ -19,34 +19,15 @@ * MA 02110-1301, USA. */ -#include "wconfig.h" +#include + #include "WUtil.h" -#include -#include -#include -#include -#include #include #include - -#ifdef HAVE_STDNORETURN +#include #include -#endif - -#ifdef USE_BOEHM_GC -#ifndef GC_DEBUG -#define GC_DEBUG -#endif /* !GC_DEBUG */ -#include -#endif /* USE_BOEHM_GC */ - -#ifndef False -# define False 0 -#endif -#ifndef True -# define True 1 -#endif +#include static void defaultHandler(int bla) { @@ -72,152 +53,3 @@ waborthandler *wsetabort(waborthandler * handler) return old; } - -static int Aborting = 0; /* if we're in the middle of an emergency exit */ - -static WMHashTable *table = NULL; - -void *wmalloc(size_t size) -{ - void *tmp; - - assert(size > 0); - -#ifdef USE_BOEHM_GC - tmp = GC_MALLOC(size); -#else - tmp = malloc(size); -#endif - if (tmp == NULL) { - wwarning("malloc() failed. Retrying after 2s."); - sleep(2); -#ifdef USE_BOEHM_GC - tmp = GC_MALLOC(size); -#else - tmp = malloc(size); -#endif - if (tmp == NULL) { - if (Aborting) { - fputs("Really Bad Error: recursive malloc() failure.", stderr); - exit(-1); - } else { - wfatal("virtual memory exhausted"); - Aborting = 1; - wAbort(False); - } - } - } - if (tmp != NULL) - memset(tmp, 0, size); - return tmp; -} - -void *wrealloc(void *ptr, size_t newsize) -{ - void *nptr; - - if (!ptr) { - nptr = wmalloc(newsize); - } else if (newsize == 0) { - wfree(ptr); - nptr = NULL; - } else { -#ifdef USE_BOEHM_GC - nptr = GC_REALLOC(ptr, newsize); -#else - nptr = realloc(ptr, newsize); -#endif - if (nptr == NULL) { - wwarning("realloc() failed. Retrying after 2s."); - sleep(2); -#ifdef USE_BOEHM_GC - nptr = GC_REALLOC(ptr, newsize); -#else - nptr = realloc(ptr, newsize); -#endif - if (nptr == NULL) { - if (Aborting) { - fputs("Really Bad Error: recursive realloc() failure.", stderr); - exit(-1); - } else { - wfatal("virtual memory exhausted"); - Aborting = 1; - wAbort(False); - } - } - } - } - return nptr; -} - -void *wretain(void *ptr) -{ - int *refcount; - - if (!table) { - table = WMCreateHashTable(WMIntHashCallbacks); - } - - refcount = WMHashGet(table, ptr); - if (!refcount) { - refcount = wmalloc(sizeof(int)); - *refcount = 1; - WMHashInsert(table, ptr, refcount); -#ifdef VERBOSE - printf("== %i (%p)\n", *refcount, ptr); -#endif - } else { - (*refcount)++; -#ifdef VERBOSE - printf("+ %i (%p)\n", *refcount, ptr); -#endif - } - - return ptr; -} - -void wfree(void *ptr) -{ - if (ptr) -#ifdef USE_BOEHM_GC - /* This should eventually be removed, once the criss-cross - * of wmalloc()d memory being free()d, malloc()d memory being - * wfree()d, various misuses of calling wfree() on objects - * allocated by libc malloc() and calling libc free() on - * objects allocated by Boehm GC (think external libraries) - * is cleaned up. - */ - if (GC_base(ptr) != 0) - GC_FREE(ptr); - else - free(ptr); -#else - free(ptr); -#endif - ptr = NULL; -} - -void wrelease(void *ptr) -{ - int *refcount; - - refcount = WMHashGet(table, ptr); - if (!refcount) { - wwarning("trying to release unexisting data %p", ptr); - } else { - (*refcount)--; - if (*refcount < 1) { -#ifdef VERBOSE - printf("RELEASING %p\n", ptr); -#endif - WMHashRemove(table, ptr); - wfree(refcount); - wfree(ptr); - } -#ifdef VERBOSE - else { - printf("- %i (%p)\n", *refcount, ptr); - } -#endif - } -} diff --git a/WINGs/widgets.c b/WINGs/widgets.c index 95e4fd77..ec501254 100644 --- a/WINGs/widgets.c +++ b/WINGs/widgets.c @@ -610,10 +610,9 @@ WMScreen *WMCreateScreenWithRContext(Display * display, int screen, RContext * c assert(W_ApplicationInitialized()); } - scrPtr = malloc(sizeof(W_Screen)); + scrPtr = wmalloc(sizeof(W_Screen)); if (!scrPtr) return NULL; - memset(scrPtr, 0, sizeof(W_Screen)); scrPtr->aflags.hasAppIcon = 1; diff --git a/WPrefs.app/Docks.c b/WPrefs.app/Docks.c index c83332c8..3a796dca 100644 --- a/WPrefs.app/Docks.c +++ b/WPrefs.app/Docks.c @@ -129,7 +129,7 @@ static void autoDelayChanged(void *observerData, WMNotification *notification) } char *value = WMGetTextFieldText(anAutoDelayT); adjustButtonSelectionBasedOnValue(panel, row, value); - free(value); + wfree(value); return; } } diff --git a/WPrefs.app/Focus.c b/WPrefs.app/Focus.c index 04198751..476a0898 100644 --- a/WPrefs.app/Focus.c +++ b/WPrefs.app/Focus.c @@ -138,7 +138,7 @@ static void storeData(_Panel * panel) if (sscanf(str, "%i", &i) != 1) i = 0; SetIntegerForKey(i, "RaiseDelay"); - free(str); + wfree(str); SetBoolForKey(WMGetButtonSelected(panel->ignB), "IgnoreFocusClick"); SetBoolForKey(WMGetButtonSelected(panel->newB), "AutoFocus"); diff --git a/WPrefs.app/HotCornerShortcuts.c b/WPrefs.app/HotCornerShortcuts.c index d3259d80..e19487ad 100644 --- a/WPrefs.app/HotCornerShortcuts.c +++ b/WPrefs.app/HotCornerShortcuts.c @@ -147,7 +147,7 @@ static void storeData(_Panel * panel) if (sscanf(str, "%i", &i) != 1) i = 0; SetIntegerForKey(i, "HotCornerDelay"); - free(str); + wfree(str); SetIntegerForKey(WMGetSliderValue(panel->hceS), "HotCornerEdge"); diff --git a/WPrefs.app/Makefile.am b/WPrefs.app/Makefile.am index 4408ff96..fa41466e 100644 --- a/WPrefs.app/Makefile.am +++ b/WPrefs.app/Makefile.am @@ -68,6 +68,7 @@ WPrefs_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la WPrefs_LDADD = \ $(top_builddir)/WINGs/libWINGs.la\ $(top_builddir)/WINGs/libWUtil.la\ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ $(top_builddir)/wrlib/libwraster.la \ @XLFLAGS@ @XLIBS@ \ @LIBM@ \ diff --git a/src/appmenu.c b/src/appmenu.c index bc708964..11191641 100644 --- a/src/appmenu.c +++ b/src/appmenu.c @@ -139,7 +139,7 @@ static WMenu *parseMenuCommand(WScreen * scr, Window win, char **slist, int coun } wstrlcpy(title, &slist[*index][pos], sizeof(title)); } - data = malloc(sizeof(WAppMenuData)); + data = wmalloc(sizeof(WAppMenuData)); if (data == NULL) { wwarning(_("appmenu: out of memory creating menu for window %lx"), win); wMenuDestroy(menu, True); @@ -152,7 +152,7 @@ static WMenu *parseMenuCommand(WScreen * scr, Window win, char **slist, int coun if (!entry) { wMenuDestroy(menu, True); wwarning(_("appmenu: out of memory creating menu for window %lx"), win); - free(data); + wfree(data); return NULL; } if (rtext[0] != 0) diff --git a/src/dialog.c b/src/dialog.c index 391dda23..235d1118 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -39,10 +39,6 @@ #include #include -#ifdef HAVE_MALLOC_H -#include -#endif - #include #ifdef __FreeBSD__ #include @@ -1361,7 +1357,7 @@ void wShowInfoPanel(WScreen *scr) char *posn = getPrettyOSName(); if (posn) { snprintf(buffer, sizeof(buffer), _("Running on: %s (%s)\n"), posn, uts.machine); - free(posn); + wfree(posn); } else snprintf(buffer, sizeof(buffer), _("Running on: %s (%s)\n"), uts.sysname, uts.machine); @@ -1393,31 +1389,6 @@ void wShowInfoPanel(WScreen *scr) break; } -#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO2) - { - struct mallinfo2 ma = mallinfo2(); - snprintf(buffer, sizeof(buffer), -#ifdef DEBUG - _("Total memory allocated: %lu kB (in use: %lu kB, %lu free chunks)\n"), -#else - _("Total memory allocated: %lu kB (in use: %lu kB)\n"), -#endif - (ma.arena + ma.hblkhd) / 1024, - (ma.uordblks + ma.hblkhd) / 1024 -#ifdef DEBUG - /* - * This information is representative of the memory - * fragmentation. In ideal case it should be 1, but - * that is never possible - */ - , ma.ordblks -#endif - ); - - strbuf = wstrappend(strbuf, buffer); - } -#endif - strbuf = wstrappend(strbuf, _("Image formats: ")); strl = RSupportedFileFormats(); separator = NULL; diff --git a/src/dock.c b/src/dock.c index d59cf35c..39594aa2 100644 --- a/src/dock.c +++ b/src/dock.c @@ -3194,7 +3194,7 @@ static pid_t execCommand(WAppIcon *btn, const char *command, WSavedState *state) setsid(); #endif - args = malloc(sizeof(char *) * (argc + 1)); + args = wmalloc(sizeof(char *) * (argc + 1)); if (!args) exit(111); @@ -3338,8 +3338,8 @@ void wDockTrackWindowLaunch(WDock *dock, Window window) char *command = NULL; if (!PropGetWMClass(window, &wm_class, &wm_instance)) { - free(wm_class); - free(wm_instance); + wfree(wm_class); + wfree(wm_instance); return; } @@ -3419,10 +3419,8 @@ void wDockTrackWindowLaunch(WDock *dock, Window window) if (command) wfree(command); - if (wm_class) - free(wm_class); - if (wm_instance) - free(wm_instance); + wfree(wm_class); + wfree(wm_instance); } void wClipUpdateForWorkspaceChange(WScreen *scr, int workspace) diff --git a/src/event.c b/src/event.c index 7356a1a2..c9107f84 100644 --- a/src/event.c +++ b/src/event.c @@ -141,7 +141,7 @@ WMagicNumber wAddDeathHandler(pid_t pid, WDeathHandler * callback, void *cdata) { DeathHandler *handler; - handler = malloc(sizeof(DeathHandler)); + handler = wmalloc(sizeof(DeathHandler)); if (!handler) return 0; @@ -150,7 +150,7 @@ WMagicNumber wAddDeathHandler(pid_t pid, WDeathHandler * callback, void *cdata) handler->client_data = cdata; if (!deathHandlers) - deathHandlers = WMCreateArrayWithDestructor(8, free); + deathHandlers = WMCreateArrayWithDestructor(8, wfree); WMAddToArray(deathHandlers, handler); @@ -164,7 +164,7 @@ static void wdelete_death_handler(WMagicNumber id) if (!handler || !deathHandlers) return; - /* array destructor will call free(handler) */ + /* array destructor will call wfree(handler) */ WMRemoveFromArray(deathHandlers, handler); } diff --git a/src/geomview.c b/src/geomview.c index 3564ffac..64ec5835 100644 --- a/src/geomview.c +++ b/src/geomview.c @@ -40,7 +40,7 @@ WGeometryView *WCreateGeometryView(WMScreen * scr) widgetClass = W_RegisterUserWidget(); } - gview = malloc(sizeof(WGeometryView)); + gview = wmalloc(sizeof(WGeometryView)); if (!gview) { return NULL; } diff --git a/src/main.c b/src/main.c index 0f2f9e00..eaba9f94 100644 --- a/src/main.c +++ b/src/main.c @@ -131,7 +131,7 @@ static void setWVisualID(int screen, int val) /* no array at all, alloc space for screen + 1 entries * and init with default value */ wVisualID_len = screen + 1; - wVisualID = (int *)malloc(wVisualID_len * sizeof(int)); + wVisualID = (int *)wmalloc(wVisualID_len * sizeof(int)); for (i = 0; i < wVisualID_len; i++) { wVisualID[i] = -1; } @@ -156,7 +156,7 @@ static void setWVisualID(int screen, int val) */ static int initWVisualID(const char *user_str) { - char *mystr = strdup(user_str); + char *mystr = wstrdup(user_str); int cur_in_pos = 0; int cur_out_pos = 0; int cur_screen = 0; @@ -191,7 +191,7 @@ static int initWVisualID(const char *user_str) cur_in_pos++; } - free(mystr); + wfree(mystr); if (cur_screen == 0||error_found != 0) return 1; @@ -383,7 +383,7 @@ Bool RelaunchWindow(WWindow *wwin) setsid(); #endif /* argv is not null-terminated */ - char **a = (char **) malloc(argc + 1); + char **a = (char **) wmalloc(argc + 1); if (! a) { werror("out of memory trying to relaunch the application"); Exit(-1); diff --git a/src/misc.c b/src/misc.c index 4cab3584..123def2b 100644 --- a/src/misc.c +++ b/src/misc.c @@ -520,7 +520,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) len = strlen(cmdline); olen = len + 1; - out = malloc(olen); + out = wmalloc(olen); if (!out) { wwarning(_("out of memory during expansion of \"%s\""), cmdline); return NULL; @@ -573,7 +573,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) (unsigned int)scr->focused_window->client_win); slen = strlen(tmpbuf); olen += slen; - nout = realloc(out, olen); + nout = wrealloc(out, olen); if (!nout) { wwarning(_("out of memory during expansion of '%s' for command \"%s\""), "%w", cmdline); goto error; @@ -590,7 +590,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) snprintf(tmpbuf, sizeof(tmpbuf), "0x%x", (unsigned int)scr->current_workspace + 1); slen = strlen(tmpbuf); olen += slen; - nout = realloc(out, olen); + nout = wrealloc(out, olen); if (!nout) { wwarning(_("out of memory during expansion of '%s' for command \"%s\""), "%W", cmdline); goto error; @@ -607,7 +607,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) if (user_input) { slen = strlen(user_input); olen += slen; - nout = realloc(out, olen); + nout = wrealloc(out, olen); if (!nout) { wwarning(_("out of memory during expansion of '%s' for command \"%s\""), "%a", cmdline); goto error; @@ -630,7 +630,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) } slen = strlen(scr->xdestring); olen += slen; - nout = realloc(out, olen); + nout = wrealloc(out, olen); if (!nout) { wwarning(_("out of memory during expansion of '%s' for command \"%s\""), "%d", cmdline); goto error; @@ -651,7 +651,7 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) } slen = strlen(selection); olen += slen; - nout = realloc(out, olen); + nout = wrealloc(out, olen); if (!nout) { wwarning(_("out of memory during expansion of '%s' for command \"%s\""), "%s", cmdline); goto error; diff --git a/src/properties.c b/src/properties.c index 6751306c..b42b1646 100644 --- a/src/properties.c +++ b/src/properties.c @@ -54,13 +54,13 @@ int PropGetWMClass(Window window, char **wm_class, char **wm_instance) class_hint = XAllocClassHint(); if (XGetClassHint(dpy, window, class_hint) == 0) { - *wm_class = strdup("default"); - *wm_instance = strdup("default"); + *wm_class = wstrdup("default"); + *wm_instance = wstrdup("default"); XFree(class_hint); return False; } - *wm_instance = strdup(class_hint->res_name); - *wm_class = strdup(class_hint->res_class); + *wm_instance = wstrdup(class_hint->res_name); + *wm_class = wstrdup(class_hint->res_class); XFree(class_hint->res_name); XFree(class_hint->res_class); @@ -133,7 +133,7 @@ int PropGetGNUstepWMAttr(Window window, GNUstepWMAttributes ** attr) if (!data) return False; - *attr = malloc(sizeof(GNUstepWMAttributes)); + *attr = wmalloc(sizeof(GNUstepWMAttributes)); if (!*attr) { XFree(data); return False; @@ -183,7 +183,7 @@ void PropSetIconTileHint(WScreen * scr, RImage * image) imageAtom = XInternAtom(dpy, "_RGBA_IMAGE", False); } - tmp = malloc(image->width * image->height * 4 + 4); + tmp = wmalloc(image->width * image->height * 4 + 4); if (!tmp) { wwarning("could not allocate memory to set _WINDOWMAKER_ICON_TILE hint"); return; diff --git a/src/rootmenu.c b/src/rootmenu.c index 213c30e8..c7931580 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -1243,7 +1243,7 @@ static WMenu *readMenuDirectory(WScreen *scr, const char *title, char **path, co if (dentry->d_name[0] == '.') continue; - buffer = malloc(strlen(path[i]) + strlen(dentry->d_name) + 4); + buffer = wmalloc(strlen(path[i]) + strlen(dentry->d_name) + 4); if (!buffer) { werror(_("out of memory while constructing directory menu %s"), path[i]); break; @@ -1288,7 +1288,7 @@ static WMenu *readMenuDirectory(WScreen *scr, const char *title, char **path, co } } } - free(buffer); + wfree(buffer); } closedir(dir); @@ -1315,7 +1315,7 @@ static WMenu *readMenuDirectory(WScreen *scr, const char *title, char **path, co length += 7; if (command) length += strlen(command) + 6; - buffer = malloc(length); + buffer = wmalloc(length); if (!buffer) { werror(_("out of memory while constructing directory menu %s"), path[data->index]); break; @@ -1353,7 +1353,7 @@ static WMenu *readMenuDirectory(WScreen *scr, const char *title, char **path, co if (command) length += strlen(command); - buffer = malloc(length); + buffer = wmalloc(length); if (!buffer) { werror(_("out of memory while constructing directory menu %s"), path[data->index]); break; diff --git a/src/session.c b/src/session.c index c01eba2f..5826e028 100644 --- a/src/session.c +++ b/src/session.c @@ -289,9 +289,9 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp) } if (instance) - free(instance); + wfree(instance); if (class) - free(class); + wfree(class); if (command) wfree(command); @@ -382,7 +382,7 @@ static pid_t execCommand(WScreen *scr, char *command) SetupEnvironment(scr); - args = malloc(sizeof(char *) * (argc + 1)); + args = wmalloc(sizeof(char *) * (argc + 1)); if (!args) exit(111); for (i = 0; i < argc; i++) { diff --git a/src/superfluous.c b/src/superfluous.c index c0e40be9..65d4d843 100644 --- a/src/superfluous.c +++ b/src/superfluous.c @@ -244,7 +244,7 @@ reinit: wApplicationSetBouncing(data->wapp, 0); WMDeleteTimerHandler(data->timer); wApplicationDestroy(data->wapp); - free(data); + wfree(data); } static int bounceDirection(WAppIcon *aicon) @@ -324,7 +324,7 @@ void wAppBounce(WApplication *wapp) wApplicationIncrementRefcount(wapp); wApplicationSetBouncing(wapp, 1); - AppBouncerData *data = (AppBouncerData *)malloc(sizeof(AppBouncerData)); + AppBouncerData *data = (AppBouncerData *)wmalloc(sizeof(AppBouncerData)); data->wapp = wapp; data->count = data->pow = 0; data->dir = bounceDirection(wApplicationGetAppIcon(wapp)); diff --git a/src/switchpanel.c b/src/switchpanel.c index cb6cda10..ea3aa105 100644 --- a/src/switchpanel.c +++ b/src/switchpanel.c @@ -357,8 +357,7 @@ static void drawTitle(WSwitchPanel *panel, int idecks, const char *title) WMSetLabelText(panel->label, ntitle); } - if (ntitle) - free(ntitle); + wfree(ntitle); } static WMArray *makeWindowListArray(WScreen *scr, int include_unmapped, Bool class_only) diff --git a/src/window.c b/src/window.c index 9e0622df..67bd5434 100644 --- a/src/window.c +++ b/src/window.c @@ -950,10 +950,10 @@ WWindow *wManageWindow(WScreen *scr, Window window) } if (instance) - free(instance); + wfree(instance); if (class) - free(class); + wfree(class); #undef ADEQUATE } @@ -2602,7 +2602,7 @@ void wWindowSetShape(WWindow * wwin) if (!rects) goto alt_code; - urec = malloc(sizeof(XRectangle) * (count + 2)); + urec = wmalloc(sizeof(XRectangle) * (count + 2)); if (!urec) { XFree(rects); goto alt_code; @@ -2779,7 +2779,7 @@ WMagicNumber wWindowAddSavedState(const char *instance, const char *class, { WWindowState *wstate; - wstate = malloc(sizeof(WWindowState)); + wstate = wmalloc(sizeof(WWindowState)); if (!wstate) return NULL; @@ -2841,9 +2841,9 @@ WMagicNumber wWindowGetSavedState(Window win) if (command) wfree(command); if (instance) - free(instance); + wfree(instance); if (class) - free(class); + wfree(class); return wstate; } diff --git a/src/xdnd.c b/src/xdnd.c index 54c0df55..42cf4ee9 100644 --- a/src/xdnd.c +++ b/src/xdnd.c @@ -256,7 +256,7 @@ static void wXDNDGetTypeList(Display *dpy, Window window) return; } - typelist = malloc((count + 1) * sizeof(Atom)); + typelist = wmalloc((count + 1) * sizeof(Atom)); a = (Atom *) data; for (i = 0; i < count; i++) { typelist[i] = a[i]; @@ -267,7 +267,7 @@ static void wXDNDGetTypeList(Display *dpy, Window window) } typelist[count] = 0; XFree(data); - free(typelist); + wfree(typelist); } Bool wXDNDProcessClientMessage(XClientMessageEvent *event) diff --git a/util/Makefile.am b/util/Makefile.am index 0c148702..9dbd997e 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -18,52 +18,70 @@ AM_CPPFLAGS = \ liblist= @LIBRARY_SEARCH_PATH@ @INTLIBS@ -wdwrite_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +wdwrite_LDADD = $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) -wdread_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +wdread_LDADD = $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) -wxcopy_LDADD = @XLFLAGS@ @XLIBS@ +wxcopy_LDADD = @XLFLAGS@ @XLIBS@ \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a wxpaste_LDADD = @XLFLAGS@ @XLIBS@ -getstyle_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +getstyle_LDADD = $(top_builddir)/WINGs/libWUtil.la\ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) getstyle_SOURCES = getstyle.c fontconv.c common.h setstyle_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ @XLFLAGS@ @XLIBS@ $(liblist) setstyle_SOURCES = setstyle.c fontconv.c common.h -convertfonts_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +convertfonts_LDADD = $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) convertfonts_SOURCES = convertfonts.c fontconv.c common.h -seticons_LDADD= $(top_builddir)/WINGs/libWUtil.la $(liblist) +seticons_LDADD= $(top_builddir)/WINGs/libWUtil.la\ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) -geticonset_LDADD= $(top_builddir)/WINGs/libWUtil.la $(liblist) +geticonset_LDADD= $(top_builddir)/WINGs/libWUtil.la\ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ + $(liblist) wmagnify_LDADD = \ $(top_builddir)/WINGs/libWINGs.la \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ $(top_builddir)/wrlib/libwraster.la \ @XLFLAGS@ @XLIBS@ @INTLIBS@ wmsetbg_LDADD = \ $(top_builddir)/WINGs/libWINGs.la \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ $(top_builddir)/wrlib/libwraster.la \ @XLFLAGS@ @LIBXINERAMA@ @XLIBS@ @INTLIBS@ wmgenmenu_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ @INTLIBS@ wmgenmenu_SOURCES = wmgenmenu.c wmgenmenu.h wmmenugen_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ @INTLIBS@ wmmenugen_SOURCES = wmmenugen.c wmmenugen.h wmmenugen_misc.c \ @@ -75,6 +93,7 @@ wmiv_CFLAGS = @PANGO_CFLAGS@ @PTHREAD_CFLAGS@ wmiv_LDADD = \ $(top_builddir)/wrlib/libwraster.la \ $(top_builddir)/WINGs/libWINGs.la \ + $(top_builddir)/wmaker-rs/target/debug/libwmaker_rs.a\ @XLFLAGS@ @XLIBS@ @GFXLIBS@ \ @PANGO_LIBS@ @PTHREAD_LIBS@ @LIBEXIF@ diff --git a/util/getstyle.c b/util/getstyle.c index a2935892..283758b2 100644 --- a/util/getstyle.c +++ b/util/getstyle.c @@ -242,7 +242,7 @@ static void makeThemePack(WMPropList * style, const char *themeName) WMDeleteFromPLArray(value, 1); WMInsertInPLArray(value, 1, WMCreatePLString(newPath)); - free(newPath); + wfree(newPath); } else { findCopyFile(themeDir, WMGetFromPLString(file)); } @@ -262,7 +262,7 @@ static void makeThemePack(WMPropList * style, const char *themeName) WMDeleteFromPLArray(value, 1); WMInsertInPLArray(value, 1, WMCreatePLString(newPath)); - free(newPath); + wfree(newPath); } else { findCopyFile(themeDir, WMGetFromPLString(file)); } @@ -277,7 +277,7 @@ static void makeThemePack(WMPropList * style, const char *themeName) WMDeleteFromPLArray(value, 2); WMInsertInPLArray(value, 2, WMCreatePLString(newPath)); - free(newPath); + wfree(newPath); } else { findCopyFile(themeDir, WMGetFromPLString(file)); } diff --git a/util/wmiv.c b/util/wmiv.c index 0d33a535..925d3afa 100755 --- a/util/wmiv.c +++ b/util/wmiv.c @@ -202,7 +202,7 @@ int change_title(XTextProperty *prop, char *filename) XSetWMName(dpy, win, prop); if (prop->value) XFree(prop->value); - free(combined_title); + wfree(combined_title); return EXIT_SUCCESS; } @@ -596,8 +596,8 @@ int linked_list_add(linked_list_t *list, const void *data) { link_t *link; - /* calloc sets the "next" field to zero. */ - link = calloc(1, sizeof(link_t)); + /* wmalloc zeros the buffer it returns, so the "next" is zero. */ + link = wmalloc(sizeof(link_t)); if (!link) { fprintf(stderr, "Error: memory allocation failed\n"); return EXIT_FAILURE; @@ -627,8 +627,8 @@ void linked_list_free(linked_list_t *list) /* Store the next value so that we don't access freed memory. */ next = link->next; if (link->data) - free((char *)link->data); - free(link); + wfree((char *)link->data); + wfree(link); } } @@ -651,7 +651,7 @@ link_t *connect_dir(char *dirpath, linked_list_t *li) /* maybe it's a file */ struct stat stDirInfo; if (lstat(dirpath, &stDirInfo) == 0) { - linked_list_add(li, strdup(dirpath)); + linked_list_add(li, wstrdup(dirpath)); return li->first; } else { return NULL; @@ -664,11 +664,11 @@ link_t *connect_dir(char *dirpath, linked_list_t *li) else snprintf(path, PATH_MAX, "%s%c%s", dirpath, FILE_SEPARATOR, dir[idx]->d_name); - free(dir[idx]); + wfree(dir[idx]); if ((lstat(path, &stDirInfo) == 0) && !S_ISDIR(stDirInfo.st_mode)) - linked_list_add(li, strdup(path)); + linked_list_add(li, wstrdup(path)); } - free(dir); + wfree(dir); return li->first; } diff --git a/util/wmmenugen_misc.c b/util/wmmenugen_misc.c index 161a32e0..56f2c254 100644 --- a/util/wmmenugen_misc.c +++ b/util/wmmenugen_misc.c @@ -121,7 +121,7 @@ void parse_locale(const char *what, char **language, char **country, char **enco *language = wstrdup(e); out: - free(e); + wfree(e); return; } diff --git a/util/wmsetbg.c b/util/wmsetbg.c index dc747d04..ac9a51e8 100644 --- a/util/wmsetbg.c +++ b/util/wmsetbg.c @@ -398,7 +398,7 @@ static BackgroundTexture *parseTexture(RContext * rc, char *text) RGradientStyle gtype; int iwidth, iheight; - colors = malloc(sizeof(RColor *) * (count - 1)); + colors = wmalloc(sizeof(RColor *) * (count - 1)); if (!colors) { wwarning("out of memory while parsing texture"); goto error; @@ -425,7 +425,7 @@ static BackgroundTexture *parseTexture(RContext * rc, char *text) wfree(colors); goto error; } - if (!(colors[i - 2] = malloc(sizeof(RColor)))) { + if (!(colors[i - 2] = wmalloc(sizeof(RColor)))) { wwarning("out of memory while parsing texture"); for (j = 0; colors[j] != NULL; j++) diff --git a/util/wxcopy.c b/util/wxcopy.c index 82b4c7f2..6fd76592 100644 --- a/util/wxcopy.c +++ b/util/wxcopy.c @@ -26,6 +26,8 @@ #include #include +#include + #include "../src/wconfig.h" #define LINESIZE (4*1024) @@ -197,7 +199,7 @@ int main(int argc, char **argv) break; } if (buf_len == 0) { - nbuf = malloc(buf_len = l + nl + 1); + nbuf = wmalloc(buf_len = l + nl + 1); } else if (buf_len < l + nl + 1) { /* * To avoid terrible performance on big input buffers, @@ -205,12 +207,7 @@ int main(int argc, char **argv) * current line. */ buf_len = 2 * buf_len + nl + 1; - /* some realloc implementations don't do malloc if buf==NULL */ - if (buf == NULL) { - nbuf = malloc(buf_len); - } else { - nbuf = realloc(buf, buf_len); - } + nbuf = wrealloc(buf, buf_len); } else { nbuf = buf; } diff --git a/wmaker-rs/src/lib.rs b/wmaker-rs/src/lib.rs index f9dd99f1..a759879e 100644 --- a/wmaker-rs/src/lib.rs +++ b/wmaker-rs/src/lib.rs @@ -1,10 +1,11 @@ -pub mod application; pub mod app_icon; pub mod app_menu; +pub mod application; pub mod defaults; pub mod dock; pub mod global; pub mod icon; +pub mod memory; pub mod menu; pub mod properties; pub mod screen; diff --git a/wmaker-rs/src/memory.rs b/wmaker-rs/src/memory.rs new file mode 100644 index 00000000..ad5b1236 --- /dev/null +++ b/wmaker-rs/src/memory.rs @@ -0,0 +1,180 @@ +//! Provides an FFI-compatible allocator for C. +//! +//! This replaces the bulk of the code form WINGs/memory.c, but +//! it should go away once we're in a place that we don't need +//! to rely on `malloc` anymore in C code. + +use std::alloc::{Layout, alloc_zeroed, dealloc, realloc}; +use std::collections::BTreeMap; +use std::ffi::c_void; +use std::sync::Mutex; + +#[derive(Clone, Copy, Debug)] +struct Allocation { + layout: Layout, + rc: u32, +} + +type WMallocMap = BTreeMap; + +static ALLOCS: Mutex = Mutex::new(WMallocMap::new()); +const ALIGN: usize = 64; + +/// A wrapper around the Rust allocator API's `alloc_zeroed` +/// function for FFI. +/// +/// Note: This will always return nil on a zero-sized +/// allocation. Don't try to use this to allocate Rust ZSTs; +/// it is only suitable for FFI. +/// +/// # Safety +/// This will return a 64-byte aligned pointer of the specified +/// length, or nil if the allocation cannot be satisfied. It is +/// the caller's responsibility to ensure that the result is not +/// null, to avoid violating memory safety, and to make sure +/// that any alignment for any value the pointer is used to +/// refer to is suitably aligned. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn wmalloc(size: usize) -> *mut c_void { + if size == 0 { + return std::ptr::null_mut(); + } + let layout = Layout::from_size_align(size, ALIGN).expect("layout makes sense"); + let ptr = unsafe { alloc_zeroed(layout) }; + if ptr.is_null() { + return std::ptr::null_mut(); + } + let rc = 1; + let alloc = Allocation { layout, rc }; + let mut allocs = ALLOCS.lock().expect("lock not poisoned"); + allocs.insert(ptr.addr(), alloc); + ptr.cast() +} + +/// A wrapper around the Rust allocator API's `dealloc` function +/// for FFI. +/// +/// If the pointer argument is nil, this is a nop. Otherwise, +/// it must have been allocated by `wmalloc` or `wrealloc`. +/// +/// # Safety +/// The caller must ensure that the pointer that is passed to +/// this function was allocated by `wmalloc`. Note that this +/// will not free unless this was the allocation's last +/// reference. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn wfree(ptr: *mut c_void) { + if ptr.is_null() { + return; + } + let alloc = { + let mut allocs = ALLOCS.lock().expect("wfree: allocs is unpoisoned"); + let addr = ptr.addr(); + let alloc = allocs.get_mut(&addr).expect("wfree: allocs records ptr"); + alloc.rc -= 1; + let alloc = alloc.clone(); + if alloc.rc == 0 { + allocs.remove(&addr).expect("wfree: allocs unaltered"); + } + alloc + }; + // We can call `dealloc` without holding the ALLOCS lock. + if alloc.rc == 0 { + unsafe { + dealloc(ptr.cast(), alloc.layout); + } + } +} + +/// A wrapper around the Rust allocator API's `realloc` function +/// for FFI calls. +/// +/// Note that this attempts will always free and return NULL on +/// a reallocation of size 0, so do not try to use this to +/// allocate Rust ZSTs: it is purely for FFI. If the source +/// pointer is nil and size is positive, then the behavior is +/// that of `wmalloc`. +/// +/// The pointer argument just have been allocated previously +/// with `wmalloc` or `wrealloc`. +/// +/// If successful, returns a non-nil pointer, and the old +/// pointer should be considered invalid, and must not be +/// dereferenced. If the old size was smaller than the new +/// size, elements, elements after the old size are zeroed. +/// Elements between the start of the array and the minimum of +/// the old and new sizes are unchanged. +/// +/// On failure, returns nil, and does not free the source +/// pointer or otherwise alter its contents. +/// +/// # Safety +/// This will return a 64-byte aligned pointer of the specified +/// length, or nil if the allocation cannot be satisfied. It is +/// the caller's responsibility to ensure that the result is not +/// null, to avoid violating memory safety, and to make sure +/// that any alignment for any value the pointer is used to +/// refer to is suitably aligned. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn wrealloc(ptr: *mut c_void, size: usize) -> *mut c_void { + if size == 0 { + unsafe { + wfree(ptr); + } + return std::ptr::null_mut(); + } + if ptr.is_null() { + return unsafe { wmalloc(size) }; + } + let new_layout = Layout::from_size_align(size, ALIGN).expect("layout ok"); + let addr = ptr.addr(); + let old_layout = { + let allocs = ALLOCS.lock().expect("wrealloc: allocs is unpoisoned"); + let alloc = allocs.get(&addr).expect("wrealloc: allocs records ptr"); + alloc.layout + }; + let old_size = old_layout.size(); + let ptr = unsafe { realloc(ptr.cast(), old_layout, size) }; + if ptr.is_null() { + return std::ptr::null_mut(); + } + { + let mut allocs = ALLOCS.lock().expect("wrealloc: allocs still unpoisoned"); + let alloc = allocs.get_mut(&addr).expect("wmrealloc: allocs knows ptr"); + alloc.layout = new_layout; + } + if old_size < size { + let zlen = size - old_size; + let zptr = ptr.wrapping_add(old_size); + unsafe { + std::ptr::write_bytes(zptr, 0, zlen); + } + } + ptr.cast() +} + +/// Increments the reference count on `ptr`. +/// +/// # Safety +/// The caller must insure that `ptr` refers to a valid, active +/// allocation that was made with `wmalloc` or `wrealloc`. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn wretain(ptr: *mut c_void) -> *mut c_void { + let addr = ptr.addr(); + let mut allocs = ALLOCS.lock().expect("wretain: allocs is unpoisoned"); + let alloc = allocs.get_mut(&addr).expect("wretain: allocs records ptr"); + alloc.rc += 1; + ptr +} + +/// Decrements the reference count on `ptr`, and frees if it +/// reaches 0, but wrapping `wfree`. +/// +/// # Safety +/// `ptr` must be valid as an argument to `wfree`. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn wrelease(ptr: *mut c_void) { + unsafe { + wfree(ptr); + } +} diff --git a/wmlib/Makefile.am b/wmlib/Makefile.am index 8b87fdf9..33cd075c 100644 --- a/wmlib/Makefile.am +++ b/wmlib/Makefile.am @@ -6,7 +6,8 @@ lib_LTLIBRARIES = libWMaker.la include_HEADERS = WMaker.h -AM_CPPFLAGS = $(DFLAGS) @XCFLAGS@ +AM_CPPFLAGS = $(DFLAGS) @XCFLAGS@ \ + -I$(top_srcdir)/WINGs -I$(top_builddir)/WINGs libWMaker_la_LIBADD = @XLFLAGS@ @XLIBS@ diff --git a/wmlib/app.c b/wmlib/app.c index 9cd27c8c..9a3fdf3d 100644 --- a/wmlib/app.c +++ b/wmlib/app.c @@ -24,6 +24,8 @@ #include #include +#include + #include "WMaker.h" #include "app.h" @@ -31,7 +33,7 @@ WMAppContext *WMAppCreateWithMain(Display * display, int screen_number, Window m { wmAppContext *ctx; - ctx = malloc(sizeof(wmAppContext)); + ctx = wmalloc(sizeof(wmAppContext)); if (!ctx) return NULL; @@ -39,9 +41,9 @@ WMAppContext *WMAppCreateWithMain(Display * display, int screen_number, Window m ctx->screen_number = screen_number; ctx->our_leader_hint = False; ctx->main_window = main_window; - ctx->windows = malloc(sizeof(Window)); + ctx->windows = wmalloc(sizeof(Window)); if (!ctx->windows) { - free(ctx); + wfree(ctx); return NULL; } ctx->win_count = 1; @@ -58,13 +60,13 @@ int WMAppAddWindow(WMAppContext * app, Window window) { Window *win; - win = malloc(sizeof(Window) * (app->win_count + 1)); + win = wmalloc(sizeof(Window) * (app->win_count + 1)); if (!win) return False; memcpy(win, app->windows, sizeof(Window) * app->win_count); - free(app->windows); + wfree(app->windows); win[app->win_count] = window; app->windows = win; diff --git a/wmlib/menu.c b/wmlib/menu.c index 6646cd70..a3a1498d 100644 --- a/wmlib/menu.c +++ b/wmlib/menu.c @@ -26,6 +26,8 @@ #include #include +#include + #include "WMaker.h" #include "app.h" #include "menu.h" @@ -37,7 +39,7 @@ WMMenu *WMMenuCreate(WMAppContext * app, char *title) if (strlen(title) > 255) return NULL; - menu = malloc(sizeof(wmMenu)); + menu = wmalloc(sizeof(wmMenu)); if (!menu) return NULL; @@ -50,12 +52,12 @@ WMMenu *WMMenuCreate(WMAppContext * app, char *title) menu->realized = False; menu->code = app->last_menu_tag++; - menu->entryline = malloc(strlen(title) + 32); - menu->entryline2 = malloc(32); + menu->entryline = wmalloc(strlen(title) + 32); + menu->entryline2 = wmalloc(32); if (!menu->entryline || !menu->entryline2) { if (menu->entryline) - free(menu->entryline); - free(menu); + wfree(menu->entryline); + wfree(menu); return NULL; } sprintf(menu->entryline, "%i %i %s", wmBeginMenu, menu->code, title); @@ -77,13 +79,13 @@ WMMenuAddItem(WMMenu * menu, char *text, WMMenuAction action, if (strlen(text) > 255) return -1; - entry = malloc(sizeof(wmMenuEntry)); + entry = wmalloc(sizeof(wmMenuEntry)); if (!entry) return -1; - entry->entryline = malloc(strlen(text) + 100); + entry->entryline = wmalloc(strlen(text) + 100); if (!entry->entryline) { - free(entry); + wfree(entry); return -1; } @@ -125,13 +127,13 @@ int WMMenuAddSubmenu(WMMenu * menu, char *text, WMMenu * submenu) if (strlen(text) > 255) return -1; - entry = malloc(sizeof(wmMenuEntry)); + entry = wmalloc(sizeof(wmMenuEntry)); if (!entry) return -1; - entry->entryline = malloc(strlen(text) + 100); + entry->entryline = wmalloc(strlen(text) + 100); if (!entry->entryline) { - free(entry); + wfree(entry); return -1; } @@ -217,7 +219,7 @@ int WMRealizeMenus(WMAppContext * app) return True; count++; - slist = malloc(count * sizeof(char *)); + slist = wmalloc(count * sizeof(char *)); if (!slist) { return False; } @@ -227,10 +229,10 @@ int WMRealizeMenus(WMAppContext * app) addItems(slist, &i, app->main_menu); if (!XStringListToTextProperty(slist, i, &text_prop)) { - free(slist); + wfree(slist); return False; } - free(slist); + wfree(slist); XSetTextProperty(app->dpy, app->main_window, &text_prop, getatom(app->dpy)); XFree(text_prop.value); diff --git a/wrlib/Makefile.am b/wrlib/Makefile.am index a82bb9a0..5f88852a 100644 --- a/wrlib/Makefile.am +++ b/wrlib/Makefile.am @@ -82,7 +82,8 @@ libwraster_la_SOURCES += load_magick.c endif AM_CFLAGS = @MAGICKFLAGS@ -AM_CPPFLAGS = $(DFLAGS) @HEADER_SEARCH_PATH@ +AM_CPPFLAGS = $(DFLAGS) @HEADER_SEARCH_PATH@ \ + -I$(top_srcdir)/WINGs -I$(top_builddir)/WINGs libwraster_la_LIBADD = @LIBRARY_SEARCH_PATH@ @GFXLIBS@ @MAGICKLIBS@ @XLIBS@ @LIBXMU@ -lm diff --git a/wrlib/context.c b/wrlib/context.c index 73044506..0a993605 100644 --- a/wrlib/context.c +++ b/wrlib/context.c @@ -37,6 +37,8 @@ #include +#include + #include "wraster.h" #include "scale.h" #include "wr_i18n.h" @@ -104,17 +106,17 @@ static Bool allocateStandardPseudoColor(RContext * ctx, XStandardColormap * stdc return False; } - ctx->colors = malloc(sizeof(XColor) * ctx->ncolors); + ctx->colors = wmalloc(sizeof(XColor) * ctx->ncolors); if (!ctx->colors) { RErrorCode = RERR_NOMEMORY; return False; } - ctx->pixels = malloc(sizeof(unsigned long) * ctx->ncolors); + ctx->pixels = wmalloc(sizeof(unsigned long) * ctx->ncolors); if (!ctx->pixels) { - free(ctx->colors); + wfree(ctx->colors); ctx->colors = NULL; RErrorCode = RERR_NOMEMORY; @@ -246,15 +248,15 @@ static Bool allocatePseudoColor(RContext *ctx) assert(cpc >= 2 && ncolors <= (1 << ctx->depth)); - colors = malloc(sizeof(XColor) * ncolors); + colors = wmalloc(sizeof(XColor) * ncolors); if (!colors) { RErrorCode = RERR_NOMEMORY; return False; } - ctx->pixels = malloc(sizeof(unsigned long) * ncolors); + ctx->pixels = wmalloc(sizeof(unsigned long) * ncolors); if (!ctx->pixels) { - free(colors); + wfree(colors); RErrorCode = RERR_NOMEMORY; return False; } @@ -343,7 +345,7 @@ static XColor *allocateGrayScale(RContext * ctx) ctx->attribs->render_mode = RBestMatchRendering; } - colors = malloc(sizeof(XColor) * ncolors); + colors = wmalloc(sizeof(XColor) * ncolors); if (!colors) { RErrorCode = RERR_NOMEMORY; return False; @@ -526,7 +528,7 @@ RContext *RCreateContext(Display * dpy, int screen_number, const RContextAttribu RContext *context; XGCValues gcv; - context = malloc(sizeof(RContext)); + context = wmalloc(sizeof(RContext)); if (!context) { RErrorCode = RERR_NOMEMORY; return NULL; @@ -537,9 +539,9 @@ RContext *RCreateContext(Display * dpy, int screen_number, const RContextAttribu context->screen_number = screen_number; - context->attribs = malloc(sizeof(RContextAttributes)); + context->attribs = wmalloc(sizeof(RContextAttributes)); if (!context->attribs) { - free(context); + wfree(context); RErrorCode = RERR_NOMEMORY; return NULL; } @@ -568,7 +570,7 @@ RContext *RCreateContext(Display * dpy, int screen_number, const RContextAttribu templ.visualid = context->attribs->visualid; vinfo = XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask, &templ, &nret); if (!vinfo || nret == 0) { - free(context); + wfree(context); RErrorCode = RERR_BADVISUALID; return NULL; } @@ -615,13 +617,13 @@ RContext *RCreateContext(Display * dpy, int screen_number, const RContextAttribu if (context->vclass == PseudoColor || context->vclass == StaticColor) { if (!setupPseudoColorColormap(context)) { - free(context); + wfree(context); return NULL; } } else if (context->vclass == GrayScale || context->vclass == StaticGray) { context->colors = allocateGrayScale(context); if (!context->colors) { - free(context); + wfree(context); return NULL; } } else if (context->vclass == TrueColor) { @@ -668,9 +670,9 @@ void RDestroyContext(RContext *context) if ((context->attribs->flags & RC_VisualID) && !(context->attribs->flags & RC_DefaultVisual)) XDestroyWindow(context->dpy, context->drawable); - free(context->attribs); + wfree(context->attribs); } - free(context); + wfree(context); } } diff --git a/wrlib/convert.c b/wrlib/convert.c index 400234f0..0650fc71 100644 --- a/wrlib/convert.c +++ b/wrlib/convert.c @@ -33,13 +33,15 @@ #include #include +#include + #include "wraster.h" #include "convert.h" #include "xutil.h" #include "wr_i18n.h" -#define NFREE(n) if (n) free(n) +#define NFREE(n) wfree(n) #define HAS_ALPHA(I) ((I)->format == RRGBAFormat) @@ -70,7 +72,7 @@ static void release_conversion_table(void) RConversionTable *tmp_to_delete = tmp; tmp = tmp->next; - free(tmp_to_delete); + wfree(tmp_to_delete); } conversionTable = NULL; } @@ -83,7 +85,7 @@ static void release_std_conversion_table(void) RStdConversionTable *tmp_to_delete = tmp; tmp = tmp->next; - free(tmp_to_delete); + wfree(tmp_to_delete); } stdConversionTable = NULL; } @@ -108,7 +110,7 @@ static unsigned short *computeTable(unsigned short mask) if (tmp) return tmp->table; - tmp = (RConversionTable *) malloc(sizeof(RConversionTable)); + tmp = (RConversionTable *) wmalloc(sizeof(RConversionTable)); if (tmp == NULL) return NULL; @@ -135,7 +137,7 @@ static unsigned int *computeStdTable(unsigned int mult, unsigned int max) if (tmp) return tmp->table; - tmp = (RStdConversionTable *) malloc(sizeof(RStdConversionTable)); + tmp = (RStdConversionTable *) wmalloc(sizeof(RStdConversionTable)); if (tmp == NULL) return NULL; @@ -372,8 +374,8 @@ static RXImage *image2TrueColor(RContext * ctx, RImage * image) signed char *nerr; int ch = (HAS_ALPHA(image) ? 4 : 3); - err = malloc(ch * (image->width + 2)); - nerr = malloc(ch * (image->width + 2)); + err = wmalloc(ch * (image->width + 2)); + nerr = wmalloc(ch * (image->width + 2)); if (!err || !nerr) { NFREE(err); NFREE(nerr); @@ -387,8 +389,8 @@ static RXImage *image2TrueColor(RContext * ctx, RImage * image) convertTrueColor_generic(ximg, image, err, nerr, rtable, gtable, btable, dr, dg, db, roffs, goffs, boffs); - free(err); - free(nerr); + wfree(err); + wfree(nerr); } } @@ -540,8 +542,8 @@ static RXImage *image2PseudoColor(RContext * ctx, RImage * image) #ifdef WRLIB_DEBUG fprintf(stderr, "pseudo color dithering with %d colors per channel\n", cpc); #endif - err = malloc(4 * (image->width + 3)); - nerr = malloc(4 * (image->width + 3)); + err = wmalloc(4 * (image->width + 3)); + nerr = wmalloc(4 * (image->width + 3)); if (!err || !nerr) { NFREE(err); NFREE(nerr); @@ -555,8 +557,8 @@ static RXImage *image2PseudoColor(RContext * ctx, RImage * image) convertPseudoColor_to_8(ximg, image, err + 4, nerr + 4, rtable, gtable, btable, dr, dg, db, ctx->pixels, cpc); - free(err); - free(nerr); + wfree(err); + wfree(nerr); } return ximg; @@ -618,8 +620,8 @@ static RXImage *image2StandardPseudoColor(RContext * ctx, RImage * image) fprintf(stderr, "pseudo color dithering with %d colors per channel\n", ctx->attribs->colors_per_channel); #endif - err = (short *)malloc(3 * (image->width + 2) * sizeof(short)); - nerr = (short *)malloc(3 * (image->width + 2) * sizeof(short)); + err = (short *)wmalloc(3 * (image->width + 2) * sizeof(short)); + nerr = (short *)wmalloc(3 * (image->width + 2) * sizeof(short)); if (!err || !nerr) { NFREE(err); NFREE(nerr); @@ -707,8 +709,8 @@ static RXImage *image2StandardPseudoColor(RContext * ctx, RImage * image) ofs += ximg->image->bytes_per_line - image->width; } - free(err); - free(nerr); + wfree(err); + wfree(nerr); } ximg->image->data = (char *)data; @@ -773,8 +775,8 @@ static RXImage *image2GrayScale(RContext * ctx, RImage * image) #ifdef WRLIB_DEBUG fprintf(stderr, "grayscale dither with %d colors per channel\n", cpc); #endif - gerr = (short *)malloc((image->width + 2) * sizeof(short)); - ngerr = (short *)malloc((image->width + 2) * sizeof(short)); + gerr = (short *)wmalloc((image->width + 2) * sizeof(short)); + ngerr = (short *)wmalloc((image->width + 2) * sizeof(short)); if (!gerr || !ngerr) { NFREE(gerr); NFREE(ngerr); @@ -830,8 +832,8 @@ static RXImage *image2GrayScale(RContext * ctx, RImage * image) gerr = ngerr; ngerr = terr; } - free(gerr); - free(ngerr); + wfree(gerr); + wfree(ngerr); } ximg->image->data = (char *)data; diff --git a/wrlib/convolve.c b/wrlib/convolve.c index 8873a620..7d12fef4 100644 --- a/wrlib/convolve.c +++ b/wrlib/convolve.c @@ -26,6 +26,8 @@ #include #include +#include + #include "wraster.h" #include "wr_i18n.h" @@ -46,7 +48,7 @@ int RBlurImage(RImage * image) unsigned char *pptr = NULL, *tmpp; int ch = image->format == RRGBAFormat ? 4 : 3; - pptr = malloc(image->width * ch); + pptr = wmalloc(image->width * ch); if (!pptr) { RErrorCode = RERR_NOMEMORY; return False; @@ -138,7 +140,7 @@ int RBlurImage(RImage * image) } } - free(tmpp); + wfree(tmpp); return True; } diff --git a/wrlib/load.c b/wrlib/load.c index 1f94f0e4..f9907b66 100644 --- a/wrlib/load.c +++ b/wrlib/load.c @@ -34,6 +34,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -125,7 +127,7 @@ static void init_cache(void) RImageCacheMaxImage = IMAGE_CACHE_MAXIMUM_MAXPIXELS; if (RImageCacheSize > 0) { - RImageCache = malloc(sizeof(RCachedImage) * RImageCacheSize); + RImageCache = wmalloc(sizeof(RCachedImage) * RImageCacheSize); if (RImageCache == NULL) { fprintf(stderr, _("wrlib: out of memory for image cache\n")); return; @@ -142,10 +144,10 @@ void RReleaseCache(void) for (i = 0; i < RImageCacheSize; i++) { if (RImageCache[i].file) { RReleaseImage(RImageCache[i].image); - free(RImageCache[i].file); + wfree(RImageCache[i].file); } } - free(RImageCache); + wfree(RImageCache); RImageCache = NULL; RImageCacheSize = -1; } @@ -173,7 +175,7 @@ RImage *RLoadImage(RContext *context, const char *file, int index) return RCloneImage(RImageCache[i].image); } else { - free(RImageCache[i].file); + wfree(RImageCache[i].file); RImageCache[i].file = NULL; RReleaseImage(RImageCache[i].image); } @@ -254,8 +256,7 @@ RImage *RLoadImage(RContext *context, const char *file, int index) for (i = 0; i < RImageCacheSize; i++) { if (!RImageCache[i].file) { - RImageCache[i].file = malloc(strlen(file) + 1); - strcpy(RImageCache[i].file, file); + RImageCache[i].file = wstrdup(file); RImageCache[i].image = RCloneImage(image); RImageCache[i].last_modif = st.st_mtime; RImageCache[i].last_use = time(NULL); @@ -271,10 +272,9 @@ RImage *RLoadImage(RContext *context, const char *file, int index) /* if no slot available, dump least recently used one */ if (!done) { - free(RImageCache[oldest_idx].file); + wfree(RImageCache[oldest_idx].file); RReleaseImage(RImageCache[oldest_idx].image); - RImageCache[oldest_idx].file = malloc(strlen(file) + 1); - strcpy(RImageCache[oldest_idx].file, file); + RImageCache[oldest_idx].file = wstrdup(file); RImageCache[oldest_idx].image = RCloneImage(image); RImageCache[oldest_idx].last_modif = st.st_mtime; RImageCache[oldest_idx].last_use = time(NULL); diff --git a/wrlib/load_gif.c b/wrlib/load_gif.c index 5921735f..870eaf7c 100644 --- a/wrlib/load_gif.c +++ b/wrlib/load_gif.c @@ -28,6 +28,8 @@ #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -127,7 +129,7 @@ RImage *RLoadGIF(const char *file, int index) } } - buffer = malloc(width * sizeof(GifPixelType)); + buffer = wmalloc(width * sizeof(GifPixelType)); if (!buffer) { RErrorCode = RERR_NOMEMORY; goto bye; @@ -219,7 +221,7 @@ RImage *RLoadGIF(const char *file, int index) did_not_get_any_errors: if (buffer) - free(buffer); + wfree(buffer); if (gif) #if (USE_GIF == 5) && (GIFLIB_MINOR >= 1) diff --git a/wrlib/load_jpeg.c b/wrlib/load_jpeg.c index 9c2ef6be..e65fb2d2 100644 --- a/wrlib/load_jpeg.c +++ b/wrlib/load_jpeg.c @@ -35,6 +35,8 @@ #include #endif +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -119,7 +121,7 @@ static RImage *do_read_jpeg_file(struct jpeg_decompress_struct *cinfo, const cha goto abort_and_release_resources; } - buffer[0] = (JSAMPROW) malloc(cinfo->image_width * cinfo->num_components); + buffer[0] = (JSAMPROW) wmalloc(cinfo->image_width * cinfo->num_components); if (!buffer[0]) { RErrorCode = RERR_NOMEMORY; goto abort_and_release_resources; @@ -167,7 +169,7 @@ static RImage *do_read_jpeg_file(struct jpeg_decompress_struct *cinfo, const cha jpeg_destroy_decompress(cinfo); fclose(file); if (buffer[0]) - free(buffer[0]); + wfree(buffer[0]); return image; } diff --git a/wrlib/load_png.c b/wrlib/load_png.c index 50135b51..5eba4ed0 100644 --- a/wrlib/load_png.c +++ b/wrlib/load_png.c @@ -28,6 +28,8 @@ #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -165,7 +167,7 @@ RImage *RLoadPNG(RContext *context, const char *file) image->background.blue = bkcolor->blue >> 8; } - png_rows = calloc(height, sizeof(png_bytep)); + png_rows = wmalloc(height * sizeof(png_bytep)); if (!png_rows) { RErrorCode = RERR_NOMEMORY; fclose(f); @@ -174,7 +176,7 @@ RImage *RLoadPNG(RContext *context, const char *file) return NULL; } for (y = 0; y < height; y++) { - png_rows[y] = malloc(png_get_rowbytes(png, pinfo)); + png_rows[y] = wmalloc(png_get_rowbytes(png, pinfo)); if (!png_rows[y]) { RErrorCode = RERR_NOMEMORY; fclose(f); @@ -182,8 +184,8 @@ RImage *RLoadPNG(RContext *context, const char *file) png_destroy_read_struct(&png, &pinfo, &einfo); while (y-- > 0) if (png_rows[y]) - free(png_rows[y]); - free(png_rows); + wfree(png_rows[y]); + wfree(png_rows); return NULL; } } @@ -214,7 +216,7 @@ RImage *RLoadPNG(RContext *context, const char *file) } for (y = 0; y < height; y++) if (png_rows[y]) - free(png_rows[y]); - free(png_rows); + wfree(png_rows[y]); + wfree(png_rows); return image; } diff --git a/wrlib/load_ppm.c b/wrlib/load_ppm.c index 2f01c8ad..8e817589 100644 --- a/wrlib/load_ppm.c +++ b/wrlib/load_ppm.c @@ -29,6 +29,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -161,7 +163,7 @@ static RImage *load_graymap(FILE *file, int w, int h, int max, int raw, const ch if (raw == '5') { char *buf; - buf = malloc(w + 1); + buf = wmalloc(w + 1); if (!buf) { RErrorCode = RERR_NOMEMORY; RReleaseImage(image); @@ -169,7 +171,7 @@ static RImage *load_graymap(FILE *file, int w, int h, int max, int raw, const ch } for (y = 0; y < h; y++) { if (!fread(buf, w, 1, file)) { - free(buf); + wfree(buf); RErrorCode = RERR_BADIMAGEFILE; RReleaseImage(image); return NULL; @@ -181,7 +183,7 @@ static RImage *load_graymap(FILE *file, int w, int h, int max, int raw, const ch *(ptr++) = buf[x]; } } - free(buf); + wfree(buf); } } } diff --git a/wrlib/load_webp.c b/wrlib/load_webp.c index e1a4ee31..c703fb06 100644 --- a/wrlib/load_webp.c +++ b/wrlib/load_webp.c @@ -29,6 +29,8 @@ #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -110,7 +112,7 @@ RImage *RLoadWEBP(const char *file_name) return NULL; } - raw_data = (uint8_t *) malloc(raw_data_size); + raw_data = (uint8_t *) wmalloc(raw_data_size); if (!raw_data) { RErrorCode = RERR_NOMEMORY; @@ -124,7 +126,7 @@ RImage *RLoadWEBP(const char *file_name) if (r != raw_data_size) { RErrorCode = RERR_READ; - free(raw_data); + wfree(raw_data); return NULL; } @@ -133,7 +135,7 @@ RImage *RLoadWEBP(const char *file_name) fprintf(stderr, _("wrlib: could not get features from WebP file \"%s\", %s\n"), file_name, webp_message_from_status(status)); RErrorCode = RERR_BADIMAGEFILE; - free(raw_data); + wfree(raw_data); return NULL; } @@ -141,7 +143,7 @@ RImage *RLoadWEBP(const char *file_name) image = RCreateImage(features.width, features.height, True); if (!image) { RErrorCode = RERR_NOMEMORY; - free(raw_data); + wfree(raw_data); return NULL; } ret = WebPDecodeRGBAInto(raw_data, raw_data_size, image->data, @@ -151,7 +153,7 @@ RImage *RLoadWEBP(const char *file_name) image = RCreateImage(features.width, features.height, False); if (!image) { RErrorCode = RERR_NOMEMORY; - free(raw_data); + wfree(raw_data); return NULL; } ret = WebPDecodeRGBInto(raw_data, raw_data_size, image->data, @@ -159,7 +161,7 @@ RImage *RLoadWEBP(const char *file_name) features.width * 3); } - free(raw_data); + wfree(raw_data); if (!ret) { fprintf(stderr, _("wrlib: failed to decode WebP from file \"%s\"\n"), file_name); diff --git a/wrlib/load_xpm.c b/wrlib/load_xpm.c index 54697acf..d50e7c98 100644 --- a/wrlib/load_xpm.c +++ b/wrlib/load_xpm.c @@ -29,6 +29,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -59,11 +61,11 @@ static RImage *create_rimage_from_xpm(RContext *context, XpmImage xpm) /* make color table */ for (i = 0; i < 4; i++) { - color_table[i] = malloc(xpm.ncolors * sizeof(unsigned char)); + color_table[i] = wmalloc(xpm.ncolors * sizeof(unsigned char)); if (!color_table[i]) { for (i = i - 1; i >= 0; i--) { if (color_table[i]) - free(color_table[i]); + wfree(color_table[i]); } RReleaseImage(image); RErrorCode = RERR_NOMEMORY; @@ -123,7 +125,7 @@ static RImage *create_rimage_from_xpm(RContext *context, XpmImage xpm) *(data++) = color_table[3][*p]; } for (i = 0; i < 4; i++) - free(color_table[i]); + wfree(color_table[i]); return image; } diff --git a/wrlib/load_xpm_normalized.c b/wrlib/load_xpm_normalized.c index 82be3c4e..2bbb9176 100644 --- a/wrlib/load_xpm_normalized.c +++ b/wrlib/load_xpm_normalized.c @@ -59,15 +59,15 @@ static void free_color_symbol_table(unsigned char *color_table[], unsigned short *symbol_table) { if (color_table[0]) - free(color_table[0]); + wfree(color_table[0]); if (color_table[1]) - free(color_table[1]); + wfree(color_table[1]); if (color_table[2]) - free(color_table[2]); + wfree(color_table[2]); if (color_table[3]) - free(color_table[3]); + wfree(color_table[3]); if (symbol_table) - free(symbol_table); + wfree(symbol_table); } RImage *RGetImageFromXPMData(RContext * context, char **data) @@ -95,11 +95,11 @@ RImage *RGetImageFromXPMData(RContext * context, char **data) if (csize != 1 && csize != 2) goto bad_format; - color_table[0] = malloc(ccount); - color_table[1] = malloc(ccount); - color_table[2] = malloc(ccount); - color_table[3] = malloc(ccount); - symbol_table = malloc(ccount * sizeof(unsigned short)); + color_table[0] = wmalloc(ccount); + color_table[1] = wmalloc(ccount); + color_table[2] = wmalloc(ccount); + color_table[3] = wmalloc(ccount); + symbol_table = wmalloc(ccount * sizeof(unsigned short)); bsize = csize * w + 16; @@ -283,14 +283,14 @@ RImage *RLoadXPM(RContext * context, const char *file) if (csize != 1 && csize != 2) goto bad_format; - color_table[0] = malloc(ccount); - color_table[1] = malloc(ccount); - color_table[2] = malloc(ccount); - color_table[3] = malloc(ccount); - symbol_table = malloc(ccount * sizeof(unsigned short)); + color_table[0] = wmalloc(ccount); + color_table[1] = wmalloc(ccount); + color_table[2] = wmalloc(ccount); + color_table[3] = wmalloc(ccount); + symbol_table = wmalloc(ccount * sizeof(unsigned short)); bsize = csize * w + 16; - buffer = malloc(bsize); + buffer = wmalloc(bsize); if (!color_table[0] || !color_table[1] || !color_table[2] || !color_table[3] || !symbol_table || !bsize || !buffer) { @@ -298,7 +298,7 @@ RImage *RLoadXPM(RContext * context, const char *file) fclose(f); free_color_symbol_table(color_table, symbol_table); if (buffer) - free(buffer); + wfree(buffer); return NULL; } @@ -355,7 +355,7 @@ RImage *RLoadXPM(RContext * context, const char *file) fclose(f); free_color_symbol_table(color_table, symbol_table); if (buffer) - free(buffer); + wfree(buffer); return NULL; } @@ -434,7 +434,7 @@ RImage *RLoadXPM(RContext * context, const char *file) fclose(f); free_color_symbol_table(color_table, symbol_table); if (buffer) - free(buffer); + wfree(buffer); return image; bad_format: @@ -442,7 +442,7 @@ RImage *RLoadXPM(RContext * context, const char *file) fclose(f); free_color_symbol_table(color_table, symbol_table); if (buffer) - free(buffer); + wfree(buffer); if (image) RReleaseImage(image); return NULL; @@ -452,7 +452,7 @@ RImage *RLoadXPM(RContext * context, const char *file) fclose(f); free_color_symbol_table(color_table, symbol_table); if (buffer) - free(buffer); + wfree(buffer); if (image) RReleaseImage(image); return NULL; diff --git a/wrlib/raster.c b/wrlib/raster.c index 0f8fdd11..14468a21 100644 --- a/wrlib/raster.c +++ b/wrlib/raster.c @@ -27,6 +27,8 @@ #include #include +#include + #include "wraster.h" #include "wr_i18n.h" @@ -53,7 +55,7 @@ RImage *RCreateImage(unsigned width, unsigned height, int alpha) return NULL; } - image = malloc(sizeof(RImage)); + image = wmalloc(sizeof(RImage)); if (!image) { RErrorCode = RERR_NOMEMORY; return NULL; @@ -68,10 +70,10 @@ RImage *RCreateImage(unsigned width, unsigned height, int alpha) /* the +4 is to give extra bytes at the end of the buffer, * so that we can optimize image conversion for MMX(tm).. see convert.c */ - image->data = malloc(width * height * (alpha ? 4 : 3) + 4); + image->data = wmalloc(width * height * (alpha ? 4 : 3) + 4); if (!image->data) { RErrorCode = RERR_NOMEMORY; - free(image); + wfree(image); image = NULL; } @@ -94,8 +96,8 @@ void RReleaseImage(RImage * image) image->refCount--; if (image->refCount < 1) { - free(image->data); - free(image); + wfree(image->data); + wfree(image); } } diff --git a/wrlib/save_jpeg.c b/wrlib/save_jpeg.c index 5320ba47..25c15f6c 100644 --- a/wrlib/save_jpeg.c +++ b/wrlib/save_jpeg.c @@ -29,6 +29,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -59,7 +61,7 @@ Bool RSaveJPEG(RImage *img, const char *filename, char *title) img_depth = 3; /* collect separate RGB values to a buffer */ - buffer = malloc(sizeof(char) * 3 * img->width * img->height); + buffer = wmalloc(sizeof(char) * 3 * img->width * img->height); for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { RGetPixel(img, x, y, &pixel); @@ -97,7 +99,7 @@ Bool RSaveJPEG(RImage *img, const char *filename, char *title) jpeg_finish_compress(&cinfo); /* Clean */ - free(buffer); + wfree(buffer); fclose(file); return True; diff --git a/wrlib/save_png.c b/wrlib/save_png.c index 40d3b996..3ece7cf7 100644 --- a/wrlib/save_png.c +++ b/wrlib/save_png.c @@ -29,6 +29,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -95,7 +97,7 @@ Bool RSavePNG(RImage *img, const char *filename, char *title) png_write_info(png_ptr, png_info_ptr); /* Allocate memory for one row (3 bytes per pixel - RGB) */ - png_row = (png_bytep) malloc(3 * width * sizeof(png_byte)); + png_row = (png_bytep) wmalloc(3 * width * sizeof(png_byte)); /* Write image data */ for (y = 0; y < height; y++) { @@ -121,7 +123,7 @@ Bool RSavePNG(RImage *img, const char *filename, char *title) if (png_ptr != NULL) png_destroy_write_struct(&png_ptr, (png_infopp) NULL); if (png_row != NULL) - free(png_row); + wfree(png_row); return True; } diff --git a/wrlib/save_xpm.c b/wrlib/save_xpm.c index 243f9506..2dfae605 100644 --- a/wrlib/save_xpm.c +++ b/wrlib/save_xpm.c @@ -28,6 +28,8 @@ #include #include +#include + #include "wraster.h" #include "imgformat.h" #include "wr_i18n.h" @@ -95,7 +97,7 @@ static Bool addcolor(XPMColor ** list, unsigned r, unsigned g, unsigned b, int * if (tmpc) return True; - newc = malloc(sizeof(XPMColor)); + newc = wmalloc(sizeof(XPMColor)); if (!newc) { @@ -149,7 +151,7 @@ static void freecolormap(XPMColor * colormap) while (colormap) { tmp = colormap->next; - free(colormap); + wfree(colormap); colormap = tmp; } } diff --git a/wrlib/scale.c b/wrlib/scale.c index 93c5172d..3d5550c4 100644 --- a/wrlib/scale.c +++ b/wrlib/scale.c @@ -29,6 +29,8 @@ #include #include +#include + #include "wraster.h" #include "scale.h" #include "wr_i18n.h" @@ -295,7 +297,7 @@ typedef struct { /* clamp the input to the specified range */ #define CLAMP(v,l,h) ((v)<(l) ? (l) : (v) > (h) ? (h) : v) -/* return of calloc is not checked if NULL in the function below! */ +/* return of wmalloc is not checked if NULL in the function below! */ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) { CLIST *contrib; /* array of contribution lists */ @@ -319,13 +321,13 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) yscale = (double)new_height / (double)src->height; /* pre-calculate filter contributions for a row */ - contrib = (CLIST *) calloc(new_width, sizeof(CLIST)); + contrib = (CLIST *) wmalloc(new_width * sizeof(CLIST)); if (xscale < 1.0) { width = fwidth / xscale; fscale = 1.0 / xscale; for (i = 0; i < new_width; ++i) { contrib[i].n = 0; - contrib[i].p = (CONTRIB *) calloc((int) ceil(width * 2 + 1), sizeof(CONTRIB)); + contrib[i].p = (CONTRIB *) wmalloc(ceil(width * 2 + 1) * sizeof(CONTRIB)); center = (double)i / xscale; left = ceil(center - width); right = floor(center + width); @@ -348,7 +350,7 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) for (i = 0; i < new_width; ++i) { contrib[i].n = 0; - contrib[i].p = (CONTRIB *) calloc((int) ceil(fwidth * 2 + 1), sizeof(CONTRIB)); + contrib[i].p = (CONTRIB *) wmalloc(ceil(fwidth * 2 + 1) * sizeof(CONTRIB)); center = (double)i / xscale; left = ceil(center - fwidth); right = floor(center + fwidth); @@ -395,18 +397,18 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) /* free the memory allocated for horizontal filter weights */ for (i = 0; i < new_width; ++i) { - free(contrib[i].p); + wfree(contrib[i].p); } - free(contrib); + wfree(contrib); /* pre-calculate filter contributions for a column */ - contrib = (CLIST *) calloc(dst->height, sizeof(CLIST)); + contrib = (CLIST *) wmalloc(dst->height * sizeof(CLIST)); if (yscale < 1.0) { width = fwidth / yscale; fscale = 1.0 / yscale; for (i = 0; i < dst->height; ++i) { contrib[i].n = 0; - contrib[i].p = (CONTRIB *) calloc((int) ceil(width * 2 + 1), sizeof(CONTRIB)); + contrib[i].p = (CONTRIB *) wmalloc(ceil(width * 2 + 1) * sizeof(CONTRIB)); center = (double)i / yscale; left = ceil(center - width); right = floor(center + width); @@ -428,7 +430,7 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) } else { for (i = 0; i < dst->height; ++i) { contrib[i].n = 0; - contrib[i].p = (CONTRIB *) calloc((int) ceil(fwidth * 2 + 1), sizeof(CONTRIB)); + contrib[i].p = (CONTRIB *) wmalloc(ceil(fwidth * 2 + 1) * sizeof(CONTRIB)); center = (double)i / yscale; left = ceil(center - fwidth); right = floor(center + fwidth); @@ -450,7 +452,7 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) } /* apply filter to zoom vertically from tmp to dst */ - sp = malloc(tmp->height * 3); + sp = wmalloc(tmp->height * 3); for (k = 0; k < new_width; ++k) { CONTRIB *pp; @@ -485,13 +487,13 @@ RImage *RSmoothScaleImage(RImage * src, unsigned new_width, unsigned new_height) p += new_width * 3; } } - free(sp); + wfree(sp); /* free the memory allocated for vertical filter weights */ for (i = 0; i < dst->height; ++i) { - free(contrib[i].p); + wfree(contrib[i].p); } - free(contrib); + wfree(contrib); RReleaseImage(tmp); diff --git a/wrlib/tests/testgrad.c b/wrlib/tests/testgrad.c index 0b5a7994..9f6a97f3 100644 --- a/wrlib/tests/testgrad.c +++ b/wrlib/tests/testgrad.c @@ -38,7 +38,7 @@ int main(int argc, char **argv) else ProgName++; - color_name = (char **)malloc(sizeof(char *) * argc); + color_name = (char **)wmalloc(sizeof(char *) * argc); if (color_name == NULL) { fprintf(stderr, "Cannot allocate memory!\n"); exit(1); @@ -106,13 +106,13 @@ int main(int argc, char **argv) exit(1); } - colors = malloc(sizeof(RColor *) * (ncolors + 1)); + colors = wmalloc(sizeof(RColor *) * (ncolors + 1)); for (i = 0; i < ncolors; i++) { if (!XParseColor(dpy, ctx->cmap, color_name[i], &color)) { printf("could not parse color \"%s\"\n", color_name[i]); exit(1); } else { - colors[i] = malloc(sizeof(RColor)); + colors[i] = wmalloc(sizeof(RColor)); colors[i]->red = color.red >> 8; colors[i]->green = color.green >> 8; colors[i]->blue = color.blue >> 8; @@ -149,10 +149,10 @@ int main(int argc, char **argv) getchar(); - free(color_name); + wfree(color_name); for (i = 0; i < ncolors + 1; i++) - free(colors[i]); - free(colors); + wfree(colors[i]); + wfree(colors); RDestroyContext(ctx); RShutdown(); diff --git a/wrlib/xutil.c b/wrlib/xutil.c index c1fbfeef..7131b4b2 100644 --- a/wrlib/xutil.c +++ b/wrlib/xutil.c @@ -31,6 +31,8 @@ #include +#include + #ifdef USE_XSHM #include #include @@ -63,7 +65,7 @@ RXImage *RCreateXImage(RContext * context, int depth, unsigned width, unsigned h RXImage *rximg; Visual *visual = context->visual; - rximg = malloc(sizeof(RXImage)); + rximg = wmalloc(sizeof(RXImage)); if (!rximg) { RErrorCode = RERR_NOMEMORY; return NULL; @@ -71,14 +73,14 @@ RXImage *RCreateXImage(RContext * context, int depth, unsigned width, unsigned h #ifndef USE_XSHM rximg->image = XCreateImage(context->dpy, visual, depth, ZPixmap, 0, NULL, width, height, 8, 0); if (!rximg->image) { - free(rximg); + wfree(rximg); RErrorCode = RERR_XERROR; return NULL; } - rximg->image->data = malloc(rximg->image->bytes_per_line * height); + rximg->image->data = wmalloc(rximg->image->bytes_per_line * height); if (!rximg->image->data) { XDestroyImage(rximg->image); - free(rximg); + wfree(rximg); RErrorCode = RERR_NOMEMORY; return NULL; } @@ -90,14 +92,14 @@ RXImage *RCreateXImage(RContext * context, int depth, unsigned width, unsigned h rximg->is_shared = 0; rximg->image = XCreateImage(context->dpy, visual, depth, ZPixmap, 0, NULL, width, height, 8, 0); if (!rximg->image) { - free(rximg); + wfree(rximg); RErrorCode = RERR_XERROR; return NULL; } - rximg->image->data = malloc(rximg->image->bytes_per_line * height); + rximg->image->data = wmalloc(rximg->image->bytes_per_line * height); if (!rximg->image->data) { XDestroyImage(rximg->image); - free(rximg); + wfree(rximg); RErrorCode = RERR_NOMEMORY; return NULL; } @@ -173,7 +175,7 @@ void RDestroyXImage(RContext * context, RXImage * rximage) XDestroyImage(rximage->image); } #endif - free(rximage); + wfree(rximage); } static unsigned getDepth(Display * dpy, Drawable d) @@ -205,7 +207,7 @@ RXImage *RGetXImage(RContext * context, Drawable d, int x, int y, unsigned width } } if (!ximg) { - ximg = malloc(sizeof(RXImage)); + ximg = wmalloc(sizeof(RXImage)); if (!ximg) { RErrorCode = RERR_NOMEMORY; return NULL; @@ -214,7 +216,7 @@ RXImage *RGetXImage(RContext * context, Drawable d, int x, int y, unsigned width ximg->image = XGetImage(context->dpy, d, x, y, width, height, AllPlanes, ZPixmap); } #else /* !USE_XSHM */ - ximg = malloc(sizeof(RXImage)); + ximg = wmalloc(sizeof(RXImage)); if (!ximg) { RErrorCode = RERR_NOMEMORY; return NULL; @@ -224,7 +226,7 @@ RXImage *RGetXImage(RContext * context, Drawable d, int x, int y, unsigned width #endif /* !USE_XSHM */ if (ximg->image == NULL) { - free(ximg); + wfree(ximg); return NULL; }