From 675b4431cd97b6d81ea9b9342ff13331e70e6bb4 Mon Sep 17 00:00:00 2001 From: Hans Kristian Rosbach Date: Tue, 6 May 2025 15:28:32 +0200 Subject: [PATCH] Remove usage of aligned alloc implementations and instead use calloc. Using calloc has advantages like ensuring memory is zeroed and depending on OS implementation can improve speed and cache-locality by pre-zeroing or only zeroing pages that are actually touched. --- CMakeLists.txt | 44 ----------- configure | 86 --------------------- deflate.c | 2 - gzlib.c | 2 +- gzread.c.in | 2 +- gzwrite.c | 2 +- test/benchmarks/benchmark_adler32.cc | 2 +- test/benchmarks/benchmark_adler32_copy.cc | 2 +- test/benchmarks/benchmark_compare256.cc | 2 +- test/benchmarks/benchmark_compare256_rle.cc | 2 +- test/benchmarks/benchmark_compress.cc | 2 +- test/benchmarks/benchmark_crc32.cc | 2 +- test/benchmarks/benchmark_slidehash.cc | 2 +- test/benchmarks/benchmark_uncompress.cc | 2 +- test/test_crc32.cc | 1 - zlib_name_mangling-ng.h.in | 2 - zlib_name_mangling.h.in | 2 - zutil.c | 3 +- zutil.h | 8 ++ zutil_p.h | 51 ------------ 20 files changed, 21 insertions(+), 200 deletions(-) delete mode 100644 zutil_p.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7afa5319..541d36c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -456,49 +456,6 @@ if(NOT HAVE_STRERROR) endif() set(CMAKE_REQUIRED_FLAGS) -# -# Check for aligned memory allocation support: POSIX -# -set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L -D_ISOC11_SOURCE=1) -set(CMAKE_REQUIRED_FLAGS "${ADDITIONAL_CHECK_FLAGS}") -check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) -if(HAVE_POSIX_MEMALIGN) - add_definitions(-DHAVE_POSIX_MEMALIGN) -endif() -set(CMAKE_REQUIRED_FLAGS) -set(CMAKE_REQUIRED_DEFINITIONS) - -# -# Check for aligned memory allocation support: C11 -# -set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L -D_ISOC11_SOURCE=1) -set(CMAKE_REQUIRED_FLAGS "${ADDITIONAL_CHECK_FLAGS}") -check_symbol_exists(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC) -if(HAVE_ALIGNED_ALLOC) - add_definitions(-DHAVE_ALIGNED_ALLOC) -endif() -set(CMAKE_REQUIRED_FLAGS) -set(CMAKE_REQUIRED_DEFINITIONS) - -# -# Check for aligned memory allocation support: GNU extension -# Note: memalign() is deprecated in glibc -# -check_symbol_exists(memalign malloc.h HAVE_MEMALIGN) -if(HAVE_MEMALIGN) - add_definitions(-DHAVE_MEMALIGN) -endif() -set(CMAKE_REQUIRED_DEFINITIONS) - -# -# Check for aligned memory allocation support: MSVC extensions -# -check_symbol_exists(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC) -if(HAVE__ALIGNED_MALLOC) - add_definitions(-DHAVE__ALIGNED_MALLOC) -endif() -set(CMAKE_REQUIRED_DEFINITIONS) - # # Check for x86 __cpuid / __cpuid_count support: GNU extensions # gcc/clang and MSVC have __cpuid, so check __cpuid_count instead @@ -1250,7 +1207,6 @@ set(ZLIB_PRIVATE_HDRS zendian.h zmemory.h zutil.h - zutil_p.h ) set(ZLIB_SRCS arch/generic/adler32_c.c diff --git a/configure b/configure index 869cc5c3..5c365b16 100755 --- a/configure +++ b/configure @@ -731,91 +731,6 @@ EOF fi echo >> configure.log - -# check for aligned memory allocation support: POSIX -cat > $test.c < -int main(void) { - void *ptr = 0; - int ret = posix_memalign(&ptr, 64, 10); - if (ptr) - free(ptr); - return ret; -} -EOF -if try $CC $CFLAGS $ADDITIONAL_CHECK_FLAGS -o $test $test.c $LDSHAREDLIBC; then - echo "Checking for posix_memalign... Yes." | tee -a configure.log - CFLAGS="${CFLAGS} -DHAVE_POSIX_MEMALIGN" - SFLAGS="${SFLAGS} -DHAVE_POSIX_MEMALIGN" -else - echo "Checking for posix_memalign... No." | tee -a configure.log -fi -echo >> configure.log - -# check for aligned memory allocation support: C11 -cat > $test.c < -int main(void) { - void *ptr = aligned_alloc(64, 10); - if (ptr) - free(ptr); - return 0; -} -EOF -if try $CC $CFLAGS $ADDITIONAL_CHECK_FLAGS -o $test $test.c $LDSHAREDLIBC; then - echo "Checking for aligned_alloc... Yes." | tee -a configure.log - CFLAGS="${CFLAGS} -DHAVE_ALIGNED_ALLOC" - SFLAGS="${SFLAGS} -DHAVE_ALIGNED_ALLOC" -else - echo "Checking for aligned_alloc... No." | tee -a configure.log -fi -echo >> configure.log - - -# check for aligned memory allocation support: GNU extension -# Note: memalign() is deprecated in glibc -cat > $test.c < -int main(void) { - void *ptr = memalign(64, 10); - if (ptr) - free(ptr); - return 0; -} -EOF -if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then - echo "Checking for memalign... Yes." | tee -a configure.log - CFLAGS="${CFLAGS} -DHAVE_MEMALIGN" - SFLAGS="${SFLAGS} -DHAVE_MEMALIGN" -else - echo "Checking for memalign... No." | tee -a configure.log -fi -echo >> configure.log - -# check for aligned memory allocation support: MSVC extensions -cat > $test.c < -int main(void) { - void *ptr = _aligned_malloc(10, 64); - if (ptr) - _aligned_free(ptr); - return 0; -} -EOF -if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then - echo "Checking for _aligned_malloc... Yes." | tee -a configure.log - CFLAGS="${CFLAGS} -DHAVE__ALIGNED_MALLOC" - SFLAGS="${SFLAGS} -DHAVE__ALIGNED_MALLOC" -else - echo "Checking for _aligned_malloc... No." | tee -a configure.log -fi -echo >> configure.log - - # check for cpuid support: GNU extensions cat > $test.c < @@ -870,7 +785,6 @@ else fi echo >> configure.log - # check for strerror() for use by gz* functions cat > $test.c < diff --git a/deflate.c b/deflate.c index 630cce25..fefdd602 100644 --- a/deflate.c +++ b/deflate.c @@ -258,8 +258,6 @@ Z_INTERNAL deflate_allocs* alloc_deflate(PREFIX3(stream) *strm, int windowBits, alloc_bufs->pending_buf = (unsigned char *)HINT_ALIGNED_64(buff + pending_pos); alloc_bufs->state = (deflate_state *)HINT_ALIGNED_16(buff + state_pos); - memset((char *)alloc_bufs->prev, 0, prev_size); - return alloc_bufs; } diff --git a/gzlib.c b/gzlib.c index b8a506b6..17466dba 100644 --- a/gzlib.c +++ b/gzlib.c @@ -4,7 +4,7 @@ */ #include "zbuild.h" -#include "zutil_p.h" +#include "zutil.h" #include "gzguts.h" #if defined(_WIN32) diff --git a/gzread.c.in b/gzread.c.in index 1fc7b370..6cd87763 100644 --- a/gzread.c.in +++ b/gzread.c.in @@ -4,7 +4,7 @@ */ #include "zbuild.h" -#include "zutil_p.h" +#include "zutil.h" #include "gzguts.h" /* Local functions */ diff --git a/gzwrite.c b/gzwrite.c index 08e0ce9a..c23b946f 100644 --- a/gzwrite.c +++ b/gzwrite.c @@ -4,7 +4,7 @@ */ #include "zbuild.h" -#include "zutil_p.h" +#include "zutil.h" #include #include "gzguts.h" diff --git a/test/benchmarks/benchmark_adler32.cc b/test/benchmarks/benchmark_adler32.cc index b1278950..45503257 100644 --- a/test/benchmarks/benchmark_adler32.cc +++ b/test/benchmarks/benchmark_adler32.cc @@ -10,7 +10,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "arch_functions.h" # include "../test_cpu_features.h" } diff --git a/test/benchmarks/benchmark_adler32_copy.cc b/test/benchmarks/benchmark_adler32_copy.cc index bca8df18..fc851a4b 100644 --- a/test/benchmarks/benchmark_adler32_copy.cc +++ b/test/benchmarks/benchmark_adler32_copy.cc @@ -11,7 +11,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "arch_functions.h" # include "../test_cpu_features.h" } diff --git a/test/benchmarks/benchmark_compare256.cc b/test/benchmarks/benchmark_compare256.cc index 8ed2d0eb..8f28a390 100644 --- a/test/benchmarks/benchmark_compare256.cc +++ b/test/benchmarks/benchmark_compare256.cc @@ -9,7 +9,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "arch_functions.h" # include "../test_cpu_features.h" # include "arch/generic/compare256_p.h" diff --git a/test/benchmarks/benchmark_compare256_rle.cc b/test/benchmarks/benchmark_compare256_rle.cc index 5e6bb643..abc1cf8a 100644 --- a/test/benchmarks/benchmark_compare256_rle.cc +++ b/test/benchmarks/benchmark_compare256_rle.cc @@ -9,7 +9,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "compare256_rle.h" } diff --git a/test/benchmarks/benchmark_compress.cc b/test/benchmarks/benchmark_compress.cc index 400a7869..c14fd094 100644 --- a/test/benchmarks/benchmark_compress.cc +++ b/test/benchmarks/benchmark_compress.cc @@ -9,7 +9,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # if defined(ZLIB_COMPAT) # include "zlib.h" # else diff --git a/test/benchmarks/benchmark_crc32.cc b/test/benchmarks/benchmark_crc32.cc index 23a1dc19..490c13b5 100644 --- a/test/benchmarks/benchmark_crc32.cc +++ b/test/benchmarks/benchmark_crc32.cc @@ -10,7 +10,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "arch_functions.h" # include "../test_cpu_features.h" } diff --git a/test/benchmarks/benchmark_slidehash.cc b/test/benchmarks/benchmark_slidehash.cc index 4e9b20ee..c5f976dd 100644 --- a/test/benchmarks/benchmark_slidehash.cc +++ b/test/benchmarks/benchmark_slidehash.cc @@ -9,7 +9,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # include "deflate.h" # include "arch_functions.h" # include "../test_cpu_features.h" diff --git a/test/benchmarks/benchmark_uncompress.cc b/test/benchmarks/benchmark_uncompress.cc index 5653a350..99b0bed2 100644 --- a/test/benchmarks/benchmark_uncompress.cc +++ b/test/benchmarks/benchmark_uncompress.cc @@ -9,7 +9,7 @@ extern "C" { # include "zbuild.h" -# include "zutil_p.h" +# include "zutil.h" # if defined(ZLIB_COMPAT) # include "zlib.h" # else diff --git a/test/test_crc32.cc b/test/test_crc32.cc index 2f768d0c..60699fd7 100644 --- a/test/test_crc32.cc +++ b/test/test_crc32.cc @@ -9,7 +9,6 @@ #include #include #include "zutil.h" -#include "zutil_p.h" extern "C" { # include "zbuild.h" diff --git a/zlib_name_mangling-ng.h.in b/zlib_name_mangling-ng.h.in index e90904a7..b0a8b8e5 100644 --- a/zlib_name_mangling-ng.h.in +++ b/zlib_name_mangling-ng.h.in @@ -162,8 +162,6 @@ #define zng_vstring @ZLIB_SYMBOL_PREFIX@zng_vstring #define zng_zError @ZLIB_SYMBOL_PREFIX@zng_zError -#define zng_alloc_aligned @ZLIB_SYMBOL_PREFIX@zng_alloc_aligned -#define zng_free_aligned @ZLIB_SYMBOL_PREFIX@zng_free_aligned #define zng_get_crc_table @ZLIB_SYMBOL_PREFIX@zng_get_crc_table #define zng_inflateSyncPoint @ZLIB_SYMBOL_PREFIX@zng_inflateSyncPoint #define zng_inflateUndermine @ZLIB_SYMBOL_PREFIX@zng_inflateUndermine diff --git a/zlib_name_mangling.h.in b/zlib_name_mangling.h.in index f4961581..703a11e4 100644 --- a/zlib_name_mangling.h.in +++ b/zlib_name_mangling.h.in @@ -164,7 +164,5 @@ #define zlibng_version @ZLIB_SYMBOL_PREFIX@zlibng_version /* zlib-ng specific symbols */ -#define zng_alloc_aligned @ZLIB_SYMBOL_PREFIX@zng_alloc_aligned -#define zng_free_aligned @ZLIB_SYMBOL_PREFIX@zng_free_aligned #endif /* ZLIB_NAME_MANGLING_H */ diff --git a/zutil.c b/zutil.c index 99818c3a..7f6ff2f8 100644 --- a/zutil.c +++ b/zutil.c @@ -4,7 +4,6 @@ */ #include "zbuild.h" -#include "zutil_p.h" #include "zutil.h" z_const char * const PREFIX(z_errmsg)[10] = { @@ -100,6 +99,8 @@ const char * Z_EXPORT PREFIX(zError)(int err) { return ERR_MSG(err); } +// Zlib-ng's default alloc/free implementation, used unless +// application supplies its own alloc/free functions. void Z_INTERNAL *PREFIX(zcalloc)(void *opaque, unsigned items, unsigned size) { Z_UNUSED(opaque); return zng_alloc((size_t)items * (size_t)size); diff --git a/zutil.h b/zutil.h index a6284502..8c65dbba 100644 --- a/zutil.h +++ b/zutil.h @@ -137,4 +137,12 @@ void Z_INTERNAL PREFIX(zcfree)(void *opaque, void *ptr); typedef void *zng_calloc_func(void *opaque, unsigned items, unsigned size); typedef void zng_cfree_func(void *opaque, void *ptr); +static inline void *zng_alloc(size_t size) { + return calloc(1, size); +} + +static inline void zng_free(void *ptr) { + free(ptr); +} + #endif /* ZUTIL_H_ */ diff --git a/zutil_p.h b/zutil_p.h deleted file mode 100644 index 8f596eb4..00000000 --- a/zutil_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/* zutil_p.h -- Private inline functions used internally in zlib-ng - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#ifndef ZUTIL_P_H -#define ZUTIL_P_H - -#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_ALIGNED_ALLOC) -# include -#elif defined(__FreeBSD__) -# include -# include -#elif defined(HAVE_MEMALIGN) || defined(HAVE__ALIGNED_MALLOC) -# include -#else -/* Fallback, when no other aligned allocation function was found */ -# include -#endif - -/* Function to allocate 16 or 64-byte aligned memory */ -static inline void *zng_alloc(size_t size) { -#ifdef HAVE_ALIGNED_ALLOC - /* Size must be a multiple of alignment */ - size = (size + (64 - 1)) & ~(64 - 1); - return (void *)aligned_alloc(64, size); /* Defined in C11 */ -#elif defined(HAVE_POSIX_MEMALIGN) - void *ptr; - return posix_memalign(&ptr, 64, size) ? NULL : ptr; -#elif defined(HAVE__ALIGNED_MALLOC) - /* Fallback: Use MSVC extensions: _aligned_malloc() / _aligned_free() */ - return (void *)_aligned_malloc(size, 64); -#elif defined(HAVE_MEMALIGN) - /* Fallback: Use deprecated GNU extension: memalign() */ - return (void *)memalign(64, size); -#else - /* Fallback: Use a normal allocation (On macOS, alignment is 16 bytes) */ - /* zlib-ng adjust allocations for [de]compression to be properly aligned */ - return (void *)malloc(size); -#endif -} - -/* Function that can free aligned memory */ -static inline void zng_free(void *ptr) { -#if defined(HAVE__ALIGNED_MALLOC) && !defined(HAVE_POSIX_MEMALIGN) && !defined(HAVE_ALIGNED_ALLOC) - _aligned_free(ptr); -#else - free(ptr); -#endif -} - -#endif -- 2.47.2