]> granicus.if.org Git - imagemagick/commitdiff
Fixed memory leak in CopyMagickCLCacheInfo and made the method more asynchronous.
authordirk <dirk@git.imagemagick.org>
Sun, 19 Jun 2016 10:33:28 +0000 (12:33 +0200)
committerdirk <dirk@git.imagemagick.org>
Sun, 19 Jun 2016 10:36:38 +0000 (12:36 +0200)
MagickCore/opencl.c

index 195948aafa01c6fa58f3076a46d1107331de7899..197b87b80f5a2c860b7f318ba1805eaa95843c6d 100644 (file)
@@ -1417,17 +1417,25 @@ MagickPrivate MagickCLCacheInfo CopyMagickCLCacheInfo(MagickCLCacheInfo info)
   cl_command_queue
     queue;
 
+  cl_event
+    event;
+
   Quantum
     *pixels;
 
-  if (info == (MagickCLCacheInfo) NULL || info->event_count == 0)
+  if (info == (MagickCLCacheInfo) NULL)
     return((MagickCLCacheInfo) NULL);
-  queue=AcquireOpenCLCommandQueue(info->device);
-  pixels=openCL_library->clEnqueueMapBuffer(queue,info->buffer,CL_TRUE,
-    CL_MAP_READ | CL_MAP_WRITE,0,info->length,info->event_count,info->events,
-    NULL,NULL);
-  assert(pixels == info->pixels);
-  RelinquishOpenCLCommandQueue(info->device,queue);
+  if (info->event_count > 0)
+    {
+      queue=AcquireOpenCLCommandQueue(info->device);
+      pixels=openCL_library->clEnqueueMapBuffer(queue,info->buffer,CL_FALSE,
+        CL_MAP_READ | CL_MAP_WRITE,0,info->length,info->event_count,
+        info->events,&event,(cl_int *) NULL);
+      assert(pixels == info->pixels);
+      RelinquishOpenCLCommandQueue(info->device,queue);
+      openCL_library->clWaitForEvents(1,&event);
+      openCL_library->clReleaseEvent(event);
+    }
   return(RelinquishMagickCLCacheInfo(info,MagickFalse));
 }