Same as previous patches but this time to add some functions
to wrlib to release all memory allocated.
The apps using wrlib have to call the cleaning functions before leaving.


---
 wrlib/context.c      | 11 +++++++++++
 wrlib/convert.c      | 27 ++++++++++++++++++++++++++-
 wrlib/libwraster.map |  1 +
 wrlib/load.c         | 17 +++++++++++++++++
 wrlib/wraster.h      |  7 +++++++
 5 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/wrlib/context.c b/wrlib/context.c
index b6794d0..04228ed 100644
--- a/wrlib/context.c
+++ b/wrlib/context.c
@@ -688,6 +688,17 @@ RContext *RCreateContext(Display * dpy, int
screen_number, const RContextAttribu
  return context;
 }

+void RDestroyContext(RContext * context)
+{
+ if (context) {
+ if (context && context->attribs)
+ free(context->attribs);
+ if (context && context->copy_gc)
+ XFreeGC(context->dpy, context->copy_gc);
+ free(context);
+ }
+}
+
 static Bool bestContext(Display * dpy, int screen_number, RContext * context)
 {
  XVisualInfo *vinfo = NULL, rvinfo;
diff --git a/wrlib/convert.c b/wrlib/convert.c
index f3c9a49..867a3d8 100644
--- a/wrlib/convert.c
+++ b/wrlib/convert.c
@@ -62,6 +62,32 @@ typedef struct RStdConversionTable {
 static RConversionTable *conversionTable = NULL;
 static RStdConversionTable *stdConversionTable = NULL;

+static void release_conversion_table()
+{
+ RConversionTable *tmp = conversionTable;
+ while (tmp) {
+ RConversionTable *tmp_to_delete = tmp;
+ tmp = tmp->next;
+ free(tmp_to_delete);
+ }
+}
+
+static void release_std_conversion_table()
+{
+ RStdConversionTable *tmp = stdConversionTable;
+ while (tmp) {
+ RStdConversionTable *tmp_to_delete = tmp;
+ tmp = tmp->next;
+ free(tmp_to_delete);
+ }
+}
+
+void RDestroyConvertTables()
+{
+ release_conversion_table();
+ release_std_conversion_table();
+}
+
 static unsigned short *computeTable(unsigned short mask)
 {
  RConversionTable *tmp = conversionTable;
@@ -356,7 +382,6 @@ static RXImage *image2TrueColor(RContext * ctx,
RImage * image)
  }

  }
-
  return ximg;
 }

diff --git a/wrlib/libwraster.map b/wrlib/libwraster.map
index 6e165ef..422af75 100644
--- a/wrlib/libwraster.map
+++ b/wrlib/libwraster.map
@@ -33,6 +33,7 @@ LIBWRASTER3
     RConvertImageMask;
     RCopyArea;
     RCreateContext;
+    RDestroyContext;
     RCreateImage;
     RCreateImageFromDrawable;
     RCreateImageFromXImage;
diff --git a/wrlib/load.c b/wrlib/load.c
index 8e0d34d..5e0e8cb 100644
--- a/wrlib/load.c
+++ b/wrlib/load.c
@@ -105,11 +105,28 @@ char **RSupportedFileFormats(void)
  return tmp;
 }

+static void destroy_cache(void)
+{
+ if (RImageCacheSize > 0) {
+ for (int i = 0; i < RImageCacheSize; i++) {
+ if (RImageCache[i].file) {
+ free(RImageCache[i].file);
+ RImageCache[i].file = NULL;
+ RReleaseImage(RImageCache[i].image);
+ }
+
+ }
+ free(RImageCache);
+ }
+}
+
 /* cleaning third-party libs at shutdown */
 void RShutdown() {
 #ifdef USE_MAGICK
  MagickWandTerminus();
 #endif
+ destroy_cache();
+ RDestroyConvertTables();
 }

 static void init_cache(void)
diff --git a/wrlib/wraster.h b/wrlib/wraster.h
index c4ed231..a87eb1c 100644
--- a/wrlib/wraster.h
+++ b/wrlib/wraster.h
@@ -461,11 +461,18 @@ void RPutXImage(RContext *context, Drawable d,
GC gc, RXImage *ximage,
                 int src_x, int src_y, int dest_x, int dest_y,
                 unsigned width, unsigned height);

+void RDestroyConvertTables();
+
 /* do not free the returned string! */
 const char *RMessageForError(int errorCode);

 int RBlurImage(RImage *image);

+
+#ifdef USE_MAGICK
+ extern void MagickWandTerminus();
+#endif
+
 /****** Global Variables *******/

 extern int RErrorCode;
-- 
1.8.3.2

Attachment: 0001-Added-clean-functions-to-wrlib.patch
Description: Binary data

Reply via email to