]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add libc_test to workaround pth_cond_destroy_busy test hangs.
authorMark Wielaard <mark@klomp.org>
Fri, 21 Oct 2016 00:02:10 +0000 (00:02 +0000)
committerMark Wielaard <mark@klomp.org>
Fri, 21 Oct 2016 00:02:10 +0000 (00:02 +0000)
This is a workaround for bug #371396. It adds a new test program
that can be used skip tests given a specific libc implementation
and optionally a specific minimum version. Currently only glibc
is recognized. This is used for the drd and helgrind tests
pth_cond_destroy_busy to be skipped on glibc 2.24.90+.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16097

drd/tests/pth_cond_destroy_busy.vgtest
helgrind/tests/pth_cond_destroy_busy.vgtest
tests/Makefile.am
tests/libc_test.c [new file with mode: 0644]

index eafbd7473afd89f5822e87dc6d8ff7e929bb29a4..f3cf778252ae71e0c0b7c9a46bc2659bb65a1d57 100644 (file)
@@ -1,2 +1,2 @@
-prereq: ./supported_libpthread
+prereq: ./supported_libpthread && ! ../../tests/libc_test glibc 2.24.90
 prog: pth_cond_destroy_busy
index 45d7853c0efd84d5b5c35c9e114066e10cc70f41..2957cc3266f3202ff4dc2c7cb9354406417f5b9f 100644 (file)
@@ -1,2 +1,2 @@
-prereq: ! ../../tests/os_test darwin
+prereq: ! ../../tests/os_test darwin && ! ../../tests/libc_test glibc 2.24.90
 prog: ../../drd/tests/pth_cond_destroy_busy
index 9c0cc3a053272e39e5dfa754e66de1ef038a745b..72336266470dff7071b8100e3ed893ba51f0ce65 100644 (file)
@@ -44,6 +44,7 @@ noinst_HEADERS = \
 check_PROGRAMS = \
        arch_test \
        os_test \
+       libc_test \
        true \
        x86_amd64_features \
        s390x_features \
diff --git a/tests/libc_test.c b/tests/libc_test.c
new file mode 100644 (file)
index 0000000..0de3d5d
--- /dev/null
@@ -0,0 +1,78 @@
+// Compare given libc name and version number to system name and version.
+
+// Returns
+// - 0 if the libc name matches is at least the minimum version (if given).
+// - 1 if the libc name doesn't match or the version is lower than requested.
+// - 2 if the requested libc name isn't recognised.
+// - 3 if there was a usage error (it also prints an error message).
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __GLIBC__
+#include <gnu/libc-version.h>
+#endif
+
+#define False  0
+#define True   1
+typedef int    Bool;
+
+/* Assumes the versions are x.y.z, with y and z optional. */
+static Bool matches_version(char *min_version) {
+   int a1=0, a2=0, a3=0, g1=0, g2=0, g3=0;  // 'a' = actual;  'g' = given
+   const char *aversion;
+
+   if (min_version == NULL)  return True;  // no version specified
+
+   // get actual version number
+#ifdef __GLIBC__
+   aversion = gnu_get_libc_version();
+#else
+   aversion = "unknown";
+#endif
+   // We expect at least one number.
+   if (sscanf(aversion, "%d.%d.%d", &a1, &a2, &a3) < 1) return False;
+
+   // parse given version number.
+   if (sscanf(min_version, "%d.%d.%d", &g1, &g2, &g3) < 1) return False;
+
+   if (a1 > g1) return True;
+   if (a1 < g1) return False;
+   if (a2 > g2) return True;
+   if (a2 < g2) return False;
+   if (a3 >= g3) return True;
+
+   return False;
+}
+
+static Bool go(char* libc, char *min_version)
+{
+#ifdef __GLIBC__
+   if ( 0 == strcmp( libc, "glibc" )
+       && matches_version( min_version ))
+      return True;
+#endif
+
+   return False;
+}
+
+//---------------------------------------------------------------------------
+// main
+//---------------------------------------------------------------------------
+int main(int argc, char **argv)
+{
+   if ( argc < 2 ) {
+      fprintf( stderr, "usage: libc_test <libc-name> [<min-version>]\n" );
+      exit(3);             // Usage error.
+   }
+   if (go( argv[1], argv[2] )) {
+      return 0;            // Matched.
+   }
+
+   if ( 0 == strcmp ( argv[1], "glibc" ) ) {
+     return 1;             // Requested libc name known, but this isn't it.
+                           // Or it wasn't the minimum requested version.
+   }
+   return 2;               // Didn't match any known libc name.
+}