From: Bruno Haible <bruno@clisp.org> Date: Sat, 21 Dec 2019 06:41:08 +0000 (+0100) Subject: New convention for multithread-safety tests. X-Git-Tag: v1.0~4461 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=8837821a2711ae84725a080467daef262a037f02;p=gnulib.git New convention for multithread-safety tests. * tests/test-setlocale_null-mt-one.c: Renamed from tests/test-setlocale_null-one.c. * tests/test-setlocale_null-mt-all.c: Renamed from tests/test-setlocale_null-all.c. * modules/setlocale-null-tests (Files, Makefile.am): Update. --- diff --git a/ChangeLog b/ChangeLog index b38bbe23ab..7dc34641ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2019-12-21 Bruno Haible <bruno@clisp.org> + + New convention for multithread-safety tests. + * tests/test-setlocale_null-mt-one.c: Renamed from + tests/test-setlocale_null-one.c. + * tests/test-setlocale_null-mt-all.c: Renamed from + tests/test-setlocale_null-all.c. + * modules/setlocale-null-tests (Files, Makefile.am): Update. + 2019-12-21 Bruno Haible <bruno@clisp.org> quotearg tests: Fix conflict with hard-locale tests. diff --git a/modules/setlocale-null-tests b/modules/setlocale-null-tests index 2114848ac4..f794711e39 100644 --- a/modules/setlocale-null-tests +++ b/modules/setlocale-null-tests @@ -1,7 +1,7 @@ Files: tests/test-setlocale_null.c -tests/test-setlocale_null-one.c -tests/test-setlocale_null-all.c +tests/test-setlocale_null-mt-one.c +tests/test-setlocale_null-mt-all.c Depends-on: thread @@ -12,12 +12,12 @@ configure.ac: Makefile.am: TESTS += \ test-setlocale_null \ - test-setlocale_null-one \ - test-setlocale_null-all + test-setlocale_null-mt-one \ + test-setlocale_null-mt-all check_PROGRAMS += \ test-setlocale_null \ - test-setlocale_null-one \ - test-setlocale_null-all + test-setlocale_null-mt-one \ + test-setlocale_null-mt-all test_setlocale_null_LDADD = $(LDADD) @LIB_SETLOCALE_NULL@ -test_setlocale_null_one_LDADD = $(LDADD) @LIB_SETLOCALE_NULL@ $(LIBMULTITHREAD) $(LIB_NANOSLEEP) -test_setlocale_null_all_LDADD = $(LDADD) @LIB_SETLOCALE_NULL@ $(LIBMULTITHREAD) $(LIB_NANOSLEEP) +test_setlocale_null_mt_one_LDADD = $(LDADD) @LIB_SETLOCALE_NULL@ $(LIBMULTITHREAD) $(LIB_NANOSLEEP) +test_setlocale_null_mt_all_LDADD = $(LDADD) @LIB_SETLOCALE_NULL@ $(LIBMULTITHREAD) $(LIB_NANOSLEEP) diff --git a/tests/test-setlocale_null-all.c b/tests/test-setlocale_null-all.c deleted file mode 100644 index abf2df4bce..0000000000 --- a/tests/test-setlocale_null-all.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Multithread-safety test for setlocale_null_r (LC_ALL, ...). - Copyright (C) 2019 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. */ - -/* Written by Bruno Haible <bruno@clisp.org>, 2019. */ - -#include <config.h> - -/* Specification. */ -#include <locale.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "glthread/thread.h" - -/* We want to use the system's setlocale() function here, not the gnulib - override. */ -#undef setlocale - - -/* Some common locale names. */ - -#if defined _WIN32 && !defined __CYGWIN__ -# define ENGLISH "English_United States" -# define GERMAN "German_Germany" -# define FRENCH "French_France" -# define ENCODING ".1252" -#else -# define ENGLISH "en_US" -# define GERMAN "de_DE" -# define FRENCH "fr_FR" -# if defined __sgi -# define ENCODING ".ISO8859-15" -# elif defined __hpux -# define ENCODING ".utf8" -# else -# define ENCODING ".UTF-8" -# endif -#endif - -static const char LOCALE1[] = ENGLISH ENCODING; -static const char LOCALE2[] = GERMAN ENCODING; -static const char LOCALE3[] = FRENCH ENCODING; - -static char *expected; - -static void * -thread1_func (void *arg) -{ - for (;;) - { - char buf[SETLOCALE_NULL_ALL_MAX]; - - if (setlocale_null_r (LC_ALL, buf, sizeof (buf))) - abort (); - if (strcmp (expected, buf) != 0) - { - fprintf (stderr, "thread1 disturbed by thread2!\n"); fflush (stderr); - abort (); - } - } - - /*NOTREACHED*/ - return NULL; -} - -static void * -thread2_func (void *arg) -{ - for (;;) - { - char buf[SETLOCALE_NULL_ALL_MAX]; - - setlocale_null_r (LC_NUMERIC, buf, sizeof (buf)); - setlocale_null_r (LC_ALL, buf, sizeof (buf)); - } - - /*NOTREACHED*/ - return NULL; -} - -int -main (int argc, char *argv[]) -{ - if (setlocale (LC_ALL, LOCALE1) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE1 not recognized\n"); - return 77; - } - if (setlocale (LC_NUMERIC, LOCALE2) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE2 not recognized\n"); - return 77; - } - if (setlocale (LC_TIME, LOCALE3) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE3 not recognized\n"); - return 77; - } - - expected = strdup (setlocale (LC_ALL, NULL)); - - /* Create the two threads. */ - gl_thread_create (thread1_func, NULL); - gl_thread_create (thread2_func, NULL); - - /* Let them run for 5 seconds. */ - { - struct timespec duration; - duration.tv_sec = 5; - duration.tv_nsec = 0; - - nanosleep (&duration, NULL); - } - - return 0; -} - -/* Without locking, the results of this test would be: -glibc OK -musl libc crash < 10 sec -macOS crash < 1 sec -FreeBSD crash < 1 sec -NetBSD crash < 2 sec -OpenBSD crash < 1 sec -AIX crash < 2 sec -HP-UX OK -IRIX OK -Solaris 10 OK -Solaris 11.0 OK -Solaris 11.4 OK -Solaris OpenIndiana OK -Haiku crash < 1 sec -Cygwin crash < 1 sec -mingw OK -MSVC OK (assuming compiler option /MD !) -*/ diff --git a/tests/test-setlocale_null-mt-all.c b/tests/test-setlocale_null-mt-all.c new file mode 100644 index 0000000000..abf2df4bce --- /dev/null +++ b/tests/test-setlocale_null-mt-all.c @@ -0,0 +1,152 @@ +/* Multithread-safety test for setlocale_null_r (LC_ALL, ...). + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +/* Written by Bruno Haible <bruno@clisp.org>, 2019. */ + +#include <config.h> + +/* Specification. */ +#include <locale.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#include "glthread/thread.h" + +/* We want to use the system's setlocale() function here, not the gnulib + override. */ +#undef setlocale + + +/* Some common locale names. */ + +#if defined _WIN32 && !defined __CYGWIN__ +# define ENGLISH "English_United States" +# define GERMAN "German_Germany" +# define FRENCH "French_France" +# define ENCODING ".1252" +#else +# define ENGLISH "en_US" +# define GERMAN "de_DE" +# define FRENCH "fr_FR" +# if defined __sgi +# define ENCODING ".ISO8859-15" +# elif defined __hpux +# define ENCODING ".utf8" +# else +# define ENCODING ".UTF-8" +# endif +#endif + +static const char LOCALE1[] = ENGLISH ENCODING; +static const char LOCALE2[] = GERMAN ENCODING; +static const char LOCALE3[] = FRENCH ENCODING; + +static char *expected; + +static void * +thread1_func (void *arg) +{ + for (;;) + { + char buf[SETLOCALE_NULL_ALL_MAX]; + + if (setlocale_null_r (LC_ALL, buf, sizeof (buf))) + abort (); + if (strcmp (expected, buf) != 0) + { + fprintf (stderr, "thread1 disturbed by thread2!\n"); fflush (stderr); + abort (); + } + } + + /*NOTREACHED*/ + return NULL; +} + +static void * +thread2_func (void *arg) +{ + for (;;) + { + char buf[SETLOCALE_NULL_ALL_MAX]; + + setlocale_null_r (LC_NUMERIC, buf, sizeof (buf)); + setlocale_null_r (LC_ALL, buf, sizeof (buf)); + } + + /*NOTREACHED*/ + return NULL; +} + +int +main (int argc, char *argv[]) +{ + if (setlocale (LC_ALL, LOCALE1) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE1 not recognized\n"); + return 77; + } + if (setlocale (LC_NUMERIC, LOCALE2) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE2 not recognized\n"); + return 77; + } + if (setlocale (LC_TIME, LOCALE3) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE3 not recognized\n"); + return 77; + } + + expected = strdup (setlocale (LC_ALL, NULL)); + + /* Create the two threads. */ + gl_thread_create (thread1_func, NULL); + gl_thread_create (thread2_func, NULL); + + /* Let them run for 5 seconds. */ + { + struct timespec duration; + duration.tv_sec = 5; + duration.tv_nsec = 0; + + nanosleep (&duration, NULL); + } + + return 0; +} + +/* Without locking, the results of this test would be: +glibc OK +musl libc crash < 10 sec +macOS crash < 1 sec +FreeBSD crash < 1 sec +NetBSD crash < 2 sec +OpenBSD crash < 1 sec +AIX crash < 2 sec +HP-UX OK +IRIX OK +Solaris 10 OK +Solaris 11.0 OK +Solaris 11.4 OK +Solaris OpenIndiana OK +Haiku crash < 1 sec +Cygwin crash < 1 sec +mingw OK +MSVC OK (assuming compiler option /MD !) +*/ diff --git a/tests/test-setlocale_null-mt-one.c b/tests/test-setlocale_null-mt-one.c new file mode 100644 index 0000000000..a83e485656 --- /dev/null +++ b/tests/test-setlocale_null-mt-one.c @@ -0,0 +1,152 @@ +/* Multithread-safety test for setlocale_null_r (LC_xxx, ...). + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +/* Written by Bruno Haible <bruno@clisp.org>, 2019. */ + +#include <config.h> + +/* Specification. */ +#include <locale.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#include "glthread/thread.h" + +/* We want to use the system's setlocale() function here, not the gnulib + override. */ +#undef setlocale + + +/* Some common locale names. */ + +#if defined _WIN32 && !defined __CYGWIN__ +# define ENGLISH "English_United States" +# define GERMAN "German_Germany" +# define FRENCH "French_France" +# define ENCODING ".1252" +#else +# define ENGLISH "en_US" +# define GERMAN "de_DE" +# define FRENCH "fr_FR" +# if defined __sgi +# define ENCODING ".ISO8859-15" +# elif defined __hpux +# define ENCODING ".utf8" +# else +# define ENCODING ".UTF-8" +# endif +#endif + +static const char LOCALE1[] = ENGLISH ENCODING; +static const char LOCALE2[] = GERMAN ENCODING; +static const char LOCALE3[] = FRENCH ENCODING; + +static char *expected; + +static void * +thread1_func (void *arg) +{ + for (;;) + { + char buf[SETLOCALE_NULL_MAX]; + + if (setlocale_null_r (LC_NUMERIC, buf, sizeof (buf))) + abort (); + if (strcmp (expected, buf) != 0) + { + fprintf (stderr, "thread1 disturbed by thread2!\n"); fflush (stderr); + abort (); + } + } + + /*NOTREACHED*/ + return NULL; +} + +static void * +thread2_func (void *arg) +{ + for (;;) + { + char buf[SETLOCALE_NULL_MAX]; + + setlocale_null_r (LC_NUMERIC, buf, sizeof (buf)); + setlocale_null_r (LC_TIME, buf, sizeof (buf)); + } + + /*NOTREACHED*/ + return NULL; +} + +int +main (int argc, char *argv[]) +{ + if (setlocale (LC_ALL, LOCALE1) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE1 not recognized\n"); + return 77; + } + if (setlocale (LC_NUMERIC, LOCALE2) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE2 not recognized\n"); + return 77; + } + if (setlocale (LC_TIME, LOCALE3) == NULL) + { + fprintf (stderr, "Skipping test: LOCALE3 not recognized\n"); + return 77; + } + + expected = strdup (setlocale (LC_NUMERIC, NULL)); + + /* Create the two threads. */ + gl_thread_create (thread1_func, NULL); + gl_thread_create (thread2_func, NULL); + + /* Let them run for 2 seconds. */ + { + struct timespec duration; + duration.tv_sec = 2; + duration.tv_nsec = 0; + + nanosleep (&duration, NULL); + } + + return 0; +} + +/* Without locking, the results of this test would be: +glibc OK +musl libc OK +macOS OK +FreeBSD OK +NetBSD OK +OpenBSD crash < 1 sec +AIX crash < 2 sec +HP-UX OK +IRIX OK +Solaris 10 OK +Solaris 11.0 OK +Solaris 11.4 OK +Solaris OpenIndiana OK +Haiku OK +Cygwin OK +mingw OK +MSVC OK (assuming compiler option /MD !) +*/ diff --git a/tests/test-setlocale_null-one.c b/tests/test-setlocale_null-one.c deleted file mode 100644 index a83e485656..0000000000 --- a/tests/test-setlocale_null-one.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Multithread-safety test for setlocale_null_r (LC_xxx, ...). - Copyright (C) 2019 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. */ - -/* Written by Bruno Haible <bruno@clisp.org>, 2019. */ - -#include <config.h> - -/* Specification. */ -#include <locale.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "glthread/thread.h" - -/* We want to use the system's setlocale() function here, not the gnulib - override. */ -#undef setlocale - - -/* Some common locale names. */ - -#if defined _WIN32 && !defined __CYGWIN__ -# define ENGLISH "English_United States" -# define GERMAN "German_Germany" -# define FRENCH "French_France" -# define ENCODING ".1252" -#else -# define ENGLISH "en_US" -# define GERMAN "de_DE" -# define FRENCH "fr_FR" -# if defined __sgi -# define ENCODING ".ISO8859-15" -# elif defined __hpux -# define ENCODING ".utf8" -# else -# define ENCODING ".UTF-8" -# endif -#endif - -static const char LOCALE1[] = ENGLISH ENCODING; -static const char LOCALE2[] = GERMAN ENCODING; -static const char LOCALE3[] = FRENCH ENCODING; - -static char *expected; - -static void * -thread1_func (void *arg) -{ - for (;;) - { - char buf[SETLOCALE_NULL_MAX]; - - if (setlocale_null_r (LC_NUMERIC, buf, sizeof (buf))) - abort (); - if (strcmp (expected, buf) != 0) - { - fprintf (stderr, "thread1 disturbed by thread2!\n"); fflush (stderr); - abort (); - } - } - - /*NOTREACHED*/ - return NULL; -} - -static void * -thread2_func (void *arg) -{ - for (;;) - { - char buf[SETLOCALE_NULL_MAX]; - - setlocale_null_r (LC_NUMERIC, buf, sizeof (buf)); - setlocale_null_r (LC_TIME, buf, sizeof (buf)); - } - - /*NOTREACHED*/ - return NULL; -} - -int -main (int argc, char *argv[]) -{ - if (setlocale (LC_ALL, LOCALE1) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE1 not recognized\n"); - return 77; - } - if (setlocale (LC_NUMERIC, LOCALE2) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE2 not recognized\n"); - return 77; - } - if (setlocale (LC_TIME, LOCALE3) == NULL) - { - fprintf (stderr, "Skipping test: LOCALE3 not recognized\n"); - return 77; - } - - expected = strdup (setlocale (LC_NUMERIC, NULL)); - - /* Create the two threads. */ - gl_thread_create (thread1_func, NULL); - gl_thread_create (thread2_func, NULL); - - /* Let them run for 2 seconds. */ - { - struct timespec duration; - duration.tv_sec = 2; - duration.tv_nsec = 0; - - nanosleep (&duration, NULL); - } - - return 0; -} - -/* Without locking, the results of this test would be: -glibc OK -musl libc OK -macOS OK -FreeBSD OK -NetBSD OK -OpenBSD crash < 1 sec -AIX crash < 2 sec -HP-UX OK -IRIX OK -Solaris 10 OK -Solaris 11.0 OK -Solaris 11.4 OK -Solaris OpenIndiana OK -Haiku OK -Cygwin OK -mingw OK -MSVC OK (assuming compiler option /MD !) -*/