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,
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");
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);
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);
391 assert(server_info->signature == MagickCoreSignature);
392 if (server_info->file > 0)
393 CLOSE_SOCKET(server_info->file);
394 server_info->signature=(~MagickCoreSignature);
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 MagickBooleanType OpenDistributeCache(
SplayTreeInfo *registry,
int file,
476 key = (MagickAddressType) session_key;
488 message[MagickPathExtent],
495 if (image == (
Image *) NULL)
497 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
498 sizeof(image->channels)+
sizeof(image->columns)+
sizeof(image->rows);
499 count=dpc_read(file,length,message);
500 if (count != (MagickOffsetType) length)
506 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
507 p+=(ptrdiff_t)
sizeof(image->storage_class);
508 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
509 p+=(ptrdiff_t)
sizeof(image->colorspace);
510 (void) memcpy(&image->channels,p,
sizeof(image->channels));
511 p+=(ptrdiff_t)
sizeof(image->channels);
512 (void) memcpy(&image->columns,p,
sizeof(image->columns));
513 p+=(ptrdiff_t)
sizeof(image->columns);
514 (void) memcpy(&image->rows,p,
sizeof(image->rows));
515 p+=(ptrdiff_t)
sizeof(image->rows);
516 if (SyncImagePixelCache(image,exception) == MagickFalse)
518 status=AddValueToSplayTree(registry,(
const void *) key,image);
522static MagickBooleanType ReadDistributeCacheIndexes(
SplayTreeInfo *registry,
535 key = (MagickAddressType) session_key;
547 message[MagickPathExtent],
553 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
554 if (image == (
Image *) NULL)
556 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
557 sizeof(region.y)+
sizeof(length);
558 count=dpc_read(file,length,message);
559 if (count != (MagickOffsetType) length)
562 (void) memcpy(®ion.width,q,
sizeof(region.width));
563 q+=(ptrdiff_t)
sizeof(region.width);
564 (void) memcpy(®ion.height,q,
sizeof(region.height));
565 q+=(ptrdiff_t)
sizeof(region.height);
566 (void) memcpy(®ion.x,q,
sizeof(region.x));
567 q+=(ptrdiff_t)
sizeof(region.x);
568 (void) memcpy(®ion.y,q,
sizeof(region.y));
569 q+=(ptrdiff_t)
sizeof(region.y);
570 (void) memcpy(&length,q,
sizeof(length));
571 q+=(ptrdiff_t)
sizeof(length);
572 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
576 indexes=GetVirtualIndexQueue(image);
577 count=dpc_send(file,length,indexes);
578 if (count != (MagickOffsetType) length)
583static MagickBooleanType ReadDistributeCachePixels(
SplayTreeInfo *registry,
593 key = (MagickAddressType) session_key;
605 message[MagickPathExtent],
611 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
612 if (image == (
Image *) NULL)
614 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
615 sizeof(region.y)+
sizeof(length);
616 count=dpc_read(file,length,message);
617 if (count != (MagickOffsetType) length)
620 (void) memcpy(®ion.width,q,
sizeof(region.width));
621 q+=(ptrdiff_t)
sizeof(region.width);
622 (void) memcpy(®ion.height,q,
sizeof(region.height));
623 q+=(ptrdiff_t)
sizeof(region.height);
624 (void) memcpy(®ion.x,q,
sizeof(region.x));
625 q+=(ptrdiff_t)
sizeof(region.x);
626 (void) memcpy(®ion.y,q,
sizeof(region.y));
627 q+=(ptrdiff_t)
sizeof(region.y);
628 (void) memcpy(&length,q,
sizeof(length));
629 q+=(ptrdiff_t)
sizeof(length);
630 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
634 count=dpc_send(file,length,p);
635 if (count != (MagickOffsetType) length)
640static void *RelinquishImageRegistry(
void *image)
642 return((
void *) DestroyImageList((
Image *) image));
645static MagickBooleanType WriteDistributeCacheIndexes(
SplayTreeInfo *registry,
655 key = (MagickAddressType) session_key;
669 message[MagickPathExtent],
675 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
676 if (image == (
Image *) NULL)
678 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
679 sizeof(region.y)+
sizeof(length);
680 count=dpc_read(file,length,message);
681 if (count != (MagickOffsetType) length)
684 (void) memcpy(®ion.width,p,
sizeof(region.width));
685 p+=(ptrdiff_t)
sizeof(region.width);
686 (void) memcpy(®ion.height,p,
sizeof(region.height));
687 p+=(ptrdiff_t)
sizeof(region.height);
688 (void) memcpy(®ion.x,p,
sizeof(region.x));
689 p+=(ptrdiff_t)
sizeof(region.x);
690 (void) memcpy(®ion.y,p,
sizeof(region.y));
691 p+=(ptrdiff_t)
sizeof(region.y);
692 (void) memcpy(&length,p,
sizeof(length));
693 p+=(ptrdiff_t)
sizeof(length);
694 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
698 indexes=GetAuthenticIndexQueue(image);
699 count=dpc_read(file,length,(
unsigned char *) indexes);
700 if (count != (MagickOffsetType) length)
702 return(SyncAuthenticPixels(image,exception));
705static MagickBooleanType WriteDistributeCachePixels(
SplayTreeInfo *registry,
712 key = (MagickAddressType) session_key;
727 message[MagickPathExtent],
733 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
734 if (image == (
Image *) NULL)
736 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
737 sizeof(region.y)+
sizeof(length);
738 count=dpc_read(file,length,message);
739 if (count != (MagickOffsetType) length)
742 (void) memcpy(®ion.width,p,
sizeof(region.width));
743 p+=(ptrdiff_t)
sizeof(region.width);
744 (void) memcpy(®ion.height,p,
sizeof(region.height));
745 p+=(ptrdiff_t)
sizeof(region.height);
746 (void) memcpy(®ion.x,p,
sizeof(region.x));
747 p+=(ptrdiff_t)
sizeof(region.x);
748 (void) memcpy(®ion.y,p,
sizeof(region.y));
749 p+=(ptrdiff_t)
sizeof(region.y);
750 (void) memcpy(&length,p,
sizeof(length));
751 p+=(ptrdiff_t)
sizeof(length);
752 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
756 count=dpc_read(file,length,(
unsigned char *) q);
757 if (count != (MagickOffsetType) length)
759 return(SyncAuthenticPixels(image,exception));
762static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket)
771 status = MagickFalse;
795 shared_secret=GetPolicyValue(
"cache:shared-secret");
796 if (shared_secret == (
char *) NULL)
797 ThrowFatalException(CacheFatalError,
"shared secret required");
798 nonce=StringToStringInfo(shared_secret);
799 shared_secret=DestroyString(shared_secret);
800 session_key=GetMagickCoreSignature(nonce);
801 nonce=DestroyStringInfo(nonce);
802 exception=AcquireExceptionInfo();
806 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
807 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
808 client_socket=(*(SOCKET_TYPE *) socket);
809 count=dpc_send(client_socket,
sizeof(session_key),&session_key);
810 for (status=MagickFalse; ; )
812 count=dpc_read(client_socket,1,(
unsigned char *) &command);
815 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
816 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
822 status=OpenDistributeCache(registry,client_socket,session_key,
824 count=dpc_send(client_socket,
sizeof(status),&status);
829 status=ReadDistributeCachePixels(registry,client_socket,session_key,
835 status=ReadDistributeCacheIndexes(registry,client_socket,
836 session_key,exception);
841 status=WriteDistributeCachePixels(registry,client_socket,session_key,
847 status=WriteDistributeCacheIndexes(registry,client_socket,
848 session_key,exception);
853 status=DestroyDistributeCache(registry,session_key);
859 if (status == MagickFalse)
864 count=dpc_send(client_socket,
sizeof(status),&status);
865 CLOSE_SOCKET(client_socket);
866 exception=DestroyExceptionInfo(exception);
867 registry=DestroySplayTree(registry);
868 return(HANDLER_RETURN_VALUE);
871MagickExport
void DistributePixelCacheServer(
const int port,
874#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
876 service[MagickPathExtent];
881#if defined(MAGICKCORE_THREAD_SUPPORT)
887#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
911 assert(exception->signature == MagickCoreSignature);
912 magick_unreferenced(exception);
913#if defined(MAGICKCORE_WINDOWS_SUPPORT)
914 NTInitializeWinsock(MagickFalse);
916 (void) memset(&hint,0,
sizeof(hint));
917 hint.ai_family=AF_INET;
918 hint.ai_socktype=SOCK_STREAM;
919 hint.ai_flags=AI_PASSIVE;
920 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
921 status=getaddrinfo((
const char *) NULL,service,&hint,&result);
923 ThrowFatalException(CacheFatalError,
"UnableToListen");
924 server_socket=(SOCKET_TYPE) 0;
925 for (p=result; p != (
struct addrinfo *) NULL; p=p->ai_next)
930 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
931 if (server_socket == -1)
934 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(
char *) &one,
935 (socklen_t)
sizeof(one));
938 CLOSE_SOCKET(server_socket);
941 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
944 CLOSE_SOCKET(server_socket);
949 if (p == (
struct addrinfo *) NULL)
950 ThrowFatalException(CacheFatalError,
"UnableToBind");
951 freeaddrinfo(result);
952 status=listen(server_socket,DPCPendingConnections);
954 ThrowFatalException(CacheFatalError,
"UnableToListen");
955#if defined(MAGICKCORE_THREAD_SUPPORT)
956 pthread_attr_init(&attributes);
966 length=(socklen_t)
sizeof(address);
967 client_socket=accept(server_socket,(
struct sockaddr *) &address,&length);
968 if (client_socket == -1)
969 ThrowFatalException(CacheFatalError,
"UnableToEstablishConnection");
970#if defined(MAGICKCORE_THREAD_SUPPORT)
971 status=pthread_create(&threads,&attributes,DistributePixelCacheClient,
972 (
void *) &client_socket);
974 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
975#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
976 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) &client_socket,0,&threadID) == (HANDLE) NULL)
977 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
983 magick_unreferenced(port);
984 magick_unreferenced(exception);
985 ThrowFatalException(MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn");
1015 assert(server_info->signature == MagickCoreSignature);
1016 return(server_info->file);
1043MagickPrivate
const char *GetDistributeCacheHostname(
1047 assert(server_info->signature == MagickCoreSignature);
1048 return(server_info->hostname);
1077 assert(server_info->signature == MagickCoreSignature);
1078 return(server_info->port);
1106MagickPrivate MagickBooleanType OpenDistributePixelCache(
1116 message[MagickPathExtent],
1123 assert(server_info->signature == MagickCoreSignature);
1124 assert(image != (
Image *) NULL);
1125 assert(image->signature == MagickCoreSignature);
1131 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1132 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1133 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1134 p+=(ptrdiff_t)
sizeof(image->storage_class);
1135 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1136 p+=(ptrdiff_t)
sizeof(image->colorspace);
1137 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1138 p+=(ptrdiff_t)
sizeof(image->channels);
1139 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1140 p+=(ptrdiff_t)
sizeof(image->columns);
1141 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1142 p+=(ptrdiff_t)
sizeof(image->rows);
1143 count=dpc_send(server_info->file,p-message,message);
1144 if (count != (MagickOffsetType) (p-message))
1145 return(MagickFalse);
1147 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1148 if (count != (MagickOffsetType)
sizeof(status))
1149 return(MagickFalse);
1186MagickPrivate MagickOffsetType ReadDistributePixelCacheIndexes(
1188 const MagickSizeType length,
unsigned char *indexes)
1194 message[MagickPathExtent],
1201 assert(server_info->signature == MagickCoreSignature);
1203 assert(indexes != (
unsigned char *) NULL);
1204 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1208 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1209 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1210 (void) memcpy(p,®ion->width,
sizeof(region->width));
1211 p+=(ptrdiff_t)
sizeof(region->width);
1212 (void) memcpy(p,®ion->height,
sizeof(region->height));
1213 p+=(ptrdiff_t)
sizeof(region->height);
1214 (void) memcpy(p,®ion->x,
sizeof(region->x));
1215 p+=(ptrdiff_t)
sizeof(region->x);
1216 (void) memcpy(p,®ion->y,
sizeof(region->y));
1217 p+=(ptrdiff_t)
sizeof(region->y);
1218 (void) memcpy(p,&length,
sizeof(length));
1219 p+=(ptrdiff_t)
sizeof(length);
1220 count=dpc_send(server_info->file,p-message,message);
1221 if (count != (MagickOffsetType) (p-message))
1223 return(dpc_read(server_info->file,length,indexes));
1259MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1261 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1267 message[MagickPathExtent],
1274 assert(server_info->signature == MagickCoreSignature);
1276 assert(pixels != (
unsigned char *) NULL);
1277 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1281 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1282 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1283 (void) memcpy(p,®ion->width,
sizeof(region->width));
1284 p+=(ptrdiff_t)
sizeof(region->width);
1285 (void) memcpy(p,®ion->height,
sizeof(region->height));
1286 p+=(ptrdiff_t)
sizeof(region->height);
1287 (void) memcpy(p,®ion->x,
sizeof(region->x));
1288 p+=(ptrdiff_t)
sizeof(region->x);
1289 (void) memcpy(p,®ion->y,
sizeof(region->y));
1290 p+=(ptrdiff_t)
sizeof(region->y);
1291 (void) memcpy(p,&length,
sizeof(length));
1292 p+=(ptrdiff_t)
sizeof(length);
1293 count=dpc_send(server_info->file,p-message,message);
1294 if (count != (MagickOffsetType) (p-message))
1296 return(dpc_read(server_info->file,length,pixels));
1323MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1333 message[MagickPathExtent],
1340 assert(server_info->signature == MagickCoreSignature);
1343 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1344 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1345 count=dpc_send(server_info->file,p-message,message);
1346 if (count != (MagickOffsetType) (p-message))
1347 return(MagickFalse);
1349 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1350 if (count != (MagickOffsetType)
sizeof(status))
1351 return(MagickFalse);
1388MagickPrivate MagickOffsetType WriteDistributePixelCacheIndexes(
1390 const MagickSizeType length,
const unsigned char *indexes)
1396 message[MagickPathExtent],
1403 assert(server_info->signature == MagickCoreSignature);
1405 assert(indexes != (
unsigned char *) NULL);
1406 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1410 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1411 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1412 (void) memcpy(p,®ion->width,
sizeof(region->width));
1413 p+=(ptrdiff_t)
sizeof(region->width);
1414 (void) memcpy(p,®ion->height,
sizeof(region->height));
1415 p+=(ptrdiff_t)
sizeof(region->height);
1416 (void) memcpy(p,®ion->x,
sizeof(region->x));
1417 p+=(ptrdiff_t)
sizeof(region->x);
1418 (void) memcpy(p,®ion->y,
sizeof(region->y));
1419 p+=(ptrdiff_t)
sizeof(region->y);
1420 (void) memcpy(p,&length,
sizeof(length));
1421 p+=(ptrdiff_t)
sizeof(length);
1422 count=dpc_send(server_info->file,p-message,message);
1423 if (count != (MagickOffsetType) (p-message))
1425 return(dpc_send(server_info->file,length,indexes));
1462MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1464 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1470 message[MagickPathExtent],
1477 assert(server_info->signature == MagickCoreSignature);
1479 assert(pixels != (
const unsigned char *) NULL);
1480 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1484 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1485 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1486 (void) memcpy(p,®ion->width,
sizeof(region->width));
1487 p+=(ptrdiff_t)
sizeof(region->width);
1488 (void) memcpy(p,®ion->height,
sizeof(region->height));
1489 p+=(ptrdiff_t)
sizeof(region->height);
1490 (void) memcpy(p,®ion->x,
sizeof(region->x));
1491 p+=(ptrdiff_t)
sizeof(region->x);
1492 (void) memcpy(p,®ion->y,
sizeof(region->y));
1493 p+=(ptrdiff_t)
sizeof(region->y);
1494 (void) memcpy(p,&length,
sizeof(length));
1495 p+=(ptrdiff_t)
sizeof(length);
1496 count=dpc_send(server_info->file,p-message,message);
1497 if (count != (MagickOffsetType) (p-message))
1499 return(dpc_send(server_info->file,length,pixels));