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#define SOCKET_TYPE int
80#if defined(MAGICKCORE_DPC_SUPPORT)
81#if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
82#include <netinet/in.h>
84#include <sys/socket.h>
86#define CLOSE_SOCKET(socket) (void) close_utf8(socket)
87#define HANDLER_RETURN_TYPE void *
88#define HANDLER_RETURN_VALUE (void *) NULL
89#define SOCKET_TYPE int
90#define LENGTH_TYPE size_t
91#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
92#elif defined(_MSC_VER)
93#define CLOSE_SOCKET(socket) (void) closesocket(socket)
94#define HANDLER_RETURN_TYPE DWORD WINAPI
95#define HANDLER_RETURN_VALUE 0
97#define SOCKET_TYPE SOCKET
98#define LENGTH_TYPE int
99#define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
100#define MAGICKCORE_HAVE_WINSOCK2 1
107#define DPCHostname "127.0.0.1"
108#define DPCPendingConnections 10
110#define DPCSessionKeyLength 8
112# define MSG_NOSIGNAL 0
118#ifdef MAGICKCORE_HAVE_WINSOCK2
123 *wsaData = (WSADATA*) NULL;
149#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
150static inline MagickOffsetType dpc_read(SOCKET_TYPE magick_unused(file),
151 const MagickSizeType magick_unused(length),
152 unsigned char *magick_restrict magick_unused(message))
154 magick_unreferenced(file);
155 magick_unreferenced(length);
156 magick_unreferenced(message);
160static inline MagickOffsetType dpc_read(SOCKET_TYPE file,
const MagickSizeType length,
161 unsigned char *magick_restrict message)
170 for (i=0; i < (MagickOffsetType) length; i+=count)
172 count=recv(file,(
char *) message+i,(LENGTH_TYPE) MagickMin(length-
173 (MagickSizeType) i,(MagickSizeType) MagickMaxBufferExtent),0);
185#if defined(MAGICKCORE_HAVE_WINSOCK2)
186static void InitializeWinsock2(MagickBooleanType use_lock)
188 if (use_lock != MagickFalse)
191 ActivateSemaphoreInfo(&winsock2_semaphore);
192 LockSemaphoreInfo(winsock2_semaphore);
194 if (wsaData == (WSADATA *) NULL)
196 wsaData=(WSADATA *) AcquireMagickMemory(
sizeof(WSADATA));
197 if (WSAStartup(MAKEWORD(2,2),wsaData) != 0)
198 ThrowFatalException(CacheFatalError,
"WSAStartup failed");
200 if (use_lock != MagickFalse)
201 UnlockSemaphoreInfo(winsock2_semaphore);
205#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
206static int ConnectPixelCacheServer(
const char *magick_unused(hostname),
207 const int magick_unused(port),
size_t *magick_unused(session_key),
208 ExceptionInfo *exception)
210 magick_unreferenced(hostname);
211 magick_unreferenced(port);
212 magick_unreferenced(session_key);
213 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
214 "DelegateLibrarySupportNotBuiltIn",
"distributed pixel cache");
218static int ConnectPixelCacheServer(
const char *hostname,
const int port,
219 size_t *session_key,ExceptionInfo *exception)
222 service[MagickPathExtent],
245#if defined(MAGICKCORE_HAVE_WINSOCK2)
246 InitializeWinsock2(MagickTrue);
248 (void) memset(&hint,0,
sizeof(hint));
249 hint.ai_family=AF_INET;
250 hint.ai_socktype=SOCK_STREAM;
251 hint.ai_flags=AI_PASSIVE;
252 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
253 status=getaddrinfo(hostname,service,&hint,&result);
256 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
257 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
260 client_socket=socket(result->ai_family,result->ai_socktype,
261 result->ai_protocol);
262 if (client_socket == -1)
264 freeaddrinfo(result);
265 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
266 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
269 status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen);
270 freeaddrinfo(result);
273 CLOSE_SOCKET(client_socket);
274 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
275 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
278 count=recv(client_socket,(
char *) session_key,
sizeof(*session_key),0);
281 CLOSE_SOCKET(client_socket);
282 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
283 "DistributedPixelCache",
"'%s': %s",hostname,GetExceptionMessage(errno));
289 shared_secret=GetPolicyValue(
"cache:shared-secret");
290 if (shared_secret == (
char *) NULL)
292 CLOSE_SOCKET(client_socket);
293 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
294 "DistributedPixelCache",
"'%s': shared secret required",hostname);
297 nonce=StringToStringInfo(shared_secret);
298 if ((
size_t) GetMagickSignature(nonce) != *session_key)
300 CLOSE_SOCKET(client_socket);
301 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
302 "DistributedPixelCache",
"'%s' authentication failed",hostname);
305 shared_secret=DestroyString(shared_secret);
306 nonce=DestroyStringInfo(nonce);
307 return((
int) client_socket);
311static char *GetHostname(
int *port,ExceptionInfo *exception)
330 hosts=(
char *) GetImageRegistry(StringRegistryType,
"cache:hosts",exception);
331 if (hosts == (
char *) NULL)
334 return(AcquireString(DPCHostname));
336 (void) SubstituteString(&hosts,
",",
" ");
337 hostlist=StringToArgv(hosts,&argc);
338 hosts=DestroyString(hosts);
339 if (hostlist == (
char **) NULL)
342 return(AcquireString(DPCHostname));
344 hosts=AcquireString(hostlist[(
id++ % ((
size_t) argc-1))+1]);
345 for (i=0; i < (ssize_t) argc; i++)
346 hostlist[i]=DestroyString(hostlist[i]);
347 hostlist=(
char **) RelinquishMagickMemory(hostlist);
348 (void) SubstituteString(&hosts,
":",
" ");
349 hostlist=StringToArgv(hosts,&argc);
350 if (hostlist == (
char **) NULL)
353 return(AcquireString(DPCHostname));
355 host=AcquireString(hostlist[1]);
356 if (hostlist[2] == (
char *) NULL)
359 *port=StringToLong(hostlist[2]);
360 for (i=0; i < (ssize_t) argc; i++)
361 hostlist[i]=DestroyString(hostlist[i]);
362 hostlist=(
char **) RelinquishMagickMemory(hostlist);
366MagickPrivate DistributeCacheInfo *AcquireDistributeCacheInfo(
367 ExceptionInfo *exception)
381 server_info=(DistributeCacheInfo *) AcquireCriticalMemory(
382 sizeof(*server_info));
383 (void) memset(server_info,0,
sizeof(*server_info));
384 server_info->signature=MagickCoreSignature;
386 hostname=GetHostname(&server_info->port,exception);
388 server_info->file=ConnectPixelCacheServer(hostname,server_info->port,
389 &session_key,exception);
390 if (server_info->file == -1)
391 server_info=DestroyDistributeCacheInfo(server_info);
394 server_info->session_key=session_key;
395 (void) CopyMagickString(server_info->hostname,hostname,MagickPathExtent);
396 server_info->debug=(GetLogEventMask() & CacheEvent) != 0 ? MagickTrue :
399 hostname=DestroyString(hostname);
427MagickPrivate DistributeCacheInfo *DestroyDistributeCacheInfo(
428 DistributeCacheInfo *server_info)
430 assert(server_info != (DistributeCacheInfo *) NULL);
431 assert(server_info->signature == MagickCoreSignature);
432#if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
433 if (server_info->file > 0)
434 CLOSE_SOCKET(server_info->file);
436 server_info->signature=(~MagickCoreSignature);
437 server_info=(DistributeCacheInfo *) RelinquishMagickMemory(server_info);
467#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
468static inline MagickOffsetType dpc_send(SOCKET_TYPE magick_unused(file),
469 const MagickSizeType magick_unused(length),
470 const void *magick_restrict magick_unused(message))
472 magick_unreferenced(file);
473 magick_unreferenced(length);
474 magick_unreferenced(message);
478static inline MagickOffsetType dpc_send(SOCKET_TYPE file,
const MagickSizeType length,
479 const void *magick_restrict message)
491 for (i=0; i < (MagickOffsetType) length; i+=count)
493 count=(ssize_t) send(file,(
char *) message+i,(LENGTH_TYPE)
494 MagickMin(length-(MagickSizeType) i,(MagickSizeType) MagickMaxBufferExtent),
507#if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
508MagickExport
void DistributePixelCacheServer(
const int magick_unused(port),
509 ExceptionInfo *magick_unused(exception))
511 magick_unreferenced(port);
512 magick_unreferenced(exception);
513 ThrowFatalException(MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn");
516static MagickBooleanType DestroyDistributeCache(SplayTreeInfo *registry,
517 const size_t session_key)
520 key = (MagickAddressType) session_key;
525 return(DeleteNodeFromSplayTree(registry,(
const void *) key));
528static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
529 SOCKET_TYPE file,
const size_t session_key,ExceptionInfo *exception)
535 key = (MagickAddressType) session_key;
547 message[MagickPathExtent],
553 image=AcquireImage((ImageInfo *) NULL,exception);
554 if (image == (Image *) NULL)
556 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
557 sizeof(image->alpha_trait)+
sizeof(image->channels)+
sizeof(image->columns)+
558 sizeof(image->rows)+
sizeof(image->number_channels)+MaxPixelChannels*
559 sizeof(*image->channel_map)+
sizeof(image->metacontent_extent);
560 count=dpc_read(file,length,message);
561 if (count != (MagickOffsetType) length)
567 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
568 p+=(ptrdiff_t)
sizeof(image->storage_class);
569 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
570 p+=(ptrdiff_t)
sizeof(image->colorspace);
571 (void) memcpy(&image->alpha_trait,p,
sizeof(image->alpha_trait));
572 p+=(ptrdiff_t)
sizeof(image->alpha_trait);
573 (void) memcpy(&image->channels,p,
sizeof(image->channels));
574 p+=(ptrdiff_t)
sizeof(image->channels);
575 (void) memcpy(&image->columns,p,
sizeof(image->columns));
576 p+=(ptrdiff_t)
sizeof(image->columns);
577 (void) memcpy(&image->rows,p,
sizeof(image->rows));
578 p+=(ptrdiff_t)
sizeof(image->rows);
579 (void) memcpy(&image->number_channels,p,
sizeof(image->number_channels));
580 p+=(ptrdiff_t)
sizeof(image->number_channels);
581 (void) memcpy(image->channel_map,p,MaxPixelChannels*
582 sizeof(*image->channel_map));
583 p+=(ptrdiff_t) MaxPixelChannels*
sizeof(*image->channel_map);
584 (void) memcpy(&image->metacontent_extent,p,
sizeof(image->metacontent_extent));
585 p+=(ptrdiff_t)
sizeof(image->metacontent_extent);
586 if (SyncImagePixelCache(image,exception) == MagickFalse)
588 status=AddValueToSplayTree(registry,(
const void *) key,image);
592static MagickBooleanType ReadDistributeCacheMetacontent(SplayTreeInfo *registry,
593 SOCKET_TYPE file,
const size_t session_key,ExceptionInfo *exception)
605 key = (MagickAddressType) session_key;
617 message[MagickPathExtent],
623 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
624 if (image == (Image *) NULL)
626 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
627 sizeof(region.y)+
sizeof(length);
628 count=dpc_read(file,length,message);
629 if (count != (MagickOffsetType) length)
632 (void) memcpy(®ion.width,q,
sizeof(region.width));
633 q+=(ptrdiff_t)
sizeof(region.width);
634 (void) memcpy(®ion.height,q,
sizeof(region.height));
635 q+=(ptrdiff_t)
sizeof(region.height);
636 (void) memcpy(®ion.x,q,
sizeof(region.x));
637 q+=(ptrdiff_t)
sizeof(region.x);
638 (void) memcpy(®ion.y,q,
sizeof(region.y));
639 q+=(ptrdiff_t)
sizeof(region.y);
640 (void) memcpy(&length,q,
sizeof(length));
641 q+=(ptrdiff_t)
sizeof(length);
642 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
644 if (p == (
const Quantum *) NULL)
646 metacontent=(
const unsigned char *) GetVirtualMetacontent(image);
647 count=dpc_send(file,length,metacontent);
648 if (count != (MagickOffsetType) length)
653static MagickBooleanType ReadDistributeCachePixels(SplayTreeInfo *registry,
654 SOCKET_TYPE file,
const size_t session_key,ExceptionInfo *exception)
663 key = (MagickAddressType) session_key;
675 message[MagickPathExtent],
681 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
682 if (image == (Image *) NULL)
684 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
685 sizeof(region.y)+
sizeof(length);
686 count=dpc_read(file,length,message);
687 if (count != (MagickOffsetType) length)
690 (void) memcpy(®ion.width,q,
sizeof(region.width));
691 q+=(ptrdiff_t)
sizeof(region.width);
692 (void) memcpy(®ion.height,q,
sizeof(region.height));
693 q+=(ptrdiff_t)
sizeof(region.height);
694 (void) memcpy(®ion.x,q,
sizeof(region.x));
695 q+=(ptrdiff_t)
sizeof(region.x);
696 (void) memcpy(®ion.y,q,
sizeof(region.y));
697 q+=(ptrdiff_t)
sizeof(region.y);
698 (void) memcpy(&length,q,
sizeof(length));
699 q+=(ptrdiff_t)
sizeof(length);
700 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
702 if (p == (
const Quantum *) NULL)
704 count=dpc_send(file,length,p);
705 if (count != (MagickOffsetType) length)
710static void *RelinquishImageRegistry(
void *image)
712 return((
void *) DestroyImageList((Image *) image));
715static MagickBooleanType WriteDistributeCacheMetacontent(
716 SplayTreeInfo *registry,SOCKET_TYPE file,
const size_t session_key,
717 ExceptionInfo *exception)
723 key = (MagickAddressType) session_key;
738 message[MagickPathExtent],
746 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
747 if (image == (Image *) NULL)
749 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
750 sizeof(region.y)+
sizeof(length);
751 count=dpc_read(file,length,message);
752 if (count != (MagickOffsetType) length)
755 (void) memcpy(®ion.width,p,
sizeof(region.width));
756 p+=(ptrdiff_t)
sizeof(region.width);
757 (void) memcpy(®ion.height,p,
sizeof(region.height));
758 p+=(ptrdiff_t)
sizeof(region.height);
759 (void) memcpy(®ion.x,p,
sizeof(region.x));
760 p+=(ptrdiff_t)
sizeof(region.x);
761 (void) memcpy(®ion.y,p,
sizeof(region.y));
762 p+=(ptrdiff_t)
sizeof(region.y);
763 (void) memcpy(&length,p,
sizeof(length));
764 p+=(ptrdiff_t)
sizeof(length);
765 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
767 if (q == (Quantum *) NULL)
769 metacontent=(
unsigned char *) GetAuthenticMetacontent(image);
770 count=dpc_read(file,length,metacontent);
771 if (count != (MagickOffsetType) length)
773 return(SyncAuthenticPixels(image,exception));
776static MagickBooleanType WriteDistributeCachePixels(SplayTreeInfo *registry,
777 SOCKET_TYPE file,
const size_t session_key,ExceptionInfo *exception)
783 key = (MagickAddressType) session_key;
798 message[MagickPathExtent],
804 image=(Image *) GetValueFromSplayTree(registry,(
const void *) key);
805 if (image == (Image *) NULL)
807 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
808 sizeof(region.y)+
sizeof(length);
809 count=dpc_read(file,length,message);
810 if (count != (MagickOffsetType) length)
813 (void) memcpy(®ion.width,p,
sizeof(region.width));
814 p+=(ptrdiff_t)
sizeof(region.width);
815 (void) memcpy(®ion.height,p,
sizeof(region.height));
816 p+=(ptrdiff_t)
sizeof(region.height);
817 (void) memcpy(®ion.x,p,
sizeof(region.x));
818 p+=(ptrdiff_t)
sizeof(region.x);
819 (void) memcpy(®ion.y,p,
sizeof(region.y));
820 p+=(ptrdiff_t)
sizeof(region.y);
821 (void) memcpy(&length,p,
sizeof(length));
822 p+=(ptrdiff_t)
sizeof(length);
823 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
825 if (q == (Quantum *) NULL)
827 count=dpc_read(file,length,(
unsigned char *) q);
828 if (count != (MagickOffsetType) length)
830 return(SyncAuthenticPixels(image,exception));
833static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket)
842 status = MagickFalse;
866 shared_secret=GetPolicyValue(
"cache:shared-secret");
867 if (shared_secret == (
char *) NULL)
868 ThrowFatalException(CacheFatalError,
"shared secret required");
869 nonce=StringToStringInfo(shared_secret);
870 shared_secret=DestroyString(shared_secret);
871 session_key=GetMagickSignature(nonce);
872 nonce=DestroyStringInfo(nonce);
873 exception=AcquireExceptionInfo();
877 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
878 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
879 client_socket=(*(SOCKET_TYPE *) socket);
880 count=dpc_send(client_socket,
sizeof(session_key),&session_key);
881 for (status=MagickFalse; ; )
883 count=dpc_read(client_socket,1,(
unsigned char *) &command);
886 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
887 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
893 status=OpenDistributeCache(registry,client_socket,session_key,
895 count=dpc_send(client_socket,
sizeof(status),&status);
900 status=ReadDistributeCachePixels(registry,client_socket,session_key,
906 status=ReadDistributeCacheMetacontent(registry,client_socket,
907 session_key,exception);
912 status=WriteDistributeCachePixels(registry,client_socket,session_key,
918 status=WriteDistributeCacheMetacontent(registry,client_socket,
919 session_key,exception);
924 status=DestroyDistributeCache(registry,session_key);
930 if (status == MagickFalse)
935 count=dpc_send(client_socket,
sizeof(status),&status);
936 CLOSE_SOCKET(client_socket);
937 exception=DestroyExceptionInfo(exception);
938 registry=DestroySplayTree(registry);
939 return(HANDLER_RETURN_VALUE);
942MagickExport
void DistributePixelCacheServer(
const int port,
943 ExceptionInfo *exception)
946 service[MagickPathExtent];
951#if defined(MAGICKCORE_THREAD_SUPPORT)
957#elif defined(_MSC_VER)
980 assert(exception != (ExceptionInfo *) NULL);
981 assert(exception->signature == MagickCoreSignature);
982 magick_unreferenced(exception);
983#if defined(MAGICKCORE_HAVE_WINSOCK2)
984 InitializeWinsock2(MagickFalse);
986 (void) memset(&hint,0,
sizeof(hint));
987 hint.ai_family=AF_INET;
988 hint.ai_socktype=SOCK_STREAM;
989 hint.ai_flags=AI_PASSIVE;
990 (void) FormatLocaleString(service,MagickPathExtent,
"%d",port);
991 status=getaddrinfo((
const char *) NULL,service,&hint,&result);
993 ThrowFatalException(CacheFatalError,
"UnableToListen");
994 server_socket=(SOCKET_TYPE) 0;
995 for (p=result; p != (
struct addrinfo *) NULL; p=p->ai_next)
1000 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
1001 if (server_socket == -1)
1004 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(
char *) &one,
1005 (socklen_t)
sizeof(one));
1008 CLOSE_SOCKET(server_socket);
1011 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
1014 CLOSE_SOCKET(server_socket);
1019 if (p == (
struct addrinfo *) NULL)
1020 ThrowFatalException(CacheFatalError,
"UnableToBind");
1021 freeaddrinfo(result);
1022 status=listen(server_socket,DPCPendingConnections);
1024 ThrowFatalException(CacheFatalError,
"UnableToListen");
1025#if defined(MAGICKCORE_THREAD_SUPPORT)
1026 pthread_attr_init(&attributes);
1036 length=(socklen_t)
sizeof(address);
1037 client_socket=accept(server_socket,(
struct sockaddr *) &address,&length);
1038 if (client_socket == -1)
1039 ThrowFatalException(CacheFatalError,
"UnableToEstablishConnection");
1040#if defined(MAGICKCORE_THREAD_SUPPORT)
1041 status=pthread_create(&threads,&attributes,DistributePixelCacheClient,
1042 (
void *) &client_socket);
1044 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1045#elif defined(_MSC_VER)
1046 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) &client_socket,0,&threadID) == (HANDLE) NULL)
1047 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
1069MagickPrivate
void DistributeCacheTerminus(
void)
1071#ifdef MAGICKCORE_HAVE_WINSOCK2
1073 ActivateSemaphoreInfo(&winsock2_semaphore);
1074 LockSemaphoreInfo(winsock2_semaphore);
1075 if (wsaData != (WSADATA *) NULL)
1078 wsaData=(WSADATA *) RelinquishMagickMemory((
void *) wsaData);
1080 UnlockSemaphoreInfo(winsock2_semaphore);
1081 RelinquishSemaphoreInfo(&winsock2_semaphore);
1108MagickPrivate
int GetDistributeCacheFile(
const DistributeCacheInfo *server_info)
1110 assert(server_info != (DistributeCacheInfo *) NULL);
1111 assert(server_info->signature == MagickCoreSignature);
1112 return(server_info->file);
1139MagickPrivate
const char *GetDistributeCacheHostname(
1140 const DistributeCacheInfo *server_info)
1142 assert(server_info != (DistributeCacheInfo *) NULL);
1143 assert(server_info->signature == MagickCoreSignature);
1144 return(server_info->hostname);
1170MagickPrivate
int GetDistributeCachePort(
const DistributeCacheInfo *server_info)
1172 assert(server_info != (DistributeCacheInfo *) NULL);
1173 assert(server_info->signature == MagickCoreSignature);
1174 return(server_info->port);
1202MagickPrivate MagickBooleanType OpenDistributePixelCache(
1203 DistributeCacheInfo *server_info,Image *image)
1212 message[MagickPathExtent],
1218 assert(server_info != (DistributeCacheInfo *) NULL);
1219 assert(server_info->signature == MagickCoreSignature);
1220 assert(image != (Image *) NULL);
1221 assert(image->signature == MagickCoreSignature);
1227 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1228 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1229 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1230 p+=(ptrdiff_t)
sizeof(image->storage_class);
1231 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1232 p+=(ptrdiff_t)
sizeof(image->colorspace);
1233 (void) memcpy(p,&image->alpha_trait,
sizeof(image->alpha_trait));
1234 p+=(ptrdiff_t)
sizeof(image->alpha_trait);
1235 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1236 p+=(ptrdiff_t)
sizeof(image->channels);
1237 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1238 p+=(ptrdiff_t)
sizeof(image->columns);
1239 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1240 p+=(ptrdiff_t)
sizeof(image->rows);
1241 (void) memcpy(p,&image->number_channels,
sizeof(image->number_channels));
1242 p+=(ptrdiff_t)
sizeof(image->number_channels);
1243 (void) memcpy(p,image->channel_map,MaxPixelChannels*
1244 sizeof(*image->channel_map));
1245 p+=(ptrdiff_t) MaxPixelChannels*
sizeof(*image->channel_map);
1246 (void) memcpy(p,&image->metacontent_extent,
sizeof(image->metacontent_extent));
1247 p+=(ptrdiff_t)
sizeof(image->metacontent_extent);
1248 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1249 if (count != (MagickOffsetType) (p-message))
1250 return(MagickFalse);
1252 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1253 if (count != (MagickOffsetType)
sizeof(status))
1254 return(MagickFalse);
1291MagickPrivate MagickOffsetType ReadDistributePixelCacheMetacontent(
1292 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1293 const MagickSizeType length,
unsigned char *metacontent)
1299 message[MagickPathExtent],
1305 assert(server_info != (DistributeCacheInfo *) NULL);
1306 assert(server_info->signature == MagickCoreSignature);
1307 assert(region != (RectangleInfo *) NULL);
1308 assert(metacontent != (
unsigned char *) NULL);
1309 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1313 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1314 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1315 (void) memcpy(p,®ion->width,
sizeof(region->width));
1316 p+=(ptrdiff_t)
sizeof(region->width);
1317 (void) memcpy(p,®ion->height,
sizeof(region->height));
1318 p+=(ptrdiff_t)
sizeof(region->height);
1319 (void) memcpy(p,®ion->x,
sizeof(region->x));
1320 p+=(ptrdiff_t)
sizeof(region->x);
1321 (void) memcpy(p,®ion->y,
sizeof(region->y));
1322 p+=(ptrdiff_t)
sizeof(region->y);
1323 (void) memcpy(p,&length,
sizeof(length));
1324 p+=(ptrdiff_t)
sizeof(length);
1325 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1326 if (count != (MagickOffsetType) (p-message))
1328 return(dpc_read(server_info->file,length,metacontent));
1364MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1365 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1366 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1372 message[MagickPathExtent],
1378 assert(server_info != (DistributeCacheInfo *) NULL);
1379 assert(server_info->signature == MagickCoreSignature);
1380 assert(region != (RectangleInfo *) NULL);
1381 assert(pixels != (
unsigned char *) NULL);
1382 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1386 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1387 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1388 (void) memcpy(p,®ion->width,
sizeof(region->width));
1389 p+=(ptrdiff_t)
sizeof(region->width);
1390 (void) memcpy(p,®ion->height,
sizeof(region->height));
1391 p+=(ptrdiff_t)
sizeof(region->height);
1392 (void) memcpy(p,®ion->x,
sizeof(region->x));
1393 p+=(ptrdiff_t)
sizeof(region->x);
1394 (void) memcpy(p,®ion->y,
sizeof(region->y));
1395 p+=(ptrdiff_t)
sizeof(region->y);
1396 (void) memcpy(p,&length,
sizeof(length));
1397 p+=(ptrdiff_t)
sizeof(length);
1398 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1399 if (count != (MagickOffsetType) (p-message))
1401 return(dpc_read(server_info->file,length,pixels));
1428MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1429 DistributeCacheInfo *server_info)
1438 message[MagickPathExtent],
1444 assert(server_info != (DistributeCacheInfo *) NULL);
1445 assert(server_info->signature == MagickCoreSignature);
1448 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1449 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1450 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1451 if (count != (MagickOffsetType) (p-message))
1452 return(MagickFalse);
1454 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1455 if (count != (MagickOffsetType)
sizeof(status))
1456 return(MagickFalse);
1493MagickPrivate MagickOffsetType WriteDistributePixelCacheMetacontent(
1494 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1495 const MagickSizeType length,
const unsigned char *metacontent)
1501 message[MagickPathExtent],
1507 assert(server_info != (DistributeCacheInfo *) NULL);
1508 assert(server_info->signature == MagickCoreSignature);
1509 assert(region != (RectangleInfo *) NULL);
1510 assert(metacontent != (
unsigned char *) NULL);
1511 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1515 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1516 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1517 (void) memcpy(p,®ion->width,
sizeof(region->width));
1518 p+=(ptrdiff_t)
sizeof(region->width);
1519 (void) memcpy(p,®ion->height,
sizeof(region->height));
1520 p+=(ptrdiff_t)
sizeof(region->height);
1521 (void) memcpy(p,®ion->x,
sizeof(region->x));
1522 p+=(ptrdiff_t)
sizeof(region->x);
1523 (void) memcpy(p,®ion->y,
sizeof(region->y));
1524 p+=(ptrdiff_t)
sizeof(region->y);
1525 (void) memcpy(p,&length,
sizeof(length));
1526 p+=(ptrdiff_t)
sizeof(length);
1527 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1528 if (count != (MagickOffsetType) (p-message))
1530 return(dpc_send(server_info->file,length,metacontent));
1567MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1568 DistributeCacheInfo *server_info,
const RectangleInfo *region,
1569 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1575 message[MagickPathExtent],
1581 assert(server_info != (DistributeCacheInfo *) NULL);
1582 assert(server_info->signature == MagickCoreSignature);
1583 assert(region != (RectangleInfo *) NULL);
1584 assert(pixels != (
const unsigned char *) NULL);
1585 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1589 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1590 p+=(ptrdiff_t)
sizeof(server_info->session_key);
1591 (void) memcpy(p,®ion->width,
sizeof(region->width));
1592 p+=(ptrdiff_t)
sizeof(region->width);
1593 (void) memcpy(p,®ion->height,
sizeof(region->height));
1594 p+=(ptrdiff_t)
sizeof(region->height);
1595 (void) memcpy(p,®ion->x,
sizeof(region->x));
1596 p+=(ptrdiff_t)
sizeof(region->x);
1597 (void) memcpy(p,®ion->y,
sizeof(region->y));
1598 p+=(ptrdiff_t)
sizeof(region->y);
1599 (void) memcpy(p,&length,
sizeof(length));
1600 p+=(ptrdiff_t)
sizeof(length);
1601 count=dpc_send(server_info->file,(MagickSizeType) (p-message),message);
1602 if (count != (MagickOffsetType) (p-message))
1604 return(dpc_send(server_info->file,length,pixels));