54#include "magick/studio.h"
55#include "magick/cache.h"
56#include "magick/cache-private.h"
57#include "magick/distribute-cache.h"
58#include "magick/distribute-cache-private.h"
59#include "magick/exception.h"
60#include "magick/exception-private.h"
61#include "magick/geometry.h"
62#include "magick/image.h"
63#include "magick/image-private.h"
64#include "magick/list.h"
65#include "magick/locale_.h"
66#include "magick/memory_.h"
67#include "magick/nt-base-private.h"
68#include "magick/policy.h"
69#include "magick/random_.h"
70#include "magick/registry.h"
71#include "magick/splay-tree.h"
72#include "magick/string_.h"
73#include "magick/string-private.h"
74#include "magick/version.h"
75#include "magick/version-private.h"
76#undef MAGICKCORE_HAVE_DISTRIBUTE_CACHE
77#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
78#include <netinet/in.h>
80#include <sys/socket.h>
82#define CLOSE_SOCKET(socket) (void) close(socket)
83#define HANDLER_RETURN_TYPE void *
84#define HANDLER_RETURN_VALUE (void *) NULL
85#define SOCKET_TYPE int
86#define LENGTH_TYPE size_t
87#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE
88#elif defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__) && !defined(__MINGW64__)
89#define CLOSE_SOCKET(socket) (void) closesocket(socket)
90#define HANDLER_RETURN_TYPE DWORD WINAPI
91#define HANDLER_RETURN_VALUE 0
92#define SOCKET_TYPE SOCKET
93#define LENGTH_TYPE int
94#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE
97#define CLOSE_SOCKET(socket) (void) close(socket)
99#define CLOSE_SOCKET(socket)
101#define HANDLER_RETURN_TYPE void *
102#define HANDLER_RETURN_VALUE (void *) NULL
103#define SOCKET_TYPE int
104#define LENGTH_TYPE size_t
107#define send(file,buffer,length,flags) 0
108#define recv(file,buffer,length,flags) 0
114#define DPCHostname "127.0.0.1"
115#define DPCPendingConnections 10
117#define DPCSessionKeyLength 8
119# define MSG_NOSIGNAL 0
145static inline MagickOffsetType dpc_read(
int file,
const MagickSizeType length,
146 unsigned char *magick_restrict message)
154#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
155 magick_unreferenced(file);
156 magick_unreferenced(message);
159 for (i=0; i < (MagickOffsetType) length; i+=count)
161 count=recv(file,(
char *) message+i,(LENGTH_TYPE) MagickMin(length-i,
162 (MagickSizeType) MagickMaxBufferExtent),0);
173static int ConnectPixelCacheServer(
const char *hostname,
const int port,
174 size_t *session_key,ExceptionInfo *exception)
176#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
178 service[MagickPathExtent],
201#if defined(MAGICKCORE_WINDOWS_SUPPORT)
202 NTInitializeWinsock(MagickTrue);
204 (void) memset(&hint,0,
sizeof(hint));
205 hint.ai_family=AF_INET;
206 hint.ai_socktype=SOCK_STREAM;
207 hint.ai_flags=AI_PASSIVE;
208 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
209 status=getaddrinfo(hostname,service,&hint,&result);
212 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
213 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
216 client_socket=socket(result->ai_family,result->ai_socktype,
217 result->ai_protocol);
218 if (client_socket == -1)
220 freeaddrinfo(result);
221 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
222 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
225 status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen);
226 freeaddrinfo(result);
229 CLOSE_SOCKET(client_socket);
230 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
231 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
234 count=recv(client_socket,(
char *) session_key,
sizeof(*session_key),0);
237 CLOSE_SOCKET(client_socket);
238 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
239 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
245 shared_secret=GetPolicyValue(
"cache:shared-secret");
246 if (shared_secret == (
char *) NULL)
248 CLOSE_SOCKET(client_socket);
249 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
250 "DistributedPixelCache",
"'%s': shared secret required",hostname);
253 nonce=StringToStringInfo(shared_secret);
254 if (GetMagickCoreSignature(nonce) != *session_key)
256 CLOSE_SOCKET(client_socket);
257 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
258 "DistributedPixelCache",
"'%s': authentication failed",hostname);
261 shared_secret=DestroyString(shared_secret);
262 nonce=DestroyStringInfo(nonce);
263 return(client_socket);
265 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
266 "DelegateLibrarySupportNotBuiltIn",
"distributed pixel cache");
271static char *GetHostname(
int *port,ExceptionInfo *exception)
290 hosts=(
char *) GetImageRegistry(StringRegistryType,
"cache:hosts",exception);
291 if (hosts == (
char *) NULL)
294 return(AcquireString(DPCHostname));
296 (void) SubstituteString(&hosts,
",",
" ");
297 hostlist=StringToArgv(hosts,&argc);
298 hosts=DestroyString(hosts);
299 if (hostlist == (
char **) NULL)
302 return(AcquireString(DPCHostname));
304 hosts=AcquireString(hostlist[(
id++ % (argc-1))+1]);
305 for (i=0; i < (ssize_t) argc; i++)
306 hostlist[i]=DestroyString(hostlist[i]);
307 hostlist=(
char **) RelinquishMagickMemory(hostlist);
308 (void) SubstituteString(&hosts,
":",
" ");
309 hostlist=StringToArgv(hosts,&argc);
310 if (hostlist == (
char **) NULL)
313 return(AcquireString(DPCHostname));
315 host=AcquireString(hostlist[1]);
316 if (hostlist[2] == (
char *) NULL)
319 *port=StringToLong(hostlist[2]);
320 for (i=0; i < (ssize_t) argc; i++)
321 hostlist[i]=DestroyString(hostlist[i]);
322 hostlist=(
char **) RelinquishMagickMemory(hostlist);
326MagickPrivate DistributeCacheInfo *AcquireDistributeCacheInfo(
327 ExceptionInfo *exception)
341 server_info=(DistributeCacheInfo *) AcquireCriticalMemory(
342 sizeof(*server_info));
343 (void) memset(server_info,0,
sizeof(*server_info));
344 server_info->signature=MagickCoreSignature;
346 hostname=GetHostname(&server_info->port,exception);
348 server_info->file=ConnectPixelCacheServer(hostname,server_info->port,
349 &session_key,exception);
350 if (server_info->file == -1)
351 server_info=DestroyDistributeCacheInfo(server_info);
354 server_info->session_key=session_key;
355 (void) CopyMagickString(server_info->hostname,hostname,MagickPathExtent);
356 server_info->debug=GetLogEventMask() & CacheEvent ? MagickTrue :
359 hostname=DestroyString(hostname);
387MagickPrivate DistributeCacheInfo *DestroyDistributeCacheInfo(
388 DistributeCacheInfo *server_info)
390 assert(server_info != (DistributeCacheInfo *) NULL);
391 assert(server_info->signature == MagickCoreSignature);
392 if (server_info->file > 0)
393 CLOSE_SOCKET(server_info->file);
394 server_info->signature=(~MagickCoreSignature);
395 server_info=(DistributeCacheInfo *) RelinquishMagickMemory(server_info);
425static MagickBooleanType DestroyDistributeCache(SplayTreeInfo *registry,
426 const size_t session_key)
429 key = (MagickAddressType) session_key;
434 return(DeleteNodeFromSplayTree(registry,(
const void *) key));
437static inline MagickOffsetType dpc_send(
int file,
const MagickSizeType length,
438 const void *magick_restrict message)
446#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
447 magick_unreferenced(file);
448 magick_unreferenced(message);
455 for (i=0; i < (MagickOffsetType) length; i+=count)
457 count=(MagickOffsetType) send(file,(
char *) message+i,(LENGTH_TYPE)
458 MagickMin(length-i,(MagickSizeType) MagickMaxBufferExtent),MSG_NOSIGNAL);
469static inline unsigned int CRC32(
const unsigned char *message,
const size_t length)
474 static MagickBooleanType
475 crc_initial = MagickFalse;
486 if (crc_initial == MagickFalse)
494 for (j=0; j < 256; j++)
500 for (k=0; k < 8; k++)
501 alpha=(alpha & 0x01) ? (0xEDB88320 ^ (alpha >> 1)) : (alpha >> 1);
504 crc_initial=MagickTrue;
507 for (i=0; i < (ssize_t) length; i++)
508 crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8);
509 return(crc ^ 0xFFFFFFFF);
512static inline unsigned int GetMagickSignature(
const StringInfo *nonce)
523 version=AcquireStringInfo(MagickPathExtent);
524 p=GetStringInfoDatum(version);
525 signature=MAGICKCORE_QUANTUM_DEPTH;
526 (void) memcpy(p,&signature,
sizeof(signature));
527 p+=(ptrdiff_t)
sizeof(signature);
528 signature=MAGICKCORE_HDRI_ENABLE;
529 (void) memcpy(p,&signature,
sizeof(signature));
530 p+=(ptrdiff_t)
sizeof(signature);
531 signature=MagickLibInterface;
532 (void) memcpy(p,&signature,
sizeof(signature));
533 p+=(ptrdiff_t)
sizeof(signature);
535 (void) memcpy(p,&signature,
sizeof(signature));
536 p+=(ptrdiff_t)
sizeof(signature);
537#if defined(MAGICKCORE_64BIT_CHANNEL_MASK_SUPPORT)
538 signature=
sizeof(ChannelType);
539 (void) memcpy(p,&signature,
sizeof(signature));
540 p+=(ptrdiff_t)
sizeof(signature);
542 SetStringInfoLength(version,(
size_t) (p-GetStringInfoDatum(version)));
543 if (nonce != (
const StringInfo *) NULL)
544 ConcatenateStringInfo(version,nonce);
545 signature=CRC32(GetStringInfoDatum(version),GetStringInfoLength(version));
546 version=DestroyStringInfo(version);
550static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
int file,
551 const size_t session_key,ExceptionInfo *exception)
557 key = (MagickAddressType) session_key;
569 message[MagickPathExtent],
575 image=AcquireImage((ImageInfo *) NULL);
576 if (image == (Image *) NULL)
578 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
579 sizeof(image->channels)+
sizeof(image->columns)+
sizeof(image->rows);
580 count=dpc_read(file,length,message);
581 if (count != (MagickOffsetType) length)
587 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
588 p+=(ptrdiff_t)
sizeof(image->storage_class);
589 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
590 p+=(ptrdiff_t)
sizeof(image->colorspace);
591 (void) memcpy(&image->channels,p,
sizeof(image->channels));
592 p+=(ptrdiff_t)
sizeof(image->channels);
593 (void) memcpy(&image->columns,p,
sizeof(image->columns));
594 p+=(ptrdiff_t)
sizeof(image->columns);
595 (void) memcpy(&image->rows,p,
sizeof(image->rows));
596 p+=(ptrdiff_t)
sizeof(image->rows);
597 if (SyncImagePixelCache(image,exception) == MagickFalse)
599 status=AddValueToSplayTree(registry,(
const void *) key,image);
603static MagickBooleanType ReadDistributeCacheIndexes(SplayTreeInfo *registry,
604 int file,
const size_t session_key,ExceptionInfo *exception)
616 key = (MagickAddressType) session_key;
628 message[MagickPathExtent],
634 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
635 if (image == (Image *) NULL)
637 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
638 sizeof(region.y)+
sizeof(length);
639 count=dpc_read(file,length,message);
640 if (count != (MagickOffsetType) length)
643 (void) memcpy(®ion.width,q,
sizeof(region.width));
644 q+=(ptrdiff_t)
sizeof(region.width);
645 (void) memcpy(®ion.height,q,
sizeof(region.height));
646 q+=(ptrdiff_t)
sizeof(region.height);
647 (void) memcpy(®ion.x,q,
sizeof(region.x));
648 q+=(ptrdiff_t)
sizeof(region.x);
649 (void) memcpy(®ion.y,q,
sizeof(region.y));
650 q+=(ptrdiff_t)
sizeof(region.y);
651 (void) memcpy(&length,q,
sizeof(length));
652 q+=(ptrdiff_t)
sizeof(length);
653 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
655 if (p == (
const PixelPacket *) NULL)
657 indexes=GetVirtualIndexQueue(image);
658 count=dpc_send(file,length,indexes);
659 if (count != (MagickOffsetType) length)
664static MagickBooleanType ReadDistributeCachePixels(SplayTreeInfo *registry,
665 int file,
const size_t session_key,ExceptionInfo *exception)
674 key = (MagickAddressType) session_key;
686 message[MagickPathExtent],
692 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
693 if (image == (Image *) NULL)
695 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
696 sizeof(region.y)+
sizeof(length);
697 count=dpc_read(file,length,message);
698 if (count != (MagickOffsetType) length)
701 (void) memcpy(®ion.width,q,
sizeof(region.width));
702 q+=(ptrdiff_t)
sizeof(region.width);
703 (void) memcpy(®ion.height,q,
sizeof(region.height));
704 q+=(ptrdiff_t)
sizeof(region.height);
705 (void) memcpy(®ion.x,q,
sizeof(region.x));
706 q+=(ptrdiff_t)
sizeof(region.x);
707 (void) memcpy(®ion.y,q,
sizeof(region.y));
708 q+=(ptrdiff_t)
sizeof(region.y);
709 (void) memcpy(&length,q,
sizeof(length));
710 q+=(ptrdiff_t)
sizeof(length);
711 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
713 if (p == (
const PixelPacket *) NULL)
715 count=dpc_send(file,length,p);
716 if (count != (MagickOffsetType) length)
721static void *RelinquishImageRegistry(
void *image)
723 return((
void *) DestroyImageList((Image *) image));
726static MagickBooleanType WriteDistributeCacheIndexes(SplayTreeInfo *registry,
727 int file,
const size_t session_key,ExceptionInfo *exception)
736 key = (MagickAddressType) session_key;
752 message[MagickPathExtent],
758 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
759 if (image == (Image *) NULL)
761 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
762 sizeof(region.y)+
sizeof(length);
763 count=dpc_read(file,length,message);
764 if (count != (MagickOffsetType) length)
767 (void) memcpy(®ion.width,p,
sizeof(region.width));
768 p+=(ptrdiff_t)
sizeof(region.width);
769 (void) memcpy(®ion.height,p,
sizeof(region.height));
770 p+=(ptrdiff_t)
sizeof(region.height);
771 (void) memcpy(®ion.x,p,
sizeof(region.x));
772 p+=(ptrdiff_t)
sizeof(region.x);
773 (void) memcpy(®ion.y,p,
sizeof(region.y));
774 p+=(ptrdiff_t)
sizeof(region.y);
775 (void) memcpy(&length,p,
sizeof(length));
776 extent=((MagickSizeType) region.width*region.height*
sizeof(IndexPacket));
779 p+=(ptrdiff_t)
sizeof(length);
780 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
782 if (q == (PixelPacket *) NULL)
784 indexes=GetAuthenticIndexQueue(image);
785 count=dpc_read(file,length,(
unsigned char *) indexes);
786 if (count != (MagickOffsetType) length)
788 return(SyncAuthenticPixels(image,exception));
791static MagickBooleanType WriteDistributeCachePixels(SplayTreeInfo *registry,
792 int file,
const size_t session_key,ExceptionInfo *exception)
798 key = (MagickAddressType) session_key;
814 message[MagickPathExtent],
820 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
821 if (image == (Image *) NULL)
823 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
824 sizeof(region.y)+
sizeof(length);
825 count=dpc_read(file,length,message);
826 if (count != (MagickOffsetType) length)
829 (void) memcpy(®ion.width,p,
sizeof(region.width));
830 p+=(ptrdiff_t)
sizeof(region.width);
831 (void) memcpy(®ion.height,p,
sizeof(region.height));
832 p+=(ptrdiff_t)
sizeof(region.height);
833 (void) memcpy(®ion.x,p,
sizeof(region.x));
834 p+=(ptrdiff_t)
sizeof(region.x);
835 (void) memcpy(®ion.y,p,
sizeof(region.y));
836 p+=(ptrdiff_t)
sizeof(region.y);
837 (void) memcpy(&length,p,
sizeof(length));
838 p+=(ptrdiff_t)
sizeof(length);
839 extent=((MagickSizeType) region.width*region.height*
sizeof(PixelPacket));
842 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
844 if (q == (PixelPacket *) NULL)
846 count=dpc_read(file,length,(
unsigned char *) q);
847 if (count != (MagickOffsetType) length)
849 return(SyncAuthenticPixels(image,exception));
852static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket_arg)
861 status = MagickFalse;
872 *client_socket_ptr = (SOCKET_TYPE *) socket_arg;
886 client_socket=(*client_socket_ptr);
887 client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(client_socket_ptr);
888 shared_secret = GetPolicyValue(
"cache:shared-secret");
889 if (shared_secret == (
char *) NULL)
890 ThrowFatalException(CacheFatalError,
"shared secret required");
891 nonce=StringToStringInfo(shared_secret);
892 shared_secret=DestroyString(shared_secret);
893 session_key=GetMagickSignature(nonce);
894 nonce=DestroyStringInfo(nonce);
895 exception=AcquireExceptionInfo();
899 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
900 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
901 count=dpc_send(client_socket,
sizeof(session_key),&session_key);
902 for (status=MagickFalse; ; )
904 count=dpc_read(client_socket,1,(
unsigned char *) &command);
907 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
908 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
914 status=OpenDistributeCache(registry,client_socket,session_key,
916 count=dpc_send(client_socket,
sizeof(status),&status);
921 status=ReadDistributeCachePixels(registry,client_socket,session_key,
927 status=ReadDistributeCacheIndexes(registry,client_socket,
928 session_key,exception);
933 status=WriteDistributeCachePixels(registry,client_socket,session_key,
939 status=WriteDistributeCacheIndexes(registry,client_socket,
940 session_key,exception);
945 status=DestroyDistributeCache(registry,session_key);
951 if ((status == MagickFalse) || (command ==
'd'))
954 count=dpc_send(client_socket,
sizeof(status),&status);
955 CLOSE_SOCKET(client_socket);
956 exception=DestroyExceptionInfo(exception);
957 registry=DestroySplayTree(registry);
958 return(HANDLER_RETURN_VALUE);
961MagickExport
void DistributePixelCacheServer(
const int port,
962 ExceptionInfo *exception)
965 service[MagickPathExtent];
970#if defined(MAGICKCORE_THREAD_SUPPORT)
976#elif defined(_MSC_VER)
999 assert(exception != (ExceptionInfo *) NULL);
1000 assert(exception->signature == MagickCoreSignature);
1001 magick_unreferenced(exception);
1002#if defined(MAGICKCORE_HAVE_WINSOCK2)
1003 InitializeWinsock2(MagickFalse);
1005 memset(&hint,0,
sizeof(hint));
1006 hint.ai_family=AF_INET;
1007 hint.ai_socktype=SOCK_STREAM;
1008 hint.ai_flags=AI_PASSIVE;
1009 FormatLocaleString(service,MagickPathExtent,
"%d",port);
1010 status=getaddrinfo(NULL,service,&hint,&result);
1012 ThrowFatalException(CacheFatalError,
"UnableToListen");
1013 server_socket=(SOCKET_TYPE) 0;
1014 for (p=result; p != NULL; p=p->ai_next)
1019 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
1020 if (server_socket == -1)
1022 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(
char *) &one,
1023 (socklen_t)
sizeof(one));
1026 CLOSE_SOCKET(server_socket);
1029 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
1032 CLOSE_SOCKET(server_socket);
1037 if (p == (
struct addrinfo *) NULL)
1038 ThrowFatalException(CacheFatalError,
"UnableToBind");
1039 freeaddrinfo(result);
1040 status=listen(server_socket,DPCPendingConnections);
1042 ThrowFatalException(CacheFatalError,
"UnableToListen");
1043#if defined(MAGICKCORE_THREAD_SUPPORT)
1044 pthread_attr_init(&attributes);
1045 pthread_attr_setdetachstate(&attributes,PTHREAD_CREATE_DETACHED);
1053 length = (socklen_t)
sizeof(address);
1055 client_socket_ptr=(SOCKET_TYPE *) AcquireMagickMemory(
sizeof(SOCKET_TYPE));
1056 if (client_socket_ptr == NULL)
1058 *client_socket_ptr=accept(server_socket,(
struct sockaddr *) &address,
1060 if (*client_socket_ptr == -1)
1062 client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(
1066#if defined(MAGICKCORE_THREAD_SUPPORT)
1067 status=pthread_create(&thread_id, &attributes,DistributePixelCacheClient,
1068 (
void *) client_socket_ptr);
1071 CLOSE_SOCKET(*client_socket_ptr);
1072 RelinquishMagickMemory(client_socket_ptr);
1073 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1075#elif defined(_MSC_VER)
1076 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) client_socket_ptr,0,&threadID) == (HANDLE) NULL)
1078 CLOSE_SOCKET(*client_socket_ptr);
1079 RelinquishMagickMemory(client_socket_ptr);
1080 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1111MagickPrivate
int GetDistributeCacheFile(
const DistributeCacheInfo *server_info)
1113 assert(server_info != (DistributeCacheInfo *) NULL);
1114 assert(server_info->signature == MagickCoreSignature);
1115 return(server_info->file);
1142MagickPrivate
const char *GetDistributeCacheHostname(
1143 const DistributeCacheInfo *server_info)
1145 assert(server_info != (DistributeCacheInfo *) NULL);
1146 assert(server_info->signature == MagickCoreSignature);
1147 return(server_info->hostname);
1173MagickPrivate
int GetDistributeCachePort(
const DistributeCacheInfo *server_info)
1175 assert(server_info != (DistributeCacheInfo *) NULL);
1176 assert(server_info->signature == MagickCoreSignature);
1177 return(server_info->port);
1205MagickPrivate MagickBooleanType OpenDistributePixelCache(
1206 DistributeCacheInfo *server_info,Image *image)
1215 message[MagickPathExtent],
1221 assert(server_info != (DistributeCacheInfo *) NULL);
1222 assert(server_info->signature == MagickCoreSignature);
1223 assert(image != (Image *) NULL);
1224 assert(image->signature == MagickCoreSignature);
1230 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1231 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1232 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1233 p+=(ptrdiff_t)
sizeof(image->storage_class);
1234 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1235 p+=(ptrdiff_t)
sizeof(image->colorspace);
1236 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1237 p+=(ptrdiff_t)
sizeof(image->channels);
1238 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1239 p+=(ptrdiff_t)
sizeof(image->columns);
1240 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1241 p+=(ptrdiff_t)
sizeof(image->rows);
1242 count=dpc_send(server_info->file,p-message,message);
1243 if (count != (MagickOffsetType) (p-message))
1244 return(MagickFalse);
1246 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1247 if (count != (MagickOffsetType)
sizeof(status))
1248 return(MagickFalse);
1285MagickPrivate MagickOffsetType ReadDistributePixelCacheIndexes(
1286 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1287 const MagickSizeType length,
unsigned char *indexes)
1293 message[MagickPathExtent],
1299 assert(server_info != (DistributeCacheInfo *) NULL);
1300 assert(server_info->signature == MagickCoreSignature);
1301 assert(region != (RectangleInfo *) NULL);
1302 assert(indexes != (
unsigned char *) NULL);
1303 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1307 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1308 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1309 (void) memcpy(p,®ion->width,
sizeof(region->width));
1310 p+=(ptrdiff_t)
sizeof(region->width);
1311 (void) memcpy(p,®ion->height,
sizeof(region->height));
1312 p+=(ptrdiff_t)
sizeof(region->height);
1313 (void) memcpy(p,®ion->x,
sizeof(region->x));
1314 p+=(ptrdiff_t)
sizeof(region->x);
1315 (void) memcpy(p,®ion->y,
sizeof(region->y));
1316 p+=(ptrdiff_t)
sizeof(region->y);
1317 (void) memcpy(p,&length,
sizeof(length));
1318 p+=(ptrdiff_t)
sizeof(length);
1319 count=dpc_send(server_info->file,p-message,message);
1320 if (count != (MagickOffsetType) (p-message))
1322 return(dpc_read(server_info->file,length,indexes));
1358MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1359 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1360 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1366 message[MagickPathExtent],
1372 assert(server_info != (DistributeCacheInfo *) NULL);
1373 assert(server_info->signature == MagickCoreSignature);
1374 assert(region != (RectangleInfo *) NULL);
1375 assert(pixels != (
unsigned char *) NULL);
1376 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1380 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1381 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1382 (void) memcpy(p,®ion->width,
sizeof(region->width));
1383 p+=(ptrdiff_t)
sizeof(region->width);
1384 (void) memcpy(p,®ion->height,
sizeof(region->height));
1385 p+=(ptrdiff_t)
sizeof(region->height);
1386 (void) memcpy(p,®ion->x,
sizeof(region->x));
1387 p+=(ptrdiff_t)
sizeof(region->x);
1388 (void) memcpy(p,®ion->y,
sizeof(region->y));
1389 p+=(ptrdiff_t)
sizeof(region->y);
1390 (void) memcpy(p,&length,
sizeof(length));
1391 p+=(ptrdiff_t)
sizeof(length);
1392 count=dpc_send(server_info->file,p-message,message);
1393 if (count != (MagickOffsetType) (p-message))
1395 return(dpc_read(server_info->file,length,pixels));
1422MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1423 DistributeCacheInfo *server_info)
1432 message[MagickPathExtent],
1438 assert(server_info != (DistributeCacheInfo *) NULL);
1439 assert(server_info->signature == MagickCoreSignature);
1442 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1443 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1444 count=dpc_send(server_info->file,p-message,message);
1445 if (count != (MagickOffsetType) (p-message))
1446 return(MagickFalse);
1448 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1449 if (count != (MagickOffsetType)
sizeof(status))
1450 return(MagickFalse);
1487MagickPrivate MagickOffsetType WriteDistributePixelCacheIndexes(
1488 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1489 const MagickSizeType length,
const unsigned char *indexes)
1495 message[MagickPathExtent],
1501 assert(server_info != (DistributeCacheInfo *) NULL);
1502 assert(server_info->signature == MagickCoreSignature);
1503 assert(region != (RectangleInfo *) NULL);
1504 assert(indexes != (
unsigned char *) NULL);
1505 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1509 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1510 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1511 (void) memcpy(p,®ion->width,
sizeof(region->width));
1512 p+=(ptrdiff_t)
sizeof(region->width);
1513 (void) memcpy(p,®ion->height,
sizeof(region->height));
1514 p+=(ptrdiff_t)
sizeof(region->height);
1515 (void) memcpy(p,®ion->x,
sizeof(region->x));
1516 p+=(ptrdiff_t)
sizeof(region->x);
1517 (void) memcpy(p,®ion->y,
sizeof(region->y));
1518 p+=(ptrdiff_t)
sizeof(region->y);
1519 (void) memcpy(p,&length,
sizeof(length));
1520 p+=(ptrdiff_t)
sizeof(length);
1521 count=dpc_send(server_info->file,p-message,message);
1522 if (count != (MagickOffsetType) (p-message))
1524 return(dpc_send(server_info->file,length,indexes));
1561MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1562 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1563 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1569 message[MagickPathExtent],
1575 assert(server_info != (DistributeCacheInfo *) NULL);
1576 assert(server_info->signature == MagickCoreSignature);
1577 assert(region != (RectangleInfo *) NULL);
1578 assert(pixels != (
const unsigned char *) NULL);
1579 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1583 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1584 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1585 (void) memcpy(p,®ion->width,
sizeof(region->width));
1586 p+=(ptrdiff_t)
sizeof(region->width);
1587 (void) memcpy(p,®ion->height,
sizeof(region->height));
1588 p+=(ptrdiff_t)
sizeof(region->height);
1589 (void) memcpy(p,®ion->x,
sizeof(region->x));
1590 p+=(ptrdiff_t)
sizeof(region->x);
1591 (void) memcpy(p,®ion->y,
sizeof(region->y));
1592 p+=(ptrdiff_t)
sizeof(region->y);
1593 (void) memcpy(p,&length,
sizeof(length));
1594 p+=(ptrdiff_t)
sizeof(length);
1595 count=dpc_send(server_info->file,p-message,message);
1596 if (count != (MagickOffsetType) (p-message))
1598 return(dpc_send(server_info->file,length,pixels));