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