54 #include "MagickCore/studio.h"
55 #include "MagickCore/cache.h"
56 #include "MagickCore/cache-private.h"
57 #include "MagickCore/distribute-cache.h"
58 #include "MagickCore/distribute-cache-private.h"
59 #include "MagickCore/exception.h"
60 #include "MagickCore/exception-private.h"
61 #include "MagickCore/geometry.h"
62 #include "MagickCore/image.h"
63 #include "MagickCore/image-private.h"
64 #include "MagickCore/list.h"
65 #include "MagickCore/locale_.h"
66 #include "MagickCore/memory_.h"
67 #include "MagickCore/nt-base-private.h"
68 #include "MagickCore/pixel.h"
69 #include "MagickCore/policy.h"
70 #include "MagickCore/random_.h"
71 #include "MagickCore/registry.h"
72 #include "MagickCore/splay-tree.h"
73 #include "MagickCore/string_.h"
74 #include "MagickCore/string-private.h"
75 #include "MagickCore/version.h"
76 #include "MagickCore/version-private.h"
77 #undef MAGICKCORE_HAVE_DISTRIBUTE_CACHE
78 #if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
79 #include <netinet/in.h>
81 #include <sys/socket.h>
82 #include <arpa/inet.h>
83 #define CHAR_TYPE_CAST
84 #define CLOSE_SOCKET(socket) (void) close(socket)
85 #define HANDLER_RETURN_TYPE void *
86 #define HANDLER_RETURN_VALUE (void *) NULL
87 #define SOCKET_TYPE int
88 #define LENGTH_TYPE size_t
89 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
90 #elif defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__)
91 #define CHAR_TYPE_CAST (char *)
92 #define CLOSE_SOCKET(socket) (void) closesocket(socket)
93 #define HANDLER_RETURN_TYPE DWORD WINAPI
94 #define HANDLER_RETURN_VALUE 0
95 #define SOCKET_TYPE SOCKET
96 #define LENGTH_TYPE int
97 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
100 #define CLOSE_SOCKET(socket) (void) close(socket)
102 #define CLOSE_SOCKET(socket)
104 #define HANDLER_RETURN_TYPE void *
105 #define HANDLER_RETURN_VALUE (void *) NULL
106 #define SOCKET_TYPE int
109 #define send(file,buffer,length,flags) 0
110 #define recv(file,buffer,length,flags) 0
116 #define DPCHostname "127.0.0.1"
117 #define DPCPendingConnections 10
119 #define DPCSessionKeyLength 8
121 # define MSG_NOSIGNAL 0
147 static inline MagickOffsetType dpc_read(
int file,
const MagickSizeType length,
148 unsigned char *magick_restrict message)
156 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
157 magick_unreferenced(file);
158 magick_unreferenced(message);
161 for (i=0; i < (MagickOffsetType) length; i+=count)
163 count=recv(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE) MagickMin(length-i,
164 (MagickSizeType) MAGICK_SSIZE_MAX),0);
175 static int ConnectPixelCacheServer(
const char *hostname,
const int port,
178 #if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
180 service[MagickPathExtent],
203 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
204 NTInitializeWinsock(MagickTrue);
206 (void) memset(&hint,0,
sizeof(hint));
207 hint.ai_family=AF_INET;
208 hint.ai_socktype=SOCK_STREAM;
209 hint.ai_flags=AI_PASSIVE;
210 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
211 status=getaddrinfo(hostname,service,&hint,&result);
214 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
215 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
218 client_socket=socket(result->ai_family,result->ai_socktype,
219 result->ai_protocol);
220 if (client_socket == -1)
222 freeaddrinfo(result);
223 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
224 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
227 status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen);
228 freeaddrinfo(result);
231 CLOSE_SOCKET(client_socket);
232 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
233 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
236 count=recv(client_socket,CHAR_TYPE_CAST session_key,
sizeof(session_key),0);
239 CLOSE_SOCKET(client_socket);
240 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
241 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
247 shared_secret=GetPolicyValue(
"cache:shared-secret");
248 if (shared_secret == (
char *) NULL)
250 CLOSE_SOCKET(client_socket);
251 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
252 "DistributedPixelCache",
"'%s': shared secret required",hostname);
255 nonce=StringToStringInfo(shared_secret);
256 if (GetMagickSignature(nonce) != *session_key)
258 CLOSE_SOCKET(client_socket);
259 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
260 "DistributedPixelCache",
"'%s' authentication failed",hostname);
263 shared_secret=DestroyString(shared_secret);
264 nonce=DestroyStringInfo(nonce);
265 return(client_socket);
267 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
268 "DelegateLibrarySupportNotBuiltIn",
"distributed pixel cache");
292 hosts=(
char *) GetImageRegistry(StringRegistryType,
"cache:hosts",exception);
293 if (hosts == (
char *) NULL)
296 return(AcquireString(DPCHostname));
298 (void) SubstituteString(&hosts,
",",
" ");
299 hostlist=StringToArgv(hosts,&argc);
300 hosts=DestroyString(hosts);
301 if (hostlist == (
char **) NULL)
304 return(AcquireString(DPCHostname));
306 hosts=AcquireString(hostlist[(
id++ % (argc-1))+1]);
307 for (i=0; i < (ssize_t) argc; i++)
308 hostlist[i]=DestroyString(hostlist[i]);
309 hostlist=(
char **) RelinquishMagickMemory(hostlist);
310 (void) SubstituteString(&hosts,
":",
" ");
311 hostlist=StringToArgv(hosts,&argc);
312 if (hostlist == (
char **) NULL)
315 return(AcquireString(DPCHostname));
317 host=AcquireString(hostlist[1]);
318 if (hostlist[2] == (
char *) NULL)
321 *port=StringToLong(hostlist[2]);
322 for (i=0; i < (ssize_t) argc; i++)
323 hostlist[i]=DestroyString(hostlist[i]);
324 hostlist=(
char **) RelinquishMagickMemory(hostlist);
344 sizeof(*server_info));
345 (void) memset(server_info,0,
sizeof(*server_info));
346 server_info->signature=MagickCoreSignature;
348 hostname=GetHostname(&server_info->port,exception);
350 server_info->file=ConnectPixelCacheServer(hostname,server_info->port,
351 &session_key,exception);
352 if (server_info->file == -1)
353 server_info=DestroyDistributeCacheInfo(server_info);
356 server_info->session_key=session_key;
357 (void) CopyMagickString(server_info->hostname,hostname,MagickPathExtent);
358 server_info->debug=(GetLogEventMask() & CacheEvent) != 0 ? MagickTrue :
361 hostname=DestroyString(hostname);
393 assert(server_info->signature == MagickCoreSignature);
394 if (server_info->file > 0)
395 CLOSE_SOCKET(server_info->file);
396 server_info->signature=(~MagickCoreSignature);
427 static inline MagickOffsetType dpc_send(
int file,
const MagickSizeType length,
428 const void *magick_restrict message)
434 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
435 magick_unreferenced(file);
436 magick_unreferenced(message);
443 for (i=0; i < (MagickOffsetType) length; i+=count)
445 count=(MagickOffsetType) send(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE)
446 MagickMin(length-i,(MagickSizeType) MAGICK_SSIZE_MAX),MSG_NOSIGNAL);
457 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
458 MagickExport
void DistributePixelCacheServer(
const int port,
461 magick_unreferenced(port);
462 ThrowFatalException(MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn");
465 static MagickBooleanType DestroyDistributeCache(
SplayTreeInfo *registry,
466 const size_t session_key)
469 key = (MagickAddressType) session_key;
474 return(DeleteNodeFromSplayTree(registry,(
const void *) key));
477 static MagickBooleanType OpenDistributeCache(
SplayTreeInfo *registry,
int file,
484 key = (MagickAddressType) session_key;
496 message[MagickPathExtent],
502 image=AcquireImage((
ImageInfo *) NULL,exception);
503 if (image == (
Image *) NULL)
505 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
506 sizeof(image->alpha_trait)+
sizeof(image->channels)+
sizeof(image->columns)+
507 sizeof(image->rows)+
sizeof(image->number_channels)+MaxPixelChannels*
508 sizeof(*image->channel_map)+
sizeof(image->metacontent_extent);
509 count=dpc_read(file,length,message);
510 if (count != (MagickOffsetType) length)
516 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
517 p+=
sizeof(image->storage_class);
518 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
519 p+=
sizeof(image->colorspace);
520 (void) memcpy(&image->alpha_trait,p,
sizeof(image->alpha_trait));
521 p+=
sizeof(image->alpha_trait);
522 (void) memcpy(&image->channels,p,
sizeof(image->channels));
523 p+=
sizeof(image->channels);
524 (void) memcpy(&image->columns,p,
sizeof(image->columns));
525 p+=
sizeof(image->columns);
526 (void) memcpy(&image->rows,p,
sizeof(image->rows));
527 p+=
sizeof(image->rows);
528 (void) memcpy(&image->number_channels,p,
sizeof(image->number_channels));
529 p+=
sizeof(image->number_channels);
530 (void) memcpy(image->channel_map,p,MaxPixelChannels*
531 sizeof(*image->channel_map));
532 p+=MaxPixelChannels*
sizeof(*image->channel_map);
533 (void) memcpy(&image->metacontent_extent,p,
sizeof(image->metacontent_extent));
534 p+=
sizeof(image->metacontent_extent);
535 if (SyncImagePixelCache(image,exception) == MagickFalse)
537 status=AddValueToSplayTree(registry,(
const void *) key,image);
541 static MagickBooleanType ReadDistributeCacheMetacontent(
SplayTreeInfo *registry,
554 key = (MagickAddressType) session_key;
566 message[MagickPathExtent],
572 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
573 if (image == (
Image *) NULL)
575 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
576 sizeof(region.y)+
sizeof(length);
577 count=dpc_read(file,length,message);
578 if (count != (MagickOffsetType) length)
581 (void) memcpy(®ion.width,q,
sizeof(region.width));
582 q+=
sizeof(region.width);
583 (void) memcpy(®ion.height,q,
sizeof(region.height));
584 q+=
sizeof(region.height);
585 (void) memcpy(®ion.x,q,
sizeof(region.x));
587 (void) memcpy(®ion.y,q,
sizeof(region.y));
589 (void) memcpy(&length,q,
sizeof(length));
591 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
593 if (p == (
const Quantum *) NULL)
595 metacontent=(
const unsigned char *) GetVirtualMetacontent(image);
596 count=dpc_send(file,length,metacontent);
597 if (count != (MagickOffsetType) length)
602 static MagickBooleanType ReadDistributeCachePixels(
SplayTreeInfo *registry,
612 key = (MagickAddressType) session_key;
624 message[MagickPathExtent],
630 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
631 if (image == (
Image *) NULL)
633 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
634 sizeof(region.y)+
sizeof(length);
635 count=dpc_read(file,length,message);
636 if (count != (MagickOffsetType) length)
639 (void) memcpy(®ion.width,q,
sizeof(region.width));
640 q+=
sizeof(region.width);
641 (void) memcpy(®ion.height,q,
sizeof(region.height));
642 q+=
sizeof(region.height);
643 (void) memcpy(®ion.x,q,
sizeof(region.x));
645 (void) memcpy(®ion.y,q,
sizeof(region.y));
647 (void) memcpy(&length,q,
sizeof(length));
649 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
651 if (p == (
const Quantum *) NULL)
653 count=dpc_send(file,length,p);
654 if (count != (MagickOffsetType) length)
659 static void *RelinquishImageRegistry(
void *image)
661 return((
void *) DestroyImageList((
Image *) image));
664 static MagickBooleanType WriteDistributeCacheMetacontent(
672 key = (MagickAddressType) session_key;
687 message[MagickPathExtent],
695 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
696 if (image == (
Image *) NULL)
698 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
699 sizeof(region.y)+
sizeof(length);
700 count=dpc_read(file,length,message);
701 if (count != (MagickOffsetType) length)
704 (void) memcpy(®ion.width,p,
sizeof(region.width));
705 p+=
sizeof(region.width);
706 (void) memcpy(®ion.height,p,
sizeof(region.height));
707 p+=
sizeof(region.height);
708 (void) memcpy(®ion.x,p,
sizeof(region.x));
710 (void) memcpy(®ion.y,p,
sizeof(region.y));
712 (void) memcpy(&length,p,
sizeof(length));
714 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
716 if (q == (Quantum *) NULL)
718 metacontent=(
unsigned char *) GetAuthenticMetacontent(image);
719 count=dpc_read(file,length,metacontent);
720 if (count != (MagickOffsetType) length)
722 return(SyncAuthenticPixels(image,exception));
725 static MagickBooleanType WriteDistributeCachePixels(
SplayTreeInfo *registry,
732 key = (MagickAddressType) session_key;
747 message[MagickPathExtent],
753 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
754 if (image == (
Image *) NULL)
756 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
757 sizeof(region.y)+
sizeof(length);
758 count=dpc_read(file,length,message);
759 if (count != (MagickOffsetType) length)
762 (void) memcpy(®ion.width,p,
sizeof(region.width));
763 p+=
sizeof(region.width);
764 (void) memcpy(®ion.height,p,
sizeof(region.height));
765 p+=
sizeof(region.height);
766 (void) memcpy(®ion.x,p,
sizeof(region.x));
768 (void) memcpy(®ion.y,p,
sizeof(region.y));
770 (void) memcpy(&length,p,
sizeof(length));
772 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
774 if (q == (Quantum *) NULL)
776 count=dpc_read(file,length,(
unsigned char *) q);
777 if (count != (MagickOffsetType) length)
779 return(SyncAuthenticPixels(image,exception));
782 static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket)
791 status = MagickFalse;
815 shared_secret=GetPolicyValue(
"cache:shared-secret");
816 if (shared_secret == (
char *) NULL)
817 ThrowFatalException(CacheFatalError,
"shared secret required");
818 nonce=StringToStringInfo(shared_secret);
819 shared_secret=DestroyString(shared_secret);
820 session_key=GetMagickSignature(nonce);
821 nonce=DestroyStringInfo(nonce);
822 exception=AcquireExceptionInfo();
826 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
827 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
828 client_socket=(*(SOCKET_TYPE *) socket);
829 count=dpc_send(client_socket,
sizeof(session_key),&session_key);
830 for (status=MagickFalse; ; )
832 count=dpc_read(client_socket,1,(
unsigned char *) &command);
835 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
836 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
842 status=OpenDistributeCache(registry,client_socket,session_key,
844 count=dpc_send(client_socket,
sizeof(status),&status);
849 status=ReadDistributeCachePixels(registry,client_socket,session_key,
855 status=ReadDistributeCacheMetacontent(registry,client_socket,
856 session_key,exception);
861 status=WriteDistributeCachePixels(registry,client_socket,session_key,
867 status=WriteDistributeCacheMetacontent(registry,client_socket,
868 session_key,exception);
873 status=DestroyDistributeCache(registry,session_key);
879 if (status == MagickFalse)
884 count=dpc_send(client_socket,
sizeof(status),&status);
885 CLOSE_SOCKET(client_socket);
886 exception=DestroyExceptionInfo(exception);
887 registry=DestroySplayTree(registry);
888 return(HANDLER_RETURN_VALUE);
891 MagickExport
void DistributePixelCacheServer(
const int port,
895 service[MagickPathExtent];
900 #if defined(MAGICKCORE_THREAD_SUPPORT)
906 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
930 assert(exception->signature == MagickCoreSignature);
931 magick_unreferenced(exception);
932 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
933 NTInitializeWinsock(MagickFalse);
935 (void) memset(&hint,0,
sizeof(hint));
936 hint.ai_family=AF_INET;
937 hint.ai_socktype=SOCK_STREAM;
938 hint.ai_flags=AI_PASSIVE;
939 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
940 status=getaddrinfo((
const char *) NULL,service,&hint,&result);
942 ThrowFatalException(CacheFatalError,
"UnableToListen");
943 server_socket=(SOCKET_TYPE) 0;
944 for (p=result; p != (
struct addrinfo *) NULL; p=p->ai_next)
949 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
950 if (server_socket == -1)
953 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,
954 CHAR_TYPE_CAST &one,(socklen_t)
sizeof(one));
957 CLOSE_SOCKET(server_socket);
960 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
963 CLOSE_SOCKET(server_socket);
968 if (p == (
struct addrinfo *) NULL)
969 ThrowFatalException(CacheFatalError,
"UnableToBind");
970 freeaddrinfo(result);
971 status=listen(server_socket,DPCPendingConnections);
973 ThrowFatalException(CacheFatalError,
"UnableToListen");
974 #if defined(MAGICKCORE_THREAD_SUPPORT)
975 pthread_attr_init(&attributes);
985 length=(socklen_t)
sizeof(address);
986 client_socket=accept(server_socket,(
struct sockaddr *) &address,&length);
987 if (client_socket == -1)
988 ThrowFatalException(CacheFatalError,
"UnableToEstablishConnection");
989 #if defined(MAGICKCORE_THREAD_SUPPORT)
990 status=pthread_create(&threads,&attributes,DistributePixelCacheClient,
991 (
void *) &client_socket);
993 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
994 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
995 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) &client_socket,0,&threadID) == (HANDLE) NULL)
996 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1030 assert(server_info->signature == MagickCoreSignature);
1031 return(server_info->file);
1058 MagickPrivate
const char *GetDistributeCacheHostname(
1062 assert(server_info->signature == MagickCoreSignature);
1063 return(server_info->hostname);
1092 assert(server_info->signature == MagickCoreSignature);
1093 return(server_info->port);
1121 MagickPrivate MagickBooleanType OpenDistributePixelCache(
1131 message[MagickPathExtent],
1138 assert(server_info->signature == MagickCoreSignature);
1139 assert(image != (
Image *) NULL);
1140 assert(image->signature == MagickCoreSignature);
1146 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1147 p+=
sizeof(server_info->session_key);
1148 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1149 p+=
sizeof(image->storage_class);
1150 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1151 p+=
sizeof(image->colorspace);
1152 (void) memcpy(p,&image->alpha_trait,
sizeof(image->alpha_trait));
1153 p+=
sizeof(image->alpha_trait);
1154 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1155 p+=
sizeof(image->channels);
1156 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1157 p+=
sizeof(image->columns);
1158 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1159 p+=
sizeof(image->rows);
1160 (void) memcpy(p,&image->number_channels,
sizeof(image->number_channels));
1161 p+=
sizeof(image->number_channels);
1162 (void) memcpy(p,image->channel_map,MaxPixelChannels*
1163 sizeof(*image->channel_map));
1164 p+=MaxPixelChannels*
sizeof(*image->channel_map);
1165 (void) memcpy(p,&image->metacontent_extent,
sizeof(image->metacontent_extent));
1166 p+=
sizeof(image->metacontent_extent);
1167 count=dpc_send(server_info->file,p-message,message);
1168 if (count != (MagickOffsetType) (p-message))
1169 return(MagickFalse);
1171 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1172 if (count != (MagickOffsetType)
sizeof(status))
1173 return(MagickFalse);
1210 MagickPrivate MagickOffsetType ReadDistributePixelCacheMetacontent(
1212 const MagickSizeType length,
unsigned char *metacontent)
1218 message[MagickPathExtent],
1225 assert(server_info->signature == MagickCoreSignature);
1227 assert(metacontent != (
unsigned char *) NULL);
1228 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1232 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1233 p+=
sizeof(server_info->session_key);
1234 (void) memcpy(p,®ion->width,
sizeof(region->width));
1235 p+=
sizeof(region->width);
1236 (void) memcpy(p,®ion->height,
sizeof(region->height));
1237 p+=
sizeof(region->height);
1238 (void) memcpy(p,®ion->x,
sizeof(region->x));
1239 p+=
sizeof(region->x);
1240 (void) memcpy(p,®ion->y,
sizeof(region->y));
1241 p+=
sizeof(region->y);
1242 (void) memcpy(p,&length,
sizeof(length));
1244 count=dpc_send(server_info->file,p-message,message);
1245 if (count != (MagickOffsetType) (p-message))
1247 return(dpc_read(server_info->file,length,metacontent));
1283 MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1285 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1291 message[MagickPathExtent],
1298 assert(server_info->signature == MagickCoreSignature);
1300 assert(pixels != (
unsigned char *) NULL);
1301 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1305 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1306 p+=
sizeof(server_info->session_key);
1307 (void) memcpy(p,®ion->width,
sizeof(region->width));
1308 p+=
sizeof(region->width);
1309 (void) memcpy(p,®ion->height,
sizeof(region->height));
1310 p+=
sizeof(region->height);
1311 (void) memcpy(p,®ion->x,
sizeof(region->x));
1312 p+=
sizeof(region->x);
1313 (void) memcpy(p,®ion->y,
sizeof(region->y));
1314 p+=
sizeof(region->y);
1315 (void) memcpy(p,&length,
sizeof(length));
1317 count=dpc_send(server_info->file,p-message,message);
1318 if (count != (MagickOffsetType) (p-message))
1320 return(dpc_read(server_info->file,length,pixels));
1347 MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1357 message[MagickPathExtent],
1364 assert(server_info->signature == MagickCoreSignature);
1367 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1368 p+=
sizeof(server_info->session_key);
1369 count=dpc_send(server_info->file,p-message,message);
1370 if (count != (MagickOffsetType) (p-message))
1371 return(MagickFalse);
1373 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1374 if (count != (MagickOffsetType)
sizeof(status))
1375 return(MagickFalse);
1412 MagickPrivate MagickOffsetType WriteDistributePixelCacheMetacontent(
1414 const MagickSizeType length,
const unsigned char *metacontent)
1420 message[MagickPathExtent],
1427 assert(server_info->signature == MagickCoreSignature);
1429 assert(metacontent != (
unsigned char *) NULL);
1430 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1434 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1435 p+=
sizeof(server_info->session_key);
1436 (void) memcpy(p,®ion->width,
sizeof(region->width));
1437 p+=
sizeof(region->width);
1438 (void) memcpy(p,®ion->height,
sizeof(region->height));
1439 p+=
sizeof(region->height);
1440 (void) memcpy(p,®ion->x,
sizeof(region->x));
1441 p+=
sizeof(region->x);
1442 (void) memcpy(p,®ion->y,
sizeof(region->y));
1443 p+=
sizeof(region->y);
1444 (void) memcpy(p,&length,
sizeof(length));
1446 count=dpc_send(server_info->file,p-message,message);
1447 if (count != (MagickOffsetType) (p-message))
1449 return(dpc_send(server_info->file,length,metacontent));
1486 MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1488 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1494 message[MagickPathExtent],
1501 assert(server_info->signature == MagickCoreSignature);
1503 assert(pixels != (
const unsigned char *) NULL);
1504 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1508 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1509 p+=
sizeof(server_info->session_key);
1510 (void) memcpy(p,®ion->width,
sizeof(region->width));
1511 p+=
sizeof(region->width);
1512 (void) memcpy(p,®ion->height,
sizeof(region->height));
1513 p+=
sizeof(region->height);
1514 (void) memcpy(p,®ion->x,
sizeof(region->x));
1515 p+=
sizeof(region->x);
1516 (void) memcpy(p,®ion->y,
sizeof(region->y));
1517 p+=
sizeof(region->y);
1518 (void) memcpy(p,&length,
sizeof(length));
1520 count=dpc_send(server_info->file,p-message,message);
1521 if (count != (MagickOffsetType) (p-message))
1523 return(dpc_send(server_info->file,length,pixels));