[Darshan-commits] [Git][darshan/darshan][master] 2 commits: add wrappers for preadv, pwritev, preadv2, pwritev2, and their explicit 64 bit variants
Shane Snyder
xgitlab at cels.anl.gov
Tue Dec 1 13:54:33 CST 2020
Shane Snyder pushed to branch master at darshan / darshan
Commits:
8b1a7a09 by Philip Carns at 2020-12-01T13:54:29-06:00
add wrappers for preadv, pwritev, preadv2, pwritev2, and their explicit 64 bit variants
- - - - -
d4e2e8b5 by Shane Snyder at 2020-12-01T13:54:29-06:00
Merge branch 'carns/dev-289-pwritev' into 'master'
add wrappers for preadv, pwritev, preadv2, pwritev2, and their explicit 64 bit variants
Closes #289
See merge request darshan/darshan!69
- - - - -
6 changed files:
- ChangeLog
- darshan-runtime/configure
- darshan-runtime/configure.in
- darshan-runtime/darshan-runtime-config.h.in
- darshan-runtime/lib/darshan-posix.c
- darshan-runtime/share/ld-opts/darshan-posix-ld-opts
Changes:
=====================================
ChangeLog
=====================================
@@ -2,6 +2,11 @@
Darshan Release Change Log
--------------------------
+Darshan-3.2.2
+=============
+* add wrappers for preadv, preadv2, pwritev, and pwritev2 (improves profiling
+ of ompio)
+
Darshan-3.2.1
=============
* fixed bug causing corruption of Darshan common access
=====================================
darshan-runtime/configure
=====================================
@@ -1825,6 +1825,73 @@ $as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
@@ -4924,6 +4991,51 @@ $as_echo "#define HAVE_FSCANF_REDIRECT 1" >>confdefs.h
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# look for glibc-specific functions
+for ac_func in pwritev
+do :
+ ac_fn_c_check_func "$LINENO" "pwritev" "ac_cv_func_pwritev"
+if test "x$ac_cv_func_pwritev" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PWRITEV 1
+_ACEOF
+
+fi
+done
+
+for ac_func in preadv
+do :
+ ac_fn_c_check_func "$LINENO" "preadv" "ac_cv_func_preadv"
+if test "x$ac_cv_func_preadv" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PREADV 1
+_ACEOF
+
+fi
+done
+
+for ac_func in pwritev2
+do :
+ ac_fn_c_check_func "$LINENO" "pwritev2" "ac_cv_func_pwritev2"
+if test "x$ac_cv_func_pwritev2" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PWRITEV2 1
+_ACEOF
+
+fi
+done
+
+for ac_func in preadv2
+do :
+ ac_fn_c_check_func "$LINENO" "preadv2" "ac_cv_func_preadv2"
+if test "x$ac_cv_func_preadv2" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PREADV2 1
+_ACEOF
+
+fi
+done
+
DARSHAN_VERSION="3.2.1"
=====================================
darshan-runtime/configure.in
=====================================
@@ -495,6 +495,11 @@ AC_TRY_COMPILE(
DARSHAN_STDIO_ADD_FSCANF_LD_OPTS=""
)
+# look for glibc-specific functions
+AC_CHECK_FUNCS([pwritev],[],[])
+AC_CHECK_FUNCS([preadv],[],[])
+AC_CHECK_FUNCS([pwritev2],[],[])
+AC_CHECK_FUNCS([preadv2],[],[])
DARSHAN_VERSION="AC_PACKAGE_VERSION"
AC_SUBST(darshan_lib_path)
=====================================
darshan-runtime/darshan-runtime-config.h.in
=====================================
@@ -39,6 +39,18 @@
/* Define if off64_t type is defined */
#undef HAVE_OFF64_T
+/* Define to 1 if you have the `preadv' function. */
+#undef HAVE_PREADV
+
+/* Define to 1 if you have the `preadv2' function. */
+#undef HAVE_PREADV2
+
+/* Define to 1 if you have the `pwritev' function. */
+#undef HAVE_PWRITEV
+
+/* Define to 1 if you have the `pwritev2' function. */
+#undef HAVE_PWRITEV2
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
=====================================
darshan-runtime/lib/darshan-posix.c
=====================================
@@ -62,7 +62,23 @@ DARSHAN_FORWARD_DECL(pwrite, ssize_t, (int fd, const void *buf, size_t count, of
DARSHAN_FORWARD_DECL(pread64, ssize_t, (int fd, void *buf, size_t count, off64_t offset));
DARSHAN_FORWARD_DECL(pwrite64, ssize_t, (int fd, const void *buf, size_t count, off64_t offset));
DARSHAN_FORWARD_DECL(readv, ssize_t, (int fd, const struct iovec *iov, int iovcnt));
+#ifdef HAVE_PREADV
+ DARSHAN_FORWARD_DECL(preadv, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off_t offset));
+ DARSHAN_FORWARD_DECL(preadv64, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off64_t offset));
+#endif
+#ifdef HAVE_PREADV2
+ DARSHAN_FORWARD_DECL(preadv2, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags));
+ DARSHAN_FORWARD_DECL(preadv64v2, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off64_t offset, int flags));
+#endif
DARSHAN_FORWARD_DECL(writev, ssize_t, (int fd, const struct iovec *iov, int iovcnt));
+#ifdef HAVE_PWRITEV
+ DARSHAN_FORWARD_DECL(pwritev, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off_t offset));
+ DARSHAN_FORWARD_DECL(pwritev64, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off64_t offset));
+#endif
+#ifdef HAVE_PWRITEV2
+ DARSHAN_FORWARD_DECL(pwritev2, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags));
+ DARSHAN_FORWARD_DECL(pwritev64v2, ssize_t, (int fd, const struct iovec *iov, int iovcnt, off64_t offset, int flags));
+#endif
DARSHAN_FORWARD_DECL(lseek, off_t, (int fd, off_t offset, int whence));
DARSHAN_FORWARD_DECL(lseek64, off64_t, (int fd, off64_t offset, int whence));
DARSHAN_FORWARD_DECL(__xstat, int, (int vers, const char* path, struct stat *buf));
@@ -991,6 +1007,115 @@ ssize_t DARSHAN_DECL(readv)(int fd, const struct iovec *iov, int iovcnt)
return(ret);
}
+#ifdef HAVE_PREADV
+ssize_t DARSHAN_DECL(preadv)(int fd, const struct iovec *iov, int iovcnt, off_t offset)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(preadv);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_preadv(fd, iov, iovcnt, offset);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_READ(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+ssize_t DARSHAN_DECL(preadv64)(int fd, const struct iovec *iov, int iovcnt, off64_t offset)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(preadv64);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_preadv64(fd, iov, iovcnt, offset);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_READ(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+#endif /* HAVE_PREADV */
+
+#ifdef HAVE_PREADV2
+ssize_t DARSHAN_DECL(preadv2)(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(preadv2);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_preadv2(fd, iov, iovcnt, offset, flags);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_READ(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+ssize_t DARSHAN_DECL(preadv64v2)(int fd, const struct iovec *iov, int iovcnt, off64_t offset, int flags)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(preadv64v2);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_preadv64v2(fd, iov, iovcnt, offset, flags);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_READ(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+#endif /* HAVE_PREADV2 */
+
ssize_t DARSHAN_DECL(writev)(int fd, const struct iovec *iov, int iovcnt)
{
ssize_t ret;
@@ -1017,6 +1142,115 @@ ssize_t DARSHAN_DECL(writev)(int fd, const struct iovec *iov, int iovcnt)
return(ret);
}
+#ifdef HAVE_PWRITEV
+ssize_t DARSHAN_DECL(pwritev)(int fd, const struct iovec *iov, int iovcnt, off_t offset)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(pwritev);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_pwritev(fd, iov, iovcnt, offset);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_WRITE(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+ssize_t DARSHAN_DECL(pwritev64)(int fd, const struct iovec *iov, int iovcnt, off64_t offset)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(pwritev64);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_pwritev64(fd, iov, iovcnt, offset);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_WRITE(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+#endif /* HAVE_PWRITEV */
+
+#ifdef HAVE_PWRITEV2
+ssize_t DARSHAN_DECL(pwritev2)(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(pwritev2);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_pwritev2(fd, iov, iovcnt, offset, flags);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_WRITE(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+ssize_t DARSHAN_DECL(pwritev64v2)(int fd, const struct iovec *iov, int iovcnt, off64_t offset, int flags)
+{
+ ssize_t ret;
+ int aligned_flag = 1;
+ int i;
+ double tm1, tm2;
+
+ MAP_OR_FAIL(pwritev64v2);
+
+ for(i=0; i<iovcnt; i++)
+ {
+ if(((unsigned long)iov[i].iov_base % darshan_mem_alignment) != 0)
+ aligned_flag = 0;
+ }
+
+ tm1 = darshan_core_wtime();
+ ret = __real_pwritev64v2(fd, iov, iovcnt, offset, flags);
+ tm2 = darshan_core_wtime();
+
+ POSIX_PRE_RECORD();
+ POSIX_RECORD_WRITE(ret, fd, 1, offset, aligned_flag, tm1, tm2);
+ POSIX_POST_RECORD();
+
+ return(ret);
+}
+
+#endif
+
off_t DARSHAN_DECL(lseek)(int fd, off_t offset, int whence)
{
off_t ret;
=====================================
darshan-runtime/share/ld-opts/darshan-posix-ld-opts
=====================================
@@ -19,7 +19,15 @@
--wrap=pread64
--wrap=pwrite64
--wrap=readv
+--wrap=preadv
+--wrap=preadv2
+--wrap=preadv64
+--wrap=preadv64v2
--wrap=writev
+--wrap=pwritev
+--wrap=pwritev2
+--wrap=pwritev64
+--wrap=pwritev64v2
--wrap=lseek
--wrap=lseek64
--wrap=__xstat
View it on GitLab: https://xgitlab.cels.anl.gov/darshan/darshan/-/compare/583afaa13a78881a90582abdd12523752b77f740...d4e2e8b5399c122f31cea1e74401e7335b96226f
--
View it on GitLab: https://xgitlab.cels.anl.gov/darshan/darshan/-/compare/583afaa13a78881a90582abdd12523752b77f740...d4e2e8b5399c122f31cea1e74401e7335b96226f
You're receiving this email because of your account on xgitlab.cels.anl.gov.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/darshan-commits/attachments/20201201/4ad61214/attachment-0001.html>
More information about the Darshan-commits
mailing list