]> granicus.if.org Git - imagemagick/commitdiff
Fixed issue with writing to shared cache.
authorDirk Lemstra <dirk@git.imagemagick.org>
Tue, 27 Mar 2018 21:48:47 +0000 (23:48 +0200)
committerDirk Lemstra <dirk@git.imagemagick.org>
Tue, 27 Mar 2018 21:48:47 +0000 (23:48 +0200)
MagickCore/cache-private.h
MagickCore/cache.c

index 9891543f0dc667759a05b23018e64bdc6f7e3690..ba49236c6c1aa40d49d2a9774a8954fe885ecd72 100644 (file)
@@ -286,7 +286,7 @@ extern MagickPrivate void
 
 #if defined(MAGICKCORE_OPENCL_SUPPORT)
 extern MagickPrivate cl_mem
-  GetAuthenticOpenCLBuffer(const Image *,MagickCLDevice,ExceptionInfo *);
+  GetAuthenticOpenCLBuffer(Image *,MagickCLDevice,ExceptionInfo *);
 
 extern MagickPrivate void
   SyncAuthenticOpenCLBuffer(const Image *);
index 95613b07729b64b844bf0ffd41f1713664bac946..fb50b33193e1d7222869189b56547392e8a226c1 100644 (file)
@@ -1136,7 +1136,7 @@ static void *GetAuthenticMetacontentFromCache(const Image *image)
 %
 %  The format of the GetAuthenticOpenCLBuffer() method is:
 %
-%      cl_mem GetAuthenticOpenCLBuffer(const Image *image,
+%      cl_mem GetAuthenticOpenCLBuffer(Image *image,
 %        MagickCLDevice device,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
@@ -1148,7 +1148,7 @@ static void *GetAuthenticMetacontentFromCache(const Image *image)
 %    o exception: return any errors or warnings in this structure.
 %
 */
-MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image,
+MagickPrivate cl_mem GetAuthenticOpenCLBuffer(Image *image,
   MagickCLDevice device,ExceptionInfo *exception)
 {
   CacheInfo
@@ -1157,8 +1157,11 @@ MagickPrivate cl_mem GetAuthenticOpenCLBuffer(const Image *image,
   assert(image != (const Image *) NULL);
   assert(device != (const MagickCLDevice) NULL);
   cache_info=(CacheInfo *) image->cache;
-  if (cache_info->type == UndefinedCache)
-    SyncImagePixelCache((Image *) image,exception);
+  if ((cache_info->type == UndefinedCache) || (cache_info->reference_count > 1))
+    {
+      SyncImagePixelCache(image,exception);
+      cache_info=(CacheInfo *) image->cache;
+    }
   if ((cache_info->type != MemoryCache) || (cache_info->mapped != MagickFalse))
     return((cl_mem) NULL);
   LockSemaphoreInfo(cache_info->semaphore);