From: cristy Date: Sat, 30 May 2015 17:20:38 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~984 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=66988abda13e6b91586a74dff40d581b0fb0e31e;p=imagemagick --- diff --git a/MagickCore/blob.h b/MagickCore/blob.h index 1f507304a..3d48aa016 100644 --- a/MagickCore/blob.h +++ b/MagickCore/blob.h @@ -25,7 +25,7 @@ extern "C" { #endif -#define MagickMaxBufferExtent (32*8192) +#define MagickMaxBufferExtent 8192 typedef enum { diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 56bffc805..5c2ae6a77 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -119,6 +119,7 @@ static MagickBooleanType GetOneVirtualPixelFromCache(const Image *,const VirtualPixelMethod, const ssize_t,const ssize_t,Quantum *,ExceptionInfo *), OpenPixelCache(Image *,const MapMode,ExceptionInfo *), + OpenPixelCacheOnDisk(CacheInfo *,const MapMode), ReadPixelCachePixels(CacheInfo *restrict,NexusInfo *restrict,ExceptionInfo *), ReadPixelCacheMetacontent(CacheInfo *restrict,NexusInfo *restrict, ExceptionInfo *), @@ -472,6 +473,53 @@ MagickPrivate void ClonePixelCacheMethods(Cache clone,const Cache cache) % */ +static MagickBooleanType ClonePixelCacheOnDisk(CacheInfo *restrict cache_info, + CacheInfo *restrict clone_info,ExceptionInfo *exception) +{ + MagickSizeType + extent; + + ssize_t + count; + + unsigned char + buffer[MagickMaxBufferExtent]; + + /* + Clone pixel cache on disk with identifcal morphology. + */ + if ((OpenPixelCacheOnDisk(cache_info,ReadMode) == MagickFalse) || + (OpenPixelCacheOnDisk(clone_info,IOMode) == MagickFalse)) + return(MagickFalse); +#if defined(MAGICKCORE_HAVE_SENDFILE) + if (cache_info->length == (MagickSizeType) ((ssize_t) cache_info->length)) + { + off_t + offset; + + offset=0; + count=sendfile(clone_info->file,cache_info->file,&offset, + (size_t) cache_info->length); + if (count == (ssize_t) cache_info->length) + return(MagickTrue); + } +#endif + extent=0; + while ((count=read(cache_info->file,buffer,sizeof(buffer))) > 0) + { + ssize_t + number_bytes; + + number_bytes=write(clone_info->file,buffer,(size_t) count); + if (number_bytes != count) + break; + extent+=number_bytes; + } + if (extent != cache_info->length) + return(MagickFalse); + return(MagickTrue); +} + static MagickBooleanType ClonePixelCacheRepository( CacheInfo *restrict clone_info,CacheInfo *restrict cache_info, ExceptionInfo *exception) @@ -502,23 +550,36 @@ static MagickBooleanType ClonePixelCacheRepository( if (cache_info->type == PingCache) return(MagickTrue); length=cache_info->number_channels*sizeof(*cache_info->channel_map); - if (((cache_info->type == MemoryCache) || (cache_info->type == MapCache)) && - ((clone_info->type == MemoryCache) || (clone_info->type == MapCache)) && - (cache_info->columns == clone_info->columns) && + if ((cache_info->columns == clone_info->columns) && (cache_info->rows == clone_info->rows) && (cache_info->number_channels == clone_info->number_channels) && (memcmp(cache_info->channel_map,clone_info->channel_map,length) == 0) && (cache_info->metacontent_extent == clone_info->metacontent_extent)) { - (void) memcpy(clone_info->pixels,cache_info->pixels,cache_info->columns* - cache_info->number_channels*cache_info->rows* - sizeof(*cache_info->pixels)); - if ((cache_info->metacontent_extent != 0) && - (clone_info->metacontent_extent != 0)) - (void) memcpy(clone_info->metacontent,cache_info->metacontent, - cache_info->columns*cache_info->rows*clone_info->metacontent_extent* - sizeof(unsigned char)); - return(MagickTrue); + /* + Identical pixel cache morphology. + */ + if (((cache_info->type == MemoryCache) || + (cache_info->type == MapCache)) && + ((clone_info->type == MemoryCache) || + (clone_info->type == MapCache))) + { + (void) memcpy(clone_info->pixels,cache_info->pixels, + cache_info->columns*cache_info->number_channels*cache_info->rows* + sizeof(*cache_info->pixels)); + if ((cache_info->metacontent_extent != 0) && + (clone_info->metacontent_extent != 0)) + (void) memcpy(clone_info->metacontent,cache_info->metacontent, + cache_info->columns*cache_info->rows* + clone_info->metacontent_extent*sizeof(unsigned char)); + return(MagickTrue); + } + if ((cache_info->type == DiskCache) && (cache_info->type == DiskCache)) + { + status=ClonePixelCacheOnDisk(cache_info,clone_info,exception); + if (status != MagickFalse) + return(status); + } } /* Mismatched pixel cache morphology. @@ -3144,8 +3205,8 @@ static MagickBooleanType OpenPixelCacheOnDisk(CacheInfo *cache_info, /* Open pixel cache on disk. */ - if (cache_info->file != -1) - return(MagickTrue); /* cache already open */ + if ((cache_info->file != -1) && (cache_info->mode == mode)) + return(MagickTrue); /* cache already open and in the proper mode */ if (*cache_info->cache_filename == '\0') file=AcquireUniqueFileResource(cache_info->cache_filename); else @@ -3177,6 +3238,8 @@ static MagickBooleanType OpenPixelCacheOnDisk(CacheInfo *cache_info, if (file == -1) return(MagickFalse); (void) AcquireMagickResource(FileResource,1); + if (cache_info->file != -1) + (void) ClosePixelCacheOnDisk(cache_info); cache_info->file=file; cache_info->mode=mode; return(MagickTrue); diff --git a/MagickCore/magick-baseconfig.h b/MagickCore/magick-baseconfig.h index 4bd3feaee..507e73ecd 100644 --- a/MagickCore/magick-baseconfig.h +++ b/MagickCore/magick-baseconfig.h @@ -845,6 +845,11 @@ #define MAGICKCORE_HAVE_SYS_SELECT_H 1 #endif +/* Define to 1 if you have the header file. */ +#ifndef MAGICKCORE_HAVE_SYS_SENDFILE_H +#define MAGICKCORE_HAVE_SYS_SENDFILE_H 1 +#endif + /* Define to 1 if you have the header file. */ #ifndef MAGICKCORE_HAVE_SYS_SOCKET_H #define MAGICKCORE_HAVE_SYS_SOCKET_H 1 diff --git a/MagickCore/studio.h b/MagickCore/studio.h index 6905a11fa..46b243fb2 100644 --- a/MagickCore/studio.h +++ b/MagickCore/studio.h @@ -210,6 +210,9 @@ extern int vsnprintf(char *,size_t,const char *,va_list); # if defined(MAGICKCORE_HAVE_SYS_MMAN_H) # include # endif +# if defined(MAGICKCORE_HAVE_SYS_SENDFILE_H) +# include +# endif #endif #else # include diff --git a/MagickCore/version.h b/MagickCore/version.h index 5b97bfc0c..db8ef5e7a 100644 --- a/MagickCore/version.h +++ b/MagickCore/version.h @@ -27,7 +27,7 @@ extern "C" { */ #define MagickPackageName "ImageMagick" #define MagickCopyright "Copyright (C) 1999-2015 ImageMagick Studio LLC" -#define MagickSVNRevision "18670:18677M" +#define MagickSVNRevision "18670:18682M" #define MagickLibVersion 0x700 #define MagickLibVersionText "7.0.0" #define MagickLibVersionNumber 0,0,0 diff --git a/MagickWand/studio.h b/MagickWand/studio.h index 7bf0aa3a1..3cd4e2226 100644 --- a/MagickWand/studio.h +++ b/MagickWand/studio.h @@ -213,6 +213,9 @@ extern int vsnprintf(char *,size_t,const char *,va_list); # if defined(MAGICKCORE_HAVE_SYS_MMAN_H) # include # endif +# if defined(MAGICKCORE_HAVE_SYS_SENDFILE_H) +# include +# endif #endif #else # include diff --git a/config/config.h.in b/config/config.h.in index 97c28883e..c43f91bcb 100644 --- a/config/config.h.in +++ b/config/config.h.in @@ -548,6 +548,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SENDFILE_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H diff --git a/configure b/configure index 1b2fe7ea1..7769c3c0e 100755 --- a/configure +++ b/configure @@ -4341,7 +4341,7 @@ MAGICK_PATCHLEVEL_VERSION=0 MAGICK_VERSION=7.0.0-0 -MAGICK_SVN_REVISION=18670:18677M +MAGICK_SVN_REVISION=18670:18682M # Substitute library versioning @@ -22371,7 +22371,7 @@ fi # Check additional headers -for ac_header in arm/limits.h arpa/inet.h complex.h errno.h fcntl.h limits.h linux/unistd.h locale.h machine/param.h mach-o/dyld.h netinet/in.h OS.h process.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/socket.h sys/syslimits.h sys/time.h sys/timeb.h sys/times.h sys/wait.h wchar.h xlocale.h +for ac_header in arm/limits.h arpa/inet.h complex.h errno.h fcntl.h limits.h linux/unistd.h locale.h machine/param.h mach-o/dyld.h netinet/in.h OS.h process.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/sendfile.h sys/socket.h sys/syslimits.h sys/time.h sys/timeb.h sys/times.h sys/wait.h wchar.h xlocale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" diff --git a/configure.ac b/configure.ac index 5d74c1dbb..e94ab491d 100755 --- a/configure.ac +++ b/configure.ac @@ -924,7 +924,7 @@ AC_HEADER_ASSERT AC_HEADER_DIRENT # Check additional headers -AC_CHECK_HEADERS(arm/limits.h arpa/inet.h complex.h errno.h fcntl.h limits.h linux/unistd.h locale.h machine/param.h mach-o/dyld.h netinet/in.h OS.h process.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/socket.h sys/syslimits.h sys/time.h sys/timeb.h sys/times.h sys/wait.h wchar.h xlocale.h) +AC_CHECK_HEADERS(arm/limits.h arpa/inet.h complex.h errno.h fcntl.h limits.h linux/unistd.h locale.h machine/param.h mach-o/dyld.h netinet/in.h OS.h process.h sun_prefetch.h stdarg.h sys/ipc.h sys/mman.h sys/resource.h sys/sendfile.h sys/socket.h sys/syslimits.h sys/time.h sys/timeb.h sys/times.h sys/wait.h wchar.h xlocale.h) ######## #