From owner-svn-src-user@freebsd.org Tue Jul 12 19:27:06 2016 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DE281B93201 for ; Tue, 12 Jul 2016 19:27:06 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B530314C3; Tue, 12 Jul 2016 19:27:06 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u6CJR5ew071941; Tue, 12 Jul 2016 19:27:05 GMT (envelope-from pho@FreeBSD.org) Received: (from pho@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u6CJR5uW071940; Tue, 12 Jul 2016 19:27:05 GMT (envelope-from pho@FreeBSD.org) Message-Id: <201607121927.u6CJR5uW071940@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: pho set sender to pho@FreeBSD.org using -f From: Peter Holm Date: Tue, 12 Jul 2016 19:27:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r302672 - user/pho/stress2/misc X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jul 2016 19:27:07 -0000 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 #include -#include - #include #include #include +#include #include #include #include @@ -70,34 +69,34 @@ EOF #include #include -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); }