xref: /freebsd/tools/test/stress2/misc/kevent13.sh (revision 4d846d26)
18a272653SPeter Holm#!/bin/sh
28a272653SPeter Holm
38a272653SPeter Holm#
44d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause
58a272653SPeter Holm#
68a272653SPeter Holm# Copyright (c) 2018 Dell EMC Isilon
78a272653SPeter Holm#
88a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
98a272653SPeter Holm# modification, are permitted provided that the following conditions
108a272653SPeter Holm# are met:
118a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
128a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
138a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
148a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
158a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
168a272653SPeter Holm#
178a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
188a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
198a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
208a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
218a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
228a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
238a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
258a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
268a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
278a272653SPeter Holm# SUCH DAMAGE.
288a272653SPeter Holm#
298a272653SPeter Holm
308a272653SPeter Holm# Test based on scenario by Babcia Padlina
318a272653SPeter Holm
328a272653SPeter Holm# "panic: mutex pipe mutex not owned at sys_pipe.c:1769" seen:
338a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/kevent13.txt
348a272653SPeter Holm# Fixed by r235640.
358a272653SPeter Holm
368a272653SPeter Holm. ../default.cfg
378a272653SPeter Holm
388a272653SPeter Holmodir=`pwd`
398a272653SPeter Holmcd /tmp
408a272653SPeter Holmsed '1,/^EOF/d' < $odir/$0 > kevent13.c
418a272653SPeter Holmcc -o kevent13 -Wall kevent13.c -lpthread
428a272653SPeter Holmrm -f kevent13.c
438a272653SPeter Holm
448a272653SPeter Holm[ -d "$RUNDIR" ] || mkdir -p $RUNDIR
458a272653SPeter Holmcd $RUNDIR
468a272653SPeter Holmstart=`date +%s`
478a272653SPeter Holmwhile [ $((`date +%s` - start)) -lt 300 ]; do
488a272653SPeter Holm	for i in `jot 10`; do
498a272653SPeter Holm		/tmp/kevent13 &
508a272653SPeter Holm		/tmp/kevent13 &
518a272653SPeter Holm		wait
528a272653SPeter Holm	done
538a272653SPeter Holmdone
548a272653SPeter Holm
558a272653SPeter Holmrm -f /tmp/kevent13
568a272653SPeter Holmexit 0
578a272653SPeter HolmEOF
588a272653SPeter Holm/*
598a272653SPeter Holm * 29.08.2009, babcia padlina
608a272653SPeter Holm */
618a272653SPeter Holm
628a272653SPeter Holm#include <sys/types.h>
638a272653SPeter Holm#include <sys/event.h>
648a272653SPeter Holm#include <sys/param.h>
658a272653SPeter Holm#include <sys/timespec.h>
668a272653SPeter Holm#include <unistd.h>
678a272653SPeter Holm
688a272653SPeter Holm#include <err.h>
698a272653SPeter Holm#include <fcntl.h>
708a272653SPeter Holm#include <pthread.h>
718a272653SPeter Holm#include <stdio.h>
728a272653SPeter Holm#include <stdlib.h>
738a272653SPeter Holm#include <string.h>
748a272653SPeter Holm
758a272653SPeter Holm#define LOOPS 200000
768a272653SPeter Holm
778a272653SPeter Holmstruct kevent kev[2], ke[2];
788a272653SPeter Holmstruct timespec timeout;
798a272653SPeter Holmvolatile int go;
808a272653SPeter Holmint fd[2], kq;
818a272653SPeter Holm
828a272653SPeter Holmvoid
838a272653SPeter Holmdo_thread(void) {
848a272653SPeter Holm	int i;
858a272653SPeter Holm
868a272653SPeter Holm	go = 1;
878a272653SPeter Holm	for (i = 0; i < LOOPS; i++) {
888a272653SPeter Holm		if (pipe(fd) < 0)
898a272653SPeter Holm			err(1, "pipe");
908a272653SPeter Holm		memset(&kev, 0, sizeof(kev));
918a272653SPeter Holm		EV_SET(&kev[0], fd[0], EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, NULL);
928a272653SPeter Holm		EV_SET(&kev[1], fd[1], EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, NULL);
938a272653SPeter Holm
948a272653SPeter Holm		if (kevent(kq, kev, 2, ke, 2, &timeout) < 0)
958a272653SPeter Holm			err(1, "kevent");
968a272653SPeter Holm
978a272653SPeter Holm		close(fd[0]);
988a272653SPeter Holm		close(fd[1]);
998a272653SPeter Holm	}
1008a272653SPeter Holm}
1018a272653SPeter Holm
1028a272653SPeter Holmvoid
1038a272653SPeter Holmdo_thread2(void) {
1048a272653SPeter Holm	int i;
1058a272653SPeter Holm
1068a272653SPeter Holm	while (go == 0)
1078a272653SPeter Holm		usleep(10);
1088a272653SPeter Holm	for (i = 0; i < LOOPS; i++) {
1098a272653SPeter Holm		if (arc4random() % 2 == 0) {
1108a272653SPeter Holm			close(fd[0]);
1118a272653SPeter Holm			close(fd[1]);
1128a272653SPeter Holm		} else {
1138a272653SPeter Holm			close(fd[1]);
1148a272653SPeter Holm			close(fd[0]);
1158a272653SPeter Holm		}
1168a272653SPeter Holm	}
1178a272653SPeter Holm}
1188a272653SPeter Holm
1198a272653SPeter Holmint
1208a272653SPeter Holmmain(void) {
1218a272653SPeter Holm	pthread_t pth, pth2;
1228a272653SPeter Holm	int r;
1238a272653SPeter Holm
1248a272653SPeter Holm	if ((kq = kqueue()) < 0)
1258a272653SPeter Holm		err(1, "kqueue");
1268a272653SPeter Holm
1278a272653SPeter Holm	if ((r = pthread_create(&pth, NULL, (void *)do_thread, NULL)) != 0)
1288a272653SPeter Holm		errc(1, r, "pthread_create");
1298a272653SPeter Holm	if ((r = pthread_create(&pth2, NULL, (void *)do_thread2, NULL)) != 0)
1308a272653SPeter Holm		errc(1, r, "pthread_create");
1318a272653SPeter Holm
1328a272653SPeter Holm	timeout.tv_sec = 0;
1338a272653SPeter Holm	timeout.tv_nsec = 1;
1348a272653SPeter Holm
1358a272653SPeter Holm	if ((r = pthread_join(pth, NULL)) != 0)
1368a272653SPeter Holm		errc(1, r, "pthread_join");
1378a272653SPeter Holm	if ((r = pthread_join(pth2, NULL)) != 0)
1388a272653SPeter Holm		errc(1, r, "pthread_join");
1398a272653SPeter Holm
1408a272653SPeter Holm	return (0);
1418a272653SPeter Holm}
142