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/utility-private.h"
76#include "MagickCore/version.h"
77#include "MagickCore/version-private.h"
78#undef MAGICKCORE_HAVE_DISTRIBUTE_CACHE
79#if defined(MAGICKCORE_DPC_SUPPORT)
80#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
81#include <netinet/in.h>
83#include <sys/socket.h>
85#define CLOSE_SOCKET(socket) (void) close_utf8(socket)
86#define HANDLER_RETURN_TYPE void *
87#define HANDLER_RETURN_VALUE (void *) NULL
88#define SOCKET_TYPE int
89#define LENGTH_TYPE size_t
90#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
91#elif defined(_MSC_VER)
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
98#define MAGICKCORE_HAVE_WINSOCK2 1
105#define DPCHostname "127.0.0.1"
106#define DPCPendingConnections 10
108#define DPCSessionKeyLength 8
110# define MSG_NOSIGNAL 0
116#ifdef MAGICKCORE_HAVE_WINSOCK2
121 *wsaData = (WSADATA*) NULL;
147#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
148static inline MagickOffsetType dpc_read(
int magick_unused(file),
149 const MagickSizeType magick_unused(length),
150 unsigned char *magick_restrict magick_unused(message))
152 magick_unreferenced(file);
153 magick_unreferenced(length);
154 magick_unreferenced(message);
158static inline MagickOffsetType dpc_read(
int file,
const MagickSizeType length,
159 unsigned char *magick_restrict message)
168 for (i=0; i < (MagickOffsetType) length; i+=count)
170 count=recv(file,(
char *) message+i,(LENGTH_TYPE) MagickMin(length-
171 (MagickSizeType) i,(MagickSizeType) MagickMaxBufferExtent),0);
183#if defined(MAGICKCORE_HAVE_WINSOCK2)
184static void InitializeWinsock2(MagickBooleanType use_lock)
186 if (use_lock != MagickFalse)
189 ActivateSemaphoreInfo(&winsock2_semaphore);
190 LockSemaphoreInfo(winsock2_semaphore);
192 if (wsaData == (WSADATA *) NULL)
194 wsaData=(WSADATA *) AcquireMagickMemory(
sizeof(WSADATA));
195 if (WSAStartup(MAKEWORD(2,2),wsaData) != 0)
196 ThrowFatalException(CacheFatalError,
"WSAStartup failed");
198 if (use_lock != MagickFalse)
199 UnlockSemaphoreInfo(winsock2_semaphore);
203#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
204static int ConnectPixelCacheServer(
const char *magick_unused(hostname),
205 const int magick_unused(port),
size_t *magick_unused(session_key),
208 magick_unreferenced(hostname);
209 magick_unreferenced(port);
210 magick_unreferenced(session_key);
211 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
212 "DelegateLibrarySupportNotBuiltIn",
"distributed pixel cache");
216static int ConnectPixelCacheServer(
const char *hostname,
const int port,
220 service[MagickPathExtent],
243#if defined(MAGICKCORE_HAVE_WINSOCK2)
244 InitializeWinsock2(MagickTrue);
246 (void) memset(&hint,0,
sizeof(hint));
247 hint.ai_family=AF_INET;
248 hint.ai_socktype=SOCK_STREAM;
249 hint.ai_flags=AI_PASSIVE;
250 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
251 status=getaddrinfo(hostname,service,&hint,&result);
254 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
255 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
258 client_socket=socket(result->ai_family,result->ai_socktype,
259 result->ai_protocol);
260 if (client_socket == -1)
262 freeaddrinfo(result);
263 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
264 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
267 status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen);
268 freeaddrinfo(result);
271 CLOSE_SOCKET(client_socket);
272 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
273 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
276 count=recv(client_socket,(
char *) session_key,
sizeof(*session_key),0);
279 CLOSE_SOCKET(client_socket);
280 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
281 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
287 shared_secret=GetPolicyValue(
"cache:shared-secret");
288 if (shared_secret == (
char *) NULL)
290 CLOSE_SOCKET(client_socket);
291 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
292 "DistributedPixelCache",
"'%s': shared secret required",hostname);
295 nonce=StringToStringInfo(shared_secret);
296 if (GetMagickSignature(nonce) != *session_key)
298 CLOSE_SOCKET(client_socket);
299 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
300 "DistributedPixelCache",
"'%s' authentication failed",hostname);
303 shared_secret=DestroyString(shared_secret);
304 nonce=DestroyStringInfo(nonce);
305 return(client_socket);
328 hosts=(
char *) GetImageRegistry(StringRegistryType,
"cache:hosts",exception);
329 if (hosts == (
char *) NULL)
332 return(AcquireString(DPCHostname));
334 (void) SubstituteString(&hosts,
",",
" ");
335 hostlist=StringToArgv(hosts,&argc);
336 hosts=DestroyString(hosts);
337 if (hostlist == (
char **) NULL)
340 return(AcquireString(DPCHostname));
342 hosts=AcquireString(hostlist[(
id++ % ((
size_t) argc-1))+1]);
343 for (i=0; i < (ssize_t) argc; i++)
344 hostlist[i]=DestroyString(hostlist[i]);
345 hostlist=(
char **) RelinquishMagickMemory(hostlist);
346 (void) SubstituteString(&hosts,
":",
" ");
347 hostlist=StringToArgv(hosts,&argc);
348 if (hostlist == (
char **) NULL)
351 return(AcquireString(DPCHostname));
353 host=AcquireString(hostlist[1]);
354 if (hostlist[2] == (
char *) NULL)
357 *port=StringToLong(hostlist[2]);
358 for (i=0; i < (ssize_t) argc; i++)
359 hostlist[i]=DestroyString(hostlist[i]);
360 hostlist=(
char **) RelinquishMagickMemory(hostlist);
380 sizeof(*server_info));
381 (void) memset(server_info,0,
sizeof(*server_info));
382 server_info->signature=MagickCoreSignature;
384 hostname=GetHostname(&server_info->port,exception);
386 server_info->file=ConnectPixelCacheServer(hostname,server_info->port,
387 &session_key,exception);
388 if (server_info->file == -1)
389 server_info=DestroyDistributeCacheInfo(server_info);
392 server_info->session_key=session_key;
393 (void) CopyMagickString(server_info->hostname,hostname,MagickPathExtent);
394 server_info->debug=(GetLogEventMask() & CacheEvent) != 0 ? MagickTrue :
397 hostname=DestroyString(hostname);
429 assert(server_info->signature == MagickCoreSignature);
430#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
431 if (server_info->file > 0)
432 CLOSE_SOCKET(server_info->file);
434 server_info->signature=(~MagickCoreSignature);
465#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
466static inline MagickOffsetType dpc_send(
int magick_unused(file),
467 const MagickSizeType magick_unused(length),
468 const void *magick_restrict magick_unused(message))
470 magick_unreferenced(file);
471 magick_unreferenced(length);
472 magick_unreferenced(message);
476static inline MagickOffsetType dpc_send(
int file,
const MagickSizeType length,
477 const void *magick_restrict message)
489 for (i=0; i < (MagickOffsetType) length; i+=count)
491 count=(MagickOffsetType) send(file,(
char *) message+i,(LENGTH_TYPE)
492 MagickMin(length-(MagickSizeType) i,(MagickSizeType) MagickMaxBufferExtent),
505#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
506MagickExport
void DistributePixelCacheServer(
const int magick_unused(port),
509 magick_unreferenced(port);
510 magick_unreferenced(exception);
511 ThrowFatalException(MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn");
514static MagickBooleanType DestroyDistributeCache(
SplayTreeInfo *registry,
515 const size_t session_key)
518 key = (MagickAddressType) session_key;
523 return(DeleteNodeFromSplayTree(registry,(
const void *) key));
526static MagickBooleanType OpenDistributeCache(
SplayTreeInfo *registry,
int file,
533 key = (MagickAddressType) session_key;
545 message[MagickPathExtent],
551 image=AcquireImage((
ImageInfo *) NULL,exception);
552 if (image == (
Image *) NULL)
554 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
555 sizeof(image->alpha_trait)+
sizeof(image->channels)+
sizeof(image->columns)+
556 sizeof(image->rows)+
sizeof(image->number_channels)+MaxPixelChannels*
557 sizeof(*image->channel_map)+
sizeof(image->metacontent_extent);
558 count=dpc_read(file,length,message);
559 if (count != (MagickOffsetType) length)
565 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
566 p+=(ptrdiff_t)
sizeof(image->storage_class);
567 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
568 p+=(ptrdiff_t)
sizeof(image->colorspace);
569 (void) memcpy(&image->alpha_trait,p,
sizeof(image->alpha_trait));
570 p+=(ptrdiff_t)
sizeof(image->alpha_trait);
571 (void) memcpy(&image->channels,p,
sizeof(image->channels));
572 p+=(ptrdiff_t)
sizeof(image->channels);
573 (void) memcpy(&image->columns,p,
sizeof(image->columns));
574 p+=(ptrdiff_t)
sizeof(image->columns);
575 (void) memcpy(&image->rows,p,
sizeof(image->rows));
576 p+=(ptrdiff_t)
sizeof(image->rows);
577 (void) memcpy(&image->number_channels,p,
sizeof(image->number_channels));
578 p+=(ptrdiff_t)
sizeof(image->number_channels);
579 (void) memcpy(image->channel_map,p,MaxPixelChannels*
580 sizeof(*image->channel_map));
581 p+=(ptrdiff_t) MaxPixelChannels*
sizeof(*image->channel_map);
582 (void) memcpy(&image->metacontent_extent,p,
sizeof(image->metacontent_extent));
583 p+=(ptrdiff_t)
sizeof(image->metacontent_extent);
584 if (SyncImagePixelCache(image,exception) == MagickFalse)
586 status=AddValueToSplayTree(registry,(
const void *) key,image);
590static inline MagickBooleanType ValidateDistributedPixelCache(
592 const MagickSizeType length)
598 if (HeapOverflowSanityCheckGetSize(region->width,region->height,&pixels) != MagickFalse)
600 if (HeapOverflowSanityCheckGetSize(pixels,per_pixel,&extent) != MagickFalse)
602 if (length > (MagickSizeType) extent)
607static MagickBooleanType ReadDistributeCacheMetacontent(
SplayTreeInfo *registry,
620 key = (MagickAddressType) session_key;
635 message[MagickPathExtent],
641 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
642 if (image == (
Image *) NULL)
644 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
645 sizeof(region.y)+
sizeof(length);
646 count=dpc_read(file,length,message);
647 if (count != (MagickOffsetType) length)
650 (void) memcpy(®ion.width,q,
sizeof(region.width));
651 q+=(ptrdiff_t)
sizeof(region.width);
652 (void) memcpy(®ion.height,q,
sizeof(region.height));
653 q+=(ptrdiff_t)
sizeof(region.height);
654 (void) memcpy(®ion.x,q,
sizeof(region.x));
655 q+=(ptrdiff_t)
sizeof(region.x);
656 (void) memcpy(®ion.y,q,
sizeof(region.y));
657 q+=(ptrdiff_t)
sizeof(region.y);
658 (void) memcpy(&length,q,
sizeof(length));
659 q+=(ptrdiff_t)
sizeof(length);
660 per_pixel=image->number_meta_channels*
sizeof(Quantum);
661 if (ValidateDistributedPixelCache(®ion,per_pixel,length) == MagickFalse)
663 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
665 if (p == (
const Quantum *) NULL)
667 metacontent=(
const unsigned char *) GetVirtualMetacontent(image);
668 count=dpc_send(file,length,metacontent);
669 if (count != (MagickOffsetType) length)
674static MagickBooleanType ReadDistributeCachePixels(
SplayTreeInfo *registry,
684 key = (MagickAddressType) session_key;
699 message[MagickPathExtent],
705 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
706 if (image == (
Image *) NULL)
708 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
709 sizeof(region.y)+
sizeof(length);
710 count=dpc_read(file,length,message);
711 if (count != (MagickOffsetType) length)
714 (void) memcpy(®ion.width,q,
sizeof(region.width));
715 q+=(ptrdiff_t)
sizeof(region.width);
716 (void) memcpy(®ion.height,q,
sizeof(region.height));
717 q+=(ptrdiff_t)
sizeof(region.height);
718 (void) memcpy(®ion.x,q,
sizeof(region.x));
719 q+=(ptrdiff_t)
sizeof(region.x);
720 (void) memcpy(®ion.y,q,
sizeof(region.y));
721 q+=(ptrdiff_t)
sizeof(region.y);
722 (void) memcpy(&length,q,
sizeof(length));
723 per_pixel=image->number_channels*
sizeof(Quantum);
724 if (ValidateDistributedPixelCache(®ion,per_pixel,length) == MagickFalse)
726 q+=(ptrdiff_t)
sizeof(length);
727 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
729 if (p == (
const Quantum *) NULL)
731 count=dpc_send(file,length,p);
732 if (count != (MagickOffsetType) length)
737static void *RelinquishImageRegistry(
void *image)
739 return((
void *) DestroyImageList((
Image *) image));
742static MagickBooleanType WriteDistributeCacheMetacontent(
750 key = (MagickAddressType) session_key;
766 message[MagickPathExtent],
774 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
775 if (image == (
Image *) NULL)
777 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
778 sizeof(region.y)+
sizeof(length);
779 count=dpc_read(file,length,message);
780 if (count != (MagickOffsetType) length)
783 (void) memcpy(®ion.width,p,
sizeof(region.width));
784 p+=(ptrdiff_t)
sizeof(region.width);
785 (void) memcpy(®ion.height,p,
sizeof(region.height));
786 p+=(ptrdiff_t)
sizeof(region.height);
787 (void) memcpy(®ion.x,p,
sizeof(region.x));
788 p+=(ptrdiff_t)
sizeof(region.x);
789 (void) memcpy(®ion.y,p,
sizeof(region.y));
790 p+=(ptrdiff_t)
sizeof(region.y);
791 (void) memcpy(&length,p,
sizeof(length));
792 extent=((MagickSizeType) region.width*region.height*
sizeof(Quantum));
795 p+=(ptrdiff_t)
sizeof(length);
796 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
798 if (q == (Quantum *) NULL)
800 metacontent=(
unsigned char *) GetAuthenticMetacontent(image);
801 count=dpc_read(file,length,metacontent);
802 if (count != (MagickOffsetType) length)
804 return(SyncAuthenticPixels(image,exception));
807static MagickBooleanType WriteDistributeCachePixels(
SplayTreeInfo *registry,
814 key = (MagickAddressType) session_key;
830 message[MagickPathExtent],
836 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) key);
837 if (image == (
Image *) NULL)
839 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
840 sizeof(region.y)+
sizeof(length);
841 count=dpc_read(file,length,message);
842 if (count != (MagickOffsetType) length)
845 (void) memcpy(®ion.width,p,
sizeof(region.width));
846 p+=(ptrdiff_t)
sizeof(region.width);
847 (void) memcpy(®ion.height,p,
sizeof(region.height));
848 p+=(ptrdiff_t)
sizeof(region.height);
849 (void) memcpy(®ion.x,p,
sizeof(region.x));
850 p+=(ptrdiff_t)
sizeof(region.x);
851 (void) memcpy(®ion.y,p,
sizeof(region.y));
852 p+=(ptrdiff_t)
sizeof(region.y);
853 (void) memcpy(&length,p,
sizeof(length));
854 extent=((MagickSizeType) region.width*region.height*image->number_channels*
858 p+=(ptrdiff_t)
sizeof(length);
859 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
861 if (q == (Quantum *) NULL)
863 count=dpc_read(file,length,(
unsigned char *) q);
864 if (count != (MagickOffsetType) length)
866 return(SyncAuthenticPixels(image,exception));
868static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket_arg)
877 status = MagickFalse;
888 *client_socket_ptr = (SOCKET_TYPE *) socket_arg;
902 client_socket=(*client_socket_ptr);
903 client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(client_socket_ptr);
904 shared_secret = GetPolicyValue(
"cache:shared-secret");
905 if (shared_secret == (
char *) NULL)
906 ThrowFatalException(CacheFatalError,
"shared secret required");
907 nonce=StringToStringInfo(shared_secret);
908 shared_secret=DestroyString(shared_secret);
909 session_key=GetMagickSignature(nonce);
910 nonce=DestroyStringInfo(nonce);
911 exception=AcquireExceptionInfo();
915 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
916 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
917 count=dpc_send(client_socket,
sizeof(session_key),&session_key);
918 for (status=MagickFalse; ; )
920 count=dpc_read(client_socket,1,(
unsigned char *) &command);
923 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
924 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
930 status=OpenDistributeCache(registry,client_socket,session_key,
932 count=dpc_send(client_socket,
sizeof(status),&status);
937 status=ReadDistributeCachePixels(registry,client_socket,session_key,
943 status=ReadDistributeCacheMetacontent(registry,client_socket,
944 session_key,exception);
949 status=WriteDistributeCachePixels(registry,client_socket,session_key,
955 status=WriteDistributeCacheMetacontent(registry,client_socket,
956 session_key,exception);
961 status=DestroyDistributeCache(registry,session_key);
967 if ((status == MagickFalse) || (command ==
'd'))
970 count=dpc_send(client_socket,
sizeof(status),&status);
971 CLOSE_SOCKET(client_socket);
972 exception=DestroyExceptionInfo(exception);
973 registry=DestroySplayTree(registry);
974 return(HANDLER_RETURN_VALUE);
977MagickExport
void DistributePixelCacheServer(
const int port,
981 service[MagickPathExtent];
986#if defined(MAGICKCORE_THREAD_SUPPORT)
992#elif defined(_MSC_VER)
1016 assert(exception->signature == MagickCoreSignature);
1017 magick_unreferenced(exception);
1018#if defined(MAGICKCORE_HAVE_WINSOCK2)
1019 InitializeWinsock2(MagickFalse);
1021 memset(&hint,0,
sizeof(hint));
1022 hint.ai_family=AF_INET;
1023 hint.ai_socktype=SOCK_STREAM;
1024 hint.ai_flags=AI_PASSIVE;
1025 FormatLocaleString(service,MagickPathExtent,
"%d",port);
1026 status=getaddrinfo(NULL,service,&hint,&result);
1028 ThrowFatalException(CacheFatalError,
"UnableToListen");
1029 server_socket=(SOCKET_TYPE) 0;
1030 for (p=result; p != NULL; p=p->ai_next)
1035 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
1036 if (server_socket == -1)
1038 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(
char *) &one,
1039 (socklen_t)
sizeof(one));
1042 CLOSE_SOCKET(server_socket);
1045 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
1048 CLOSE_SOCKET(server_socket);
1053 if (p == (
struct addrinfo *) NULL)
1054 ThrowFatalException(CacheFatalError,
"UnableToBind");
1055 freeaddrinfo(result);
1056 status=listen(server_socket,DPCPendingConnections);
1058 ThrowFatalException(CacheFatalError,
"UnableToListen");
1059#if defined(MAGICKCORE_THREAD_SUPPORT)
1060 pthread_attr_init(&attributes);
1061 pthread_attr_setdetachstate(&attributes,PTHREAD_CREATE_DETACHED);
1069 length = (socklen_t)
sizeof(address);
1071 client_socket_ptr=(SOCKET_TYPE *) AcquireMagickMemory(
sizeof(SOCKET_TYPE));
1072 if (client_socket_ptr == NULL)
1074 *client_socket_ptr=accept(server_socket,(
struct sockaddr *) &address,
1076 if (*client_socket_ptr == -1)
1078 client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(
1082#if defined(MAGICKCORE_THREAD_SUPPORT)
1083 status=pthread_create(&thread_id, &attributes,DistributePixelCacheClient,
1084 (
void *) client_socket_ptr);
1087 CLOSE_SOCKET(*client_socket_ptr);
1088 RelinquishMagickMemory(client_socket_ptr);
1089 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1091#elif defined(_MSC_VER)
1092 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) client_socket_ptr,0,&threadID) == (HANDLE) NULL)
1094 CLOSE_SOCKET(*client_socket_ptr);
1095 RelinquishMagickMemory(client_socket_ptr);
1096 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1119MagickPrivate
void DistributeCacheTerminus(
void)
1121#ifdef MAGICKCORE_HAVE_WINSOCK2
1123 ActivateSemaphoreInfo(&winsock2_semaphore);
1124 LockSemaphoreInfo(winsock2_semaphore);
1125 if (wsaData != (WSADATA *) NULL)
1128 wsaData=(WSADATA *) RelinquishMagickMemory((
void *) wsaData);
1130 UnlockSemaphoreInfo(winsock2_semaphore);
1131 RelinquishSemaphoreInfo(&winsock2_semaphore);
1161 assert(server_info->signature == MagickCoreSignature);
1162 return(server_info->file);
1189MagickPrivate
const char *GetDistributeCacheHostname(
1193 assert(server_info->signature == MagickCoreSignature);
1194 return(server_info->hostname);
1223 assert(server_info->signature == MagickCoreSignature);
1224 return(server_info->port);
1252MagickPrivate MagickBooleanType OpenDistributePixelCache(
1262 message[MagickPathExtent],
1269 assert(server_info->signature == MagickCoreSignature);
1270 assert(image != (
Image *) NULL);
1271 assert(image->signature == MagickCoreSignature);
1277 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1278 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1279 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1280 p+=(ptrdiff_t)
sizeof(image->storage_class);
1281 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1282 p+=(ptrdiff_t)
sizeof(image->colorspace);
1283 (void) memcpy(p,&image->alpha_trait,
sizeof(image->alpha_trait));
1284 p+=(ptrdiff_t)
sizeof(image->alpha_trait);
1285 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1286 p+=(ptrdiff_t)
sizeof(image->channels);
1287 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1288 p+=(ptrdiff_t)
sizeof(image->columns);
1289 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1290 p+=(ptrdiff_t)
sizeof(image->rows);
1291 (void) memcpy(p,&image->number_channels,
sizeof(image->number_channels));
1292 p+=(ptrdiff_t)
sizeof(image->number_channels);
1293 (void) memcpy(p,image->channel_map,MaxPixelChannels*
1294 sizeof(*image->channel_map));
1295 p+=(ptrdiff_t) MaxPixelChannels*
sizeof(*image->channel_map);
1296 (void) memcpy(p,&image->metacontent_extent,
sizeof(image->metacontent_extent));
1297 p+=(ptrdiff_t)
sizeof(image->metacontent_extent);
1298 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1299 if (count != (MagickOffsetType) (p-message))
1300 return(MagickFalse);
1302 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1303 if (count != (MagickOffsetType)
sizeof(status))
1304 return(MagickFalse);
1341MagickPrivate MagickOffsetType ReadDistributePixelCacheMetacontent(
1343 const MagickSizeType length,
unsigned char *metacontent)
1349 message[MagickPathExtent],
1356 assert(server_info->signature == MagickCoreSignature);
1358 assert(metacontent != (
unsigned char *) NULL);
1359 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1363 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1364 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1365 (void) memcpy(p,®ion->width,
sizeof(region->width));
1366 p+=(ptrdiff_t)
sizeof(region->width);
1367 (void) memcpy(p,®ion->height,
sizeof(region->height));
1368 p+=(ptrdiff_t)
sizeof(region->height);
1369 (void) memcpy(p,®ion->x,
sizeof(region->x));
1370 p+=(ptrdiff_t)
sizeof(region->x);
1371 (void) memcpy(p,®ion->y,
sizeof(region->y));
1372 p+=(ptrdiff_t)
sizeof(region->y);
1373 (void) memcpy(p,&length,
sizeof(length));
1374 p+=(ptrdiff_t)
sizeof(length);
1375 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1376 if (count != (MagickOffsetType) (p-message))
1378 return(dpc_read(server_info->file,length,metacontent));
1414MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1416 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1422 message[MagickPathExtent],
1429 assert(server_info->signature == MagickCoreSignature);
1431 assert(pixels != (
unsigned char *) NULL);
1432 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1436 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1437 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1438 (void) memcpy(p,®ion->width,
sizeof(region->width));
1439 p+=(ptrdiff_t)
sizeof(region->width);
1440 (void) memcpy(p,®ion->height,
sizeof(region->height));
1441 p+=(ptrdiff_t)
sizeof(region->height);
1442 (void) memcpy(p,®ion->x,
sizeof(region->x));
1443 p+=(ptrdiff_t)
sizeof(region->x);
1444 (void) memcpy(p,®ion->y,
sizeof(region->y));
1445 p+=(ptrdiff_t)
sizeof(region->y);
1446 (void) memcpy(p,&length,
sizeof(length));
1447 p+=(ptrdiff_t)
sizeof(length);
1448 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1449 if (count != (MagickOffsetType) (p-message))
1451 return(dpc_read(server_info->file,length,pixels));
1478MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1488 message[MagickPathExtent],
1495 assert(server_info->signature == MagickCoreSignature);
1498 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1499 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1500 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1501 if (count != (MagickOffsetType) (p-message))
1502 return(MagickFalse);
1504 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1505 if (count != (MagickOffsetType)
sizeof(status))
1506 return(MagickFalse);
1543MagickPrivate MagickOffsetType WriteDistributePixelCacheMetacontent(
1545 const MagickSizeType length,
const unsigned char *metacontent)
1551 message[MagickPathExtent],
1558 assert(server_info->signature == MagickCoreSignature);
1560 assert(metacontent != (
unsigned char *) NULL);
1561 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1565 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1566 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1567 (void) memcpy(p,®ion->width,
sizeof(region->width));
1568 p+=(ptrdiff_t)
sizeof(region->width);
1569 (void) memcpy(p,®ion->height,
sizeof(region->height));
1570 p+=(ptrdiff_t)
sizeof(region->height);
1571 (void) memcpy(p,®ion->x,
sizeof(region->x));
1572 p+=(ptrdiff_t)
sizeof(region->x);
1573 (void) memcpy(p,®ion->y,
sizeof(region->y));
1574 p+=(ptrdiff_t)
sizeof(region->y);
1575 (void) memcpy(p,&length,
sizeof(length));
1576 p+=(ptrdiff_t)
sizeof(length);
1577 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1578 if (count != (MagickOffsetType) (p-message))
1580 return(dpc_send(server_info->file,length,metacontent));
1617MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1619 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1625 message[MagickPathExtent],
1632 assert(server_info->signature == MagickCoreSignature);
1634 assert(pixels != (
const unsigned char *) NULL);
1635 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1639 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1640 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1641 (void) memcpy(p,®ion->width,
sizeof(region->width));
1642 p+=(ptrdiff_t)
sizeof(region->width);
1643 (void) memcpy(p,®ion->height,
sizeof(region->height));
1644 p+=(ptrdiff_t)
sizeof(region->height);
1645 (void) memcpy(p,®ion->x,
sizeof(region->x));
1646 p+=(ptrdiff_t)
sizeof(region->x);
1647 (void) memcpy(p,®ion->y,
sizeof(region->y));
1648 p+=(ptrdiff_t)
sizeof(region->y);
1649 (void) memcpy(p,&length,
sizeof(length));
1650 p+=(ptrdiff_t)
sizeof(length);
1651 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1652 if (count != (MagickOffsetType) (p-message))
1654 return(dpc_send(server_info->file,length,pixels));