]> granicus.if.org Git - graphviz/commitdiff
sfio: use a more portable way of determining page size
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 16 Oct 2022 21:48:06 +0000 (14:48 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 10 Nov 2022 02:59:49 +0000 (18:59 -0800)
This code was using a legacy API, `getpagesize`, to opportunistically find the
system virtual memory page size. This change updates to the newer POSIX
`sysconf` API that is available almost everywhere, and adds a workaround for
Windows. This code now has an accurate understanding of the page size on
platforms that did not have `getpagesize` (of which, Windows was one), rather
than falling back on 8192.

cmake/config_checks.cmake
config-cmake.h.in
configure.ac
lib/sfio/sfhdr.h
lib/sfio/sfsetbuf.c

index 135df6b5e7a93aec57083349bba285c467c1f5b2..ab4150d958e5c54836fae2e3fd05e5420fe19e25 100644 (file)
@@ -20,7 +20,6 @@ include(CheckFunctionExists)
 
 check_function_exists( dl_iterate_phdr  HAVE_DL_ITERATE_PHDR )
 check_function_exists( drand48          HAVE_DRAND48         )
-check_function_exists( getpagesize      HAVE_GETPAGESIZE     )
 check_function_exists( lrand48          HAVE_LRAND48         )
 check_function_exists( setenv           HAVE_SETENV          )
 check_function_exists( setmode          HAVE_SETMODE         )
index 48545035408f5b82a69a67514e0e3c96227e7e30..af276ecac5c67242c375d0d811c469e0ee44cd34 100644 (file)
@@ -16,7 +16,6 @@
 // Functions
 #cmakedefine HAVE_DL_ITERATE_PHDR
 #cmakedefine HAVE_DRAND48
-#cmakedefine HAVE_GETPAGESIZE
 #cmakedefine HAVE_LRAND48
 #cmakedefine HAVE_SETENV
 #cmakedefine HAVE_SETMODE
index 9c667e7149c25fbbb6c0b6e92061fd5582116fdb..82f7e4a152792ba73fe2232237558ec29c6f2af0 100644 (file)
@@ -465,7 +465,6 @@ LIBS=$save_LIBS
 
 # Checks for library functions
 AC_CHECK_FUNCS([lrand48 drand48 srand48 setmode setenv \
-       getpagesize \
   ftruncate lseek64 stat64 select dl_iterate_phdr])
 
 AC_REPLACE_FUNCS([strcasestr])
index 8c80b1b95190db368e92b63d65a4963dbf4cabd5..0ca76f3f06cf1e930d3c13e0fcce18cb5b666ecb 100644 (file)
@@ -313,7 +313,6 @@ extern "C" {
 
 /* grain size for buffer increment */
 #define SF_GRAIN       1024
-#define SF_PAGE                ((ssize_t)(SF_GRAIN*sizeof(int)*2))
 
 /* when the buffer is empty, certain io requests may be better done directly
    on the given application buffers. The below condition determines when.
index a4dceb0af5ae66b0b2fe6ac8bd3a58a80df09af2..2e219b9f296d43fef6454ea12ac8a556e8195f08 100644 (file)
 
 #include <stddef.h>
 #include       <sfio/sfhdr.h>
+#include <unistd.h>
 
-#ifdef HAVE_GETPAGESIZE
-       extern int getpagesize(void);
+#ifdef _WIN32
+#include <windows.h>
+#include <sysinfoapi.h>
 #endif
+
+static ssize_t get_page_size(void) {
+#ifdef _WIN32
+  SYSTEM_INFO info;
+  GetSystemInfo(&info);
+  return (ssize_t)info.dwPageSize;
+#else
+  return (ssize_t)sysconf(_SC_PAGESIZE);
+#endif
+}
+
 /*     Set a (new) buffer for a stream.
 **     If size < 0, it is assigned a suitable value depending on the
 **     kind of stream. The actual buffer size allocated is dependent
@@ -185,10 +198,7 @@ void *sfsetbuf(Sfio_t * f, void * buf, size_t size)
 
        /* set page size, this is also the desired default buffer size */
        if (_Sfpage <= 0) {
-#ifdef HAVE_GETPAGESIZE
-           if ((_Sfpage = (size_t) getpagesize()) <= 0)
-#endif
-               _Sfpage = SF_PAGE;
+               _Sfpage = get_page_size();
        }
     }