From: dirk Date: Sun, 19 Jun 2016 10:35:35 +0000 (+0200) Subject: Fixed memory leak in RelinquishMagickCLCacheInfo. X-Git-Tag: 7.0.2-1~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fb2395d563883c0558115e7c1ae930d6ca5c942;p=imagemagick Fixed memory leak in RelinquishMagickCLCacheInfo. --- diff --git a/MagickCore/opencl.c b/MagickCore/opencl.c index 197b87b80..ca92c771b 100644 --- a/MagickCore/opencl.c +++ b/MagickCore/opencl.c @@ -433,23 +433,6 @@ static size_t StringSignature(const char* string) return(signature); } -static MagickCLCacheInfo DestroyMagickCLCacheInfo(MagickCLCacheInfo info) -{ - ssize_t - i; - - for (i=0; i < (ssize_t) info->event_count; i++) - openCL_library->clReleaseEvent(info->events[i]); - info->events=RelinquishMagickMemory(info->events); - if (info->buffer != (cl_mem) NULL) - { - openCL_library->clReleaseMemObject(info->buffer); - info->buffer=(cl_mem) NULL; - } - ReleaseOpenCLDevice(info->device); - return((MagickCLCacheInfo) RelinquishMagickMemory(info)); -} - /* Provide call to OpenCL library methods */ @@ -2705,10 +2688,26 @@ MagickPrivate void ReleaseOpenCLDevice(MagickCLDevice device) % o relinquish_pixels: the pixels will be relinquish when set to true. % */ +static void DestroyMagickCLCacheInfo(MagickCLCacheInfo info) +{ + ssize_t + i; + + for (i=0; i < (ssize_t) info->event_count; i++) + openCL_library->clReleaseEvent(info->events[i]); + info->events=RelinquishMagickMemory(info->events); + if (info->buffer != (cl_mem) NULL) + { + openCL_library->clReleaseMemObject(info->buffer); + info->buffer=(cl_mem) NULL; + } + ReleaseOpenCLDevice(info->device); + RelinquishMagickMemory(info); +} -static void CL_API_CALL DestroyMagickCLCacheInfoDelayed( - cl_event magick_unused(event),cl_int magick_unused(event_command_exec_status), - void *user_data) +static void CL_API_CALL DestroyMagickCLCacheInfoAndPixels( + cl_event magick_unused(event), + cl_int magick_unused(event_command_exec_status),void *user_data) { MagickCLCacheInfo info; @@ -2726,9 +2725,14 @@ MagickPrivate MagickCLCacheInfo RelinquishMagickCLCacheInfo( { if (info == (MagickCLCacheInfo) NULL) return((MagickCLCacheInfo) NULL); - if (relinquish_pixels) - openCL_library->clSetEventCallback(info->events[info->event_count-1], - CL_COMPLETE,&DestroyMagickCLCacheInfoDelayed,info); + if (relinquish_pixels != MagickFalse) + { + if (info->event_count > 0) + openCL_library->clSetEventCallback(info->events[info->event_count-1], + CL_COMPLETE,&DestroyMagickCLCacheInfoAndPixels,info); + else + DestroyMagickCLCacheInfoAndPixels((cl_event) NULL,0,info); + } else DestroyMagickCLCacheInfo(info); return((MagickCLCacheInfo) NULL);