svn commit: r302672 - user/pho/stress2/misc

Peter Holm pho at FreeBSD.org
Tue Jul 12 19:27:07 UTC 2016


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);
 }


More information about the svn-src-user mailing list