Date: Tue, 12 Jul 2016 19:27:05 +0000 (UTC) From: Peter Holm <pho@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r302672 - user/pho/stress2/misc Message-ID: <201607121927.u6CJR5uW071940@repo.freebsd.org>
index | next in thread | raw e-mail
Author: pho Date: Tue Jul 12 19:27:05 2016 New Revision: 302672 URL: https://svnweb.freebsd.org/changeset/base/302672 Log: Kostik suggested that I use pthread_barrier_* in place of rolling my own. Updated comment to reflect the issue found and added check for the number of alarms received. Reviewed by: kib Sponsored by: EMC / Isilon Storage Division Modified: user/pho/stress2/misc/select.sh Modified: user/pho/stress2/misc/select.sh ============================================================================== --- user/pho/stress2/misc/select.sh Tue Jul 12 18:57:28 2016 (r302671) +++ user/pho/stress2/misc/select.sh Tue Jul 12 19:27:05 2016 (r302672) @@ -29,8 +29,8 @@ # # The combination of ualarm() firing before and after the select(2) timeout -# triggers select() to return EINTR a number of times. Not seen on Lunux or -# OS X. Problem only seen on i386. +# triggers select() to return EINTR a number of times. +# Problem only seen on i386. # Test scenario suggestion by kib@ @@ -43,7 +43,7 @@ dir=/tmp odir=`pwd` cd $dir sed '1,/^EOF/d' < $odir/$0 > $dir/select.c -mycc -o select -Wall -Wextra -O0 -g select.c || exit 1 +mycc -o select -Wall -Wextra -O0 -g select.c -lpthread || exit 1 rm -f select.c cd $odir @@ -58,11 +58,10 @@ EOF #include <sys/stat.h> #include <sys/wait.h> -#include <machine/atomic.h> - #include <err.h> #include <errno.h> #include <fcntl.h> +#include <pthread.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -70,34 +69,34 @@ EOF #include <time.h> #include <unistd.h> -volatile u_int *share; -volatile int alarms; -int lines; +static pthread_barrier_t barr; +static sig_atomic_t alarms; +static int lines; #define N 2000 /* also seen fail with N = 20.000 */ #define LINES 128000 #define PARALLEL 16 /* Fails seen with 1 - 16 */ #define RUNTIME (10 * 60) -#define SYNC 0 -void +static void handler(int i __unused) { alarms++; } -void +static void test(void) { struct timeval tv; int i, n, r, s; - atomic_add_int(&share[SYNC], 1); - while (share[SYNC] != PARALLEL) - ; + r = pthread_barrier_wait(&barr); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + errc(1, r, "pthread_barrier_wait"); signal(SIGALRM, handler); s = 0; for (i = 0; i < lines; i++) { + alarms = 0; if (arc4random() % 100 < 50) ualarm(N / 2, 0); else @@ -118,31 +117,38 @@ test(void) s = 1; break; } + if (alarms > 1) { + fprintf(stderr, "FAIL alarms = %d\n", (int)alarms); + s = 2; + break; + } } - _exit(s); + exit(s); } int main(void) { - size_t len; + pthread_barrierattr_t attr; time_t start; - int e, i, j, pids[PARALLEL], status; + int e, i, j, pids[PARALLEL], r, status; lines = LINES / PARALLEL; if (lines == 0) lines = 1; e = 0; - len = PAGE_SIZE; - if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, - MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) - err(1, "mmap"); + if ((r = pthread_barrierattr_init(&attr)) != 0) + errc(1, r, "pthread_barrierattr_init"); + if ((r = pthread_barrierattr_setpshared(&attr, + PTHREAD_PROCESS_SHARED)) != 0) + errc(1, r, "pthread_barrierattr_setpshared"); + if ((r = pthread_barrier_init(&barr, &attr, PARALLEL)) != 0) + errc(1, r, "pthread_barrier_init"); start = time(NULL); while ((time(NULL) - start) < RUNTIME && e == 0) { - share[SYNC] = 0; for (i = 0; i < PARALLEL; i++) { if ((pids[i] = fork()) == 0) test(); @@ -157,5 +163,8 @@ main(void) } } + if ((r = pthread_barrier_destroy(&barr)) > 0) + errc(1, r, "pthread_barrier_destroy"); + return (e); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607121927.u6CJR5uW071940>
