return(signature);
}
+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=(cl_event *) RelinquishMagickMemory(info->events);
+ if (info->buffer != (cl_mem) NULL)
+ openCL_library->clReleaseMemObject(info->buffer);
+ RelinquishSemaphoreInfo(&info->events_semaphore);
+ ReleaseOpenCLDevice(info->device);
+ RelinquishMagickMemory(info);
+}
+
/*
Provide call to OpenCL library methods
*/
MagickCLCacheInfo
info;
- info=(MagickCLCacheInfo) AcquireMagickMemory(sizeof(*info));
- if (info == (MagickCLCacheInfo) NULL)
- ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+ info=(MagickCLCacheInfo) AcquireCriticalMemory(sizeof(*info));
(void) ResetMagickMemory(info,0,sizeof(*info));
LockSemaphoreInfo(openCL_lock);
device->requested++;
&status);
if (status == CL_SUCCESS)
return(info);
- LockSemaphoreInfo(openCL_lock);
- device->requested--;
- UnlockSemaphoreInfo(openCL_lock);
- return((MagickCLCacheInfo) RelinquishMagickMemory(info));
+ DestroyMagickCLCacheInfo(info);
+ return((MagickCLCacheInfo) NULL);
}
/*
% 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=(cl_event *) RelinquishMagickMemory(info->events);
- if (info->buffer != (cl_mem) NULL)
- openCL_library->clReleaseMemObject(info->buffer);
- RelinquishSemaphoreInfo(&info->events_semaphore);
- ReleaseOpenCLDevice(info->device);
- RelinquishMagickMemory(info);
-}
static void CL_API_CALL DestroyMagickCLCacheInfoAndPixels(
cl_event magick_unused(event),
Quantum
*pixels;
+ ssize_t
+ i;
+
magick_unreferenced(event);
magick_unreferenced(event_command_exec_status);
info=(MagickCLCacheInfo) user_data;
+ for (i=(ssize_t)info->event_count-1; i >= 0; i--)
+ {
+ cl_int
+ event_status;
+
+ cl_uint
+ status;
+
+ status=openCL_library->clGetEventInfo(info->events[i],
+ CL_EVENT_COMMAND_EXECUTION_STATUS,sizeof(event_status),&event_status,
+ NULL);
+ if ((status == CL_SUCCESS) && (event_status != CL_COMPLETE))
+ {
+ openCL_library->clSetEventCallback(info->events[i],CL_COMPLETE,
+ &DestroyMagickCLCacheInfoAndPixels,info);
+ return;
+ }
+ }
pixels=info->pixels;
RelinquishMagickResource(MemoryResource,info->length);
DestroyMagickCLCacheInfo(info);
if (info == (MagickCLCacheInfo) NULL)
return((MagickCLCacheInfo) NULL);
if (relinquish_pixels != MagickFalse)
- {
- MagickBooleanType
- events_completed;
-
- ssize_t
- i;
-
- events_completed=MagickTrue;
- for (i=0; i < (ssize_t)info->event_count; i++)
- {
- cl_int
- event_status;
-
- cl_uint
- status;
-
- status=openCL_library->clGetEventInfo(info->events[i],
- CL_EVENT_COMMAND_EXECUTION_STATUS,sizeof(cl_int),&event_status,NULL);
- if ((status == CL_SUCCESS) && (event_status != CL_COMPLETE))
- {
- events_completed=MagickFalse;
- break;
- }
- }
- if (events_completed == MagickFalse)
- openCL_library->clSetEventCallback(info->events[info->event_count-1],
- CL_COMPLETE,&DestroyMagickCLCacheInfoAndPixels,info);
- else
- DestroyMagickCLCacheInfoAndPixels((cl_event) NULL,0,info);
- }
+ DestroyMagickCLCacheInfoAndPixels((cl_event) NULL,0,info);
else
DestroyMagickCLCacheInfo(info);
return((MagickCLCacheInfo) NULL);