]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/distribute-cache.c
The 8bim profile will be updated when the iptc profile is changed.
[imagemagick] / MagickCore / distribute-cache.c
index b707188147cbe5d43354911485291ad4843be29c..36a0ac44454da74327cb7b265b2ab43964a462ab 100644 (file)
 %                 MagickCore Distributed Pixel Cache Methods                  %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                                January 2013                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -63,6 +63,7 @@
 #include "MagickCore/list.h"
 #include "MagickCore/locale_.h"
 #include "MagickCore/memory_.h"
+#include "MagickCore/nt-base-private.h"
 #include "MagickCore/pixel.h"
 #include "MagickCore/policy.h"
 #include "MagickCore/random_.h"
 #include "MagickCore/string_.h"
 #include "MagickCore/string-private.h"
 #include "MagickCore/version.h"
-#if defined(MAGICKCORE_HAVE_SOCKET)
+#include "MagickCore/version-private.h"
+#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
 #include <netinet/in.h>
 #include <netdb.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
+#else
+#undef send
+#undef recv
+#define send(file,buffer,length,flags)  0
+#define recv(file,buffer,length,flags)  0
 #endif
 \f
 /*
 %
 */
 
-static size_t CRC64(const unsigned char *message,const MagickSizeType length)
-{
-  register MagickOffsetType
-    i;
-
-  size_t
-    crc;
-
-  static MagickBooleanType
-    crc_initial = MagickFalse;
-
-  static size_t
-    crc_xor[256];
-
-  /*
-    Generate a 64-bit cyclic redundancy check for the message.
-  */
-  if (crc_initial == MagickFalse)
-    {
-      size_t
-        alpha;
-
-      for (i=0; i < 256; i++)
-      {
-        register MagickOffsetType
-          j;
-
-        alpha=(size_t) i;
-        for (j=0; j < 8; j++)
-        {
-          if ((alpha & 0x01) == 0)
-            alpha>>=1;
-          else
-            alpha=(size_t) ((alpha >> 1) ^
-              MagickULLConstant(0xd800000000000000));
-        }
-        crc_xor[i]=alpha;
-      }
-      crc_initial=MagickTrue;
-    }
-  crc=0;
-  for (i=0; i < (MagickOffsetType) length; i++)
-    crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8);
-  return(crc);
-}
-
 static inline MagickSizeType MagickMin(const MagickSizeType x,
   const MagickSizeType y)
 {
@@ -175,6 +136,11 @@ static inline MagickOffsetType dpc_read(int file,const MagickSizeType length,
   ssize_t
     count;
 
+#if !defined(MAGICKCORE_HAVE_SOCKET) || !defined(MAGICKCORE_THREAD_SUPPORT)
+  magick_unreferenced(file);
+  magick_unreferenced(message);
+#endif
+
   count=0;
   for (i=0; i < (MagickOffsetType) length; i+=count)
   {
@@ -193,7 +159,7 @@ static inline MagickOffsetType dpc_read(int file,const MagickSizeType length,
 static int ConnectPixelCacheServer(const char *hostname,const int port,
   size_t *session_key,ExceptionInfo *exception)
 {
-#if defined(MAGICKCORE_HAVE_SOCKET)
+#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
   char
     service[MaxTextExtent];
 
@@ -204,9 +170,6 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
     client_socket,
     status;
 
-  register unsigned char
-    *p;
-
   ssize_t
     count;
 
@@ -215,8 +178,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
     *result;
 
   unsigned char
-    secret[MaxTextExtent],
-    session[2*MaxTextExtent];
+    secret[MaxTextExtent];
 
   /*
     Connect to distributed pixel cache and get session key.
@@ -229,9 +191,6 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
         "DistributedPixelCache","'%s'","shared secret expected");
       return(-1);
     }
-  p=session;
-  (void) CopyMagickString((char *) p,shared_secret,MaxTextExtent);
-  p+=strlen(shared_secret);
   (void) ResetMagickMemory(&hint,0,sizeof(hint));
   hint.ai_family=AF_INET;
   hint.ai_socktype=SOCK_STREAM;
@@ -248,6 +207,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
     result->ai_protocol);
   if (client_socket == -1)
     {
+      (void) close(client_socket);
       (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
         "DistributedPixelCache","'%s'",hostname);
       return(-1);
@@ -262,21 +222,13 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
   count=recv(client_socket,secret,MaxTextExtent,0);
   if (count != -1)
     {
-      size_t
-        signature;
-
-      (void) memcpy(p,secret,(size_t) count);
-      p+=count;
-      signature=MagickLibVersion;
-      (void) memcpy(p,&signature,sizeof(signature));
-      p+=sizeof(signature);
-      signature=MAGICKCORE_QUANTUM_DEPTH;
-      (void) memcpy(p,&signature,sizeof(signature));
-      p+=sizeof(signature);
-      signature=MAGICKCORE_HDRI_ENABLE;
-      (void) memcpy(p,&signature,sizeof(signature));
-      p+=sizeof(signature);
-      *session_key=CRC64(session,p-session);
+      StringInfo
+        *nonce;
+
+      nonce=AcquireStringInfo(count);
+      (void) memcpy(GetStringInfoDatum(nonce),secret,(size_t) count);
+      *session_key=GetMagickSignature(nonce);
+      nonce=DestroyStringInfo(nonce);
     }
   if (*session_key == 0)
     {
@@ -310,8 +262,7 @@ static char *GetHostname(int *port,ExceptionInfo *exception)
   /*
     Parse host list (e.g. 192.168.100.1:6668,192.168.100.2:6668).
   */
-  hosts=(char *) GetImageRegistry(StringRegistryType,"cache:hosts",
-    exception);
+  hosts=(char *) GetImageRegistry(StringRegistryType,"cache:hosts",exception);
   if (hosts == (char *) NULL)
     {
       *port=DPCPort;
@@ -377,6 +328,7 @@ MagickPrivate DistributeCacheInfo *AcquireDistributeCacheInfo(
   hostname=DestroyString(hostname);
   if (server_info->file == -1)
     server_info=DestroyDistributeCacheInfo(server_info);
+  server_info->debug=IsEventLogging();
   return(server_info);
 }
 \f
@@ -443,11 +395,12 @@ MagickPrivate DistributeCacheInfo *DestroyDistributeCacheInfo(
 */
 
 static MagickBooleanType DestroyDistributeCache(SplayTreeInfo *registry,
-  int file,const size_t session_key)
+  int magick_unused(file),const size_t session_key)
 {
   /*
     Destroy distributed pixel cache.
   */
+  magick_unreferenced(file);
   return(DeleteNodeFromSplayTree(registry,(const void *) session_key));
 }
 
@@ -460,6 +413,11 @@ static inline MagickOffsetType dpc_send(int file,const MagickSizeType length,
   register MagickOffsetType
     i;
 
+#if !defined(MAGICKCORE_HAVE_SOCKET) || !defined(MAGICKCORE_THREAD_SUPPORT)
+  magick_unreferenced(file);
+  magick_unreferenced(message);
+#endif
+
   /*
     Ensure a complete message is sent.
   */
@@ -478,8 +436,8 @@ static inline MagickOffsetType dpc_send(int file,const MagickSizeType length,
   return(i);
 }
 
-static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
-  int file,const size_t session_key,ExceptionInfo *exception)
+static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,int file,
+  const size_t session_key,ExceptionInfo *exception)
 {
   Image
     *image;
@@ -506,9 +464,10 @@ static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
   if (image == (Image *) NULL)
     return(MagickFalse);
   length=sizeof(image->storage_class)+sizeof(image->colorspace)+
-    sizeof(image->alpha_trait)+sizeof(image->mask)+sizeof(image->columns)+
-    sizeof(image->rows)+sizeof(image->number_channels)+MaxPixelChannels*
-    sizeof(*image->channel_map)+sizeof(image->metacontent_extent);
+    sizeof(image->alpha_trait)+sizeof(image->read_mask)+
+    sizeof(image->write_mask)+sizeof(image->columns)+sizeof(image->rows)+
+    sizeof(image->number_channels)+MaxPixelChannels*sizeof(*image->channel_map)+
+    sizeof(image->metacontent_extent);
   count=dpc_read(file,length,message);
   if (count != (MagickOffsetType) length)
     return(MagickFalse);
@@ -522,8 +481,10 @@ static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
   p+=sizeof(image->colorspace);
   (void) memcpy(&image->alpha_trait,p,sizeof(image->alpha_trait));
   p+=sizeof(image->alpha_trait);
-  (void) memcpy(&image->mask,p,sizeof(image->mask));
-  p+=sizeof(image->mask);
+  (void) memcpy(&image->read_mask,p,sizeof(image->read_mask));
+  p+=sizeof(image->read_mask);
+  (void) memcpy(&image->write_mask,p,sizeof(image->write_mask));
+  p+=sizeof(image->write_mask);
   (void) memcpy(&image->columns,p,sizeof(image->columns));
   p+=sizeof(image->columns);
   (void) memcpy(&image->rows,p,sizeof(image->rows));
@@ -594,7 +555,7 @@ static MagickBooleanType ReadDistributeCacheMetacontent(SplayTreeInfo *registry,
     exception);
   if (p == (const Quantum *) NULL)
     return(MagickFalse);
-  metacontent=GetVirtualMetacontent(image);
+  metacontent=(const unsigned char *) GetVirtualMetacontent(image);
   count=dpc_send(file,length,metacontent);
   if (count != (MagickOffsetType) length)
     return(MagickFalse);
@@ -714,7 +675,7 @@ static MagickBooleanType WriteDistributeCacheMetacontent(
     exception);
   if (q == (Quantum *) NULL)
     return(MagickFalse);
-  metacontent=GetAuthenticMetacontent(image);
+  metacontent=(unsigned char *) GetAuthenticMetacontent(image);
   count=dpc_read(file,length,metacontent);
   if (count != (MagickOffsetType) length)
     return(MagickFalse);
@@ -802,8 +763,7 @@ static void *DistributePixelCacheClient(void *socket)
 
   size_t
     key,
-    session_key,
-    signature;
+    session_key;
 
   SplayTreeInfo
     *registry;
@@ -827,17 +787,7 @@ static void *DistributePixelCacheClient(void *socket)
   random_info=AcquireRandomInfo();
   secret=GetRandomKey(random_info,DPCSessionKeyLength);
   (void) memcpy(p,GetStringInfoDatum(secret),DPCSessionKeyLength);
-  p+=DPCSessionKeyLength;
-  signature=MagickLibVersion;
-  (void) memcpy(p,&signature,sizeof(signature));
-  p+=sizeof(signature);
-  signature=MAGICKCORE_QUANTUM_DEPTH;
-  (void) memcpy(p,&signature,sizeof(signature));
-  p+=sizeof(signature);
-  signature=MAGICKCORE_HDRI_ENABLE;
-  (void) memcpy(p,&signature,sizeof(signature));
-  p+=sizeof(signature);
-  session_key=CRC64(session,p-session);
+  session_key=GetMagickSignature(secret);
   random_info=DestroyRandomInfo(random_info);
   exception=AcquireExceptionInfo();
   registry=NewSplayTree((int (*)(const void *,const void *)) NULL,
@@ -937,6 +887,8 @@ MagickExport void DistributePixelCacheServer(const int port,
   /*
     Launch distributed pixel cache server.
   */
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
   (void) ResetMagickMemory(&hint,0,sizeof(hint));
   hint.ai_family=AF_INET;
   hint.ai_socktype=SOCK_STREAM;
@@ -945,6 +897,7 @@ MagickExport void DistributePixelCacheServer(const int port,
   status=getaddrinfo((const char *) NULL,service,&hint,&result);
   if (status != 0)
     ThrowFatalException(CacheFatalError,"UnableToListen");
+  server_socket=0;
   for (p=result; p != (struct addrinfo *) NULL; p=p->ai_next)
   {
     int
@@ -957,11 +910,14 @@ MagickExport void DistributePixelCacheServer(const int port,
     status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&one,(socklen_t)
       sizeof(one));
     if (status == -1)
-      continue;
+      {
+        (void) close(server_socket);
+        continue;
+      }
     status=bind(server_socket,p->ai_addr,p->ai_addrlen);
     if (status == -1)
       {
-        (void) close(status);
+        (void) close(server_socket);
         continue;
       }
     break;
@@ -1148,8 +1104,10 @@ MagickPrivate MagickBooleanType OpenDistributePixelCache(
   p+=sizeof(image->colorspace);
   (void) memcpy(p,&image->alpha_trait,sizeof(image->alpha_trait));
   p+=sizeof(image->alpha_trait);
-  (void) memcpy(p,&image->mask,sizeof(image->mask));
-  p+=sizeof(image->mask);
+  (void) memcpy(p,&image->read_mask,sizeof(image->read_mask));
+  p+=sizeof(image->read_mask);
+  (void) memcpy(p,&image->write_mask,sizeof(image->write_mask));
+  p+=sizeof(image->write_mask);
   (void) memcpy(p,&image->columns,sizeof(image->columns));
   p+=sizeof(image->columns);
   (void) memcpy(p,&image->rows,sizeof(image->rows));
@@ -1264,7 +1222,7 @@ MagickPrivate MagickOffsetType ReadDistributePixelCacheMetacontent(
 %
 %      MagickOffsetType ReadDistributePixelCachePixels(
 %        DistributeCacheInfo *server_info,const RectangleInfo *region,
-%        const MagickSizeType length,unsigned char *pixels)
+%        const MagickSizeType length,unsigned char *restrict pixels)
 %
 %  A description of each parameter follows:
 %
@@ -1281,7 +1239,7 @@ MagickPrivate MagickOffsetType ReadDistributePixelCacheMetacontent(
 */
 MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
   DistributeCacheInfo *server_info,const RectangleInfo *region,
-  const MagickSizeType length,unsigned char *pixels)
+  const MagickSizeType length,unsigned char *restrict pixels)
 {
   MagickOffsetType
     count;
@@ -1471,7 +1429,7 @@ MagickPrivate MagickOffsetType WriteDistributePixelCacheMetacontent(
 %
 %      MagickBooleanType WriteDistributePixelCachePixels(
 %        DistributeCacheInfo *server_info,const RectangleInfo *region,
-%        const MagickSizeType length,const unsigned char *pixels)
+%        const MagickSizeType length,const unsigned char *restrict pixels)
 %
 %  A description of each parameter follows:
 %
@@ -1488,7 +1446,7 @@ MagickPrivate MagickOffsetType WriteDistributePixelCacheMetacontent(
 */
 MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
   DistributeCacheInfo *server_info,const RectangleInfo *region,
-  const MagickSizeType length,const unsigned char *pixels)
+  const MagickSizeType length,const unsigned char *restrict pixels)
 {
   MagickOffsetType
     count;