From 0f5141979a5f025678cfad4f14cb9a6c43d8d2ec Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 3 Apr 2015 15:12:58 +0200 Subject: [PATCH 1/2] cmake: on UNIX systems force 64b overrides of stat(), fstat(), ... --- CMakeLists.txt | 35 ++++++++++++++++++++++++++++++++++- src/gmio_core/stream.c | 9 --------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2650bdc..8ad8289 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,14 +62,47 @@ if(NOT BUILD_STRICT_C90) check_include_files(stdbool.h GMIO_HAVE_STDBOOL_H) # Check POSIX features + if(UNIX) + # See: + # http://linux.die.net/man/2/fstat64 + # https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fstat.2.html + # https://www.gnu.org/software/libc/manual/html_mono/libc.html#Feature-Test-Macros + if(APPLE) + add_definitions(-D_DARWIN_USE_64_BIT_INODE) + else() + add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE) + endif() + endif() + check_include_files(sys/types.h GMIO_HAVE_SYS_TYPES_H) check_include_files(sys/stat.h GMIO_HAVE_SYS_STAT_H) check_function_exists(fileno GMIO_HAVE_POSIX_FILENO_FUNC) - check_function_exists(fstat64 GMIO_HAVE_POSIX_FSTAT64_FUNC) + # Have POSIX fstat64() ? + check_c_source_compiles( + "#include + int main() { fstat64(0, NULL); return 0; }" + GMIO_HAVE_POSIX_FSTAT64_FUNC) if(WIN32) check_function_exists(_fstat64 GMIO_HAVE_WIN__FSTAT64_FUNC) endif() + # Check sizeof(struct stat[64]) + set(CMAKE_EXTRA_INCLUDE_FILES sys/stat.h) + if(GMIO_HAVE_WIN__FSTAT64_FUNC) + check_type_size("((struct _stat64*)0)->st_size" GMIO_SIZEOF_STRUCT_STAT_ST_SIZE) + elsif(GMIO_HAVE_POSIX_FSTAT64_FUNC) + check_type_size("((struct stat64*)0)->st_size" GMIO_SIZEOF_STRUCT_STAT_ST_SIZE) + else() + check_type_size("((struct stat*)0)->st_size" GMIO_SIZEOF_STRUCT_STAT_ST_SIZE) + endif() + set(CMAKE_EXTRA_INCLUDE_FILES) + + if(GMIO_HAVE_SYS_STAT_H + AND NOT(GMIO_SIZEOF_STRUCT_STAT_ST_SIZE STREQUAL "0") # Not arch-dependent size + AND NOT(GMIO_SIZEOF_STRUCT_STAT_ST_SIZE EQUAL 8)) + message(WARNING " does not provide 64b variant of fstat(), you may encounter problems with files > 2GB") + endif() + # Have BSD-like alloca() function ? check_c_source_compiles( "#include diff --git a/src/gmio_core/stream.c b/src/gmio_core/stream.c index 1899305..61fb13f 100644 --- a/src/gmio_core/stream.c +++ b/src/gmio_core/stream.c @@ -20,15 +20,6 @@ #include #if defined(GMIO_HAVE_SYS_TYPES_H) && defined(GMIO_HAVE_SYS_STAT_H) - -/* For some platforms maybe it's better to override stat(), fstat(), etc. with - * 64bit variants. See: - * http://linux.die.net/man/2/fstat64 - * #define _FILE_OFFSET_BITS 64 - * https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fstat.2.html - * #define _DARWIN_USE_64_BIT_INODE - */ - # include # include From 85839abf0027a5b734c4a50ebb5af89331157c7b Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 3 Apr 2015 15:15:01 +0200 Subject: [PATCH 2/2] gmio_core: get rid of alloca() support --- CMakeLists.txt | 14 -------------- src/gmio_core/buffer.c | 32 -------------------------------- src/gmio_core/buffer.h | 3 --- src/gmio_core/config.h.cmake | 4 ---- 4 files changed, 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ad8289..9d89beb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,20 +103,6 @@ if(NOT BUILD_STRICT_C90) message(WARNING " does not provide 64b variant of fstat(), you may encounter problems with files > 2GB") endif() - # Have BSD-like alloca() function ? - check_c_source_compiles( - "#include - int main() { void* ptr = alloca(256); return 0; }" - GMIO_HAVE_BSD_ALLOCA_FUNC) - - # Have Win32 _alloca() function ? - if(WIN32) - check_c_source_compiles( - "#include - int main() { void* ptr = _alloca(256); return 0; }" - GMIO_HAVE_WIN__ALLOCA_FUNC) - endif() - # Have builtin byte swap functions ? if(CMAKE_COMPILER_IS_GNUCC) # __builtin_bswap16() is missing in x86 GCC version prior to v4.7 diff --git a/src/gmio_core/buffer.c b/src/gmio_core/buffer.c index 145f5eb..6ab7370 100644 --- a/src/gmio_core/buffer.c +++ b/src/gmio_core/buffer.c @@ -17,14 +17,6 @@ #include -#if defined(GMIO_HAVE_BSD_ALLOCA_FUNC) -# include -#elif defined(GMIO_HAVE_WIN__ALLOCA_FUNC) -# include "error.h" -# include -# include -#endif - GMIO_INLINE gmio_buffer_t gmio_buffer_null() { gmio_buffer_t buff = { 0 }; @@ -56,30 +48,6 @@ gmio_buffer_t gmio_buffer_realloc(void* ptr, size_t size) return gmio_buffer(realloc(ptr, size), size, &free); } -gmio_buffer_t gmio_buffer_alloca(size_t size) -{ -#if defined(GMIO_HAVE_BSD_ALLOCA_FUNC) - return gmio_buffer(alloca(size), size, NULL); -#elif defined(GMIO_HAVE_WIN__ALLOCA_FUNC) -# ifdef _MSC_VER - __try { - return gmio_buffer(_alloca(size), size, NULL); - } - __except(GetExceptionCode() == STATUS_STACK_OVERFLOW) { - /* The stack overflowed */ - if (_resetstkoflw() == 0) - exit(GMIO_ERROR_UNKNOWN); - return gmio_buffer_null(); - } -# else - return gmio_buffer(_alloca(size), size, NULL); -# endif /* _MSC_VER */ -#else - GMIO_UNUSED(size); - return gmio_buffer_null(); -#endif -} - void gmio_buffer_deallocate(gmio_buffer_t *buffer) { if (buffer != NULL && buffer->deallocate_func != NULL) diff --git a/src/gmio_core/buffer.h b/src/gmio_core/buffer.h index df4f39f..c0f35a5 100644 --- a/src/gmio_core/buffer.h +++ b/src/gmio_core/buffer.h @@ -57,9 +57,6 @@ GMIO_LIB_EXPORT gmio_buffer_t gmio_buffer_calloc(size_t num, size_t size); /*! Returns a gmio_buffer object allocated with standard \c realloc() */ GMIO_LIB_EXPORT gmio_buffer_t gmio_buffer_realloc(void* ptr, size_t size); -/*! Returns a gmio_buffer object allocated with OS-specific \c alloca() */ -GMIO_LIB_EXPORT gmio_buffer_t gmio_buffer_alloca(size_t size); - /*! Safe and convenient call to gmio_buffer::deallocate_func() */ GMIO_LIB_EXPORT void gmio_buffer_deallocate(gmio_buffer_t* buffer); diff --git a/src/gmio_core/config.h.cmake b/src/gmio_core/config.h.cmake index eb24798..974dd35 100644 --- a/src/gmio_core/config.h.cmake +++ b/src/gmio_core/config.h.cmake @@ -37,10 +37,6 @@ #cmakedefine GMIO_HAVE_POSIX_FSTAT64_FUNC #cmakedefine GMIO_HAVE_WIN__FSTAT64_FUNC -/* alloca()-like */ -#cmakedefine GMIO_HAVE_BSD_ALLOCA_FUNC -#cmakedefine GMIO_HAVE_WIN__ALLOCA_FUNC - /* Compiler byte-swap functions */ #cmakedefine GMIO_HAVE_GCC_BUILTIN_BSWAP16_FUNC #cmakedefine GMIO_HAVE_GCC_BUILTIN_BSWAP32_FUNC