1*896809e2SPeter Holm#!/bin/sh 2*896809e2SPeter Holm 3*896809e2SPeter Holm# 4*896809e2SPeter Holm# SPDX-License-Identifier: BSD-2-Clause 5*896809e2SPeter Holm# 6*896809e2SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org> 7*896809e2SPeter Holm# 8*896809e2SPeter Holm# Redistribution and use in source and binary forms, with or without 9*896809e2SPeter Holm# modification, are permitted provided that the following conditions 10*896809e2SPeter Holm# are met: 11*896809e2SPeter Holm# 1. Redistributions of source code must retain the above copyright 12*896809e2SPeter Holm# notice, this list of conditions and the following disclaimer. 13*896809e2SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 14*896809e2SPeter Holm# notice, this list of conditions and the following disclaimer in the 15*896809e2SPeter Holm# documentation and/or other materials provided with the distribution. 16*896809e2SPeter Holm# 17*896809e2SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*896809e2SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*896809e2SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*896809e2SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*896809e2SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*896809e2SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*896809e2SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*896809e2SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*896809e2SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*896809e2SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*896809e2SPeter Holm# SUCH DAMAGE. 28*896809e2SPeter Holm# 29*896809e2SPeter Holm 30*896809e2SPeter Holm# Another killpg(2) test scenario. No problems seen. 31*896809e2SPeter Holm 32*896809e2SPeter Holm. ../default.cfg 33*896809e2SPeter Holmexport prog=$(basename "$0" .sh) 34*896809e2SPeter Holmset -u 35*896809e2SPeter Holm 36*896809e2SPeter Holmcat > /tmp/$prog.c <<EOF 37*896809e2SPeter Holm#include <sys/wait.h> 38*896809e2SPeter Holm#include <err.h> 39*896809e2SPeter Holm#include <time.h> 40*896809e2SPeter Holm#include <stdlib.h> 41*896809e2SPeter Holm#include <unistd.h> 42*896809e2SPeter Holm#define PARALLEL 2 43*896809e2SPeter Holm 44*896809e2SPeter Holmint 45*896809e2SPeter Holmtest(void) 46*896809e2SPeter Holm{ 47*896809e2SPeter Holm pid_t pid; 48*896809e2SPeter Holm time_t start; 49*896809e2SPeter Holm 50*896809e2SPeter Holm start = time(NULL); 51*896809e2SPeter Holm while (time(NULL) - start < 300) { 52*896809e2SPeter Holm if ((pid = fork()) == -1) 53*896809e2SPeter Holm err(1, "fork()"); 54*896809e2SPeter Holm if (pid == 0) { 55*896809e2SPeter Holm if (arc4random() % 100 < 20) 56*896809e2SPeter Holm usleep(arc4random() % 5000); 57*896809e2SPeter Holm _exit(0); /* Not reached */ 58*896809e2SPeter Holm } 59*896809e2SPeter Holm if (waitpid(pid, NULL, 0) != pid) 60*896809e2SPeter Holm err(1, "waitpid()"); 61*896809e2SPeter Holm } 62*896809e2SPeter Holm _exit(0); 63*896809e2SPeter Holm} 64*896809e2SPeter Holm 65*896809e2SPeter Holmint 66*896809e2SPeter Holmmain(void) 67*896809e2SPeter Holm{ 68*896809e2SPeter Holm pid_t pids[PARALLEL]; 69*896809e2SPeter Holm int i; 70*896809e2SPeter Holm 71*896809e2SPeter Holm for (i = 0; i < PARALLEL; i++) { 72*896809e2SPeter Holm test(); 73*896809e2SPeter Holm } 74*896809e2SPeter Holm for (i = 0; i < PARALLEL; i++) { 75*896809e2SPeter Holm if (waitpid(pids[i], NULL, 0) != pids[i]) 76*896809e2SPeter Holm err(1, "waotpid() main"); 77*896809e2SPeter Holm } 78*896809e2SPeter Holm 79*896809e2SPeter Holm} 80*896809e2SPeter HolmEOF 81*896809e2SPeter Holmmycc -o /tmp/$prog -Wall -Wextra -O2 /tmp/$prog.c || exit 1 82*896809e2SPeter Holm 83*896809e2SPeter Holmexport MAXSWAPPCT=80 84*896809e2SPeter Holm../testcases/swap/swap -t 2m -i 5 > /dev/null 2>&1 & 85*896809e2SPeter Holmsleep .5 86*896809e2SPeter Holmstart=`date +%s` 87*896809e2SPeter Holmwhile [ $((`date +%s` - start)) -lt 120 ]; do 88*896809e2SPeter Holm for i in `jot 200 100`; do 89*896809e2SPeter Holm ( 90*896809e2SPeter Holm sl=$prog.$i 91*896809e2SPeter Holm sleep=/tmp/$sl 92*896809e2SPeter Holm cp /tmp/$prog $sleep 93*896809e2SPeter Holm su $testuser -c "$sleep & $sleep & $sleep &" & pid=$! 94*896809e2SPeter Holm for j in `jot 10`; do 95*896809e2SPeter Holm pgrep -q "$sl" && break 96*896809e2SPeter Holm sleep .5 97*896809e2SPeter Holm done 98*896809e2SPeter Holm pgrep -q "$sl" || { echo "No start"; exit 1; } 99*896809e2SPeter Holm pgid=`pgrep "$sl" | xargs ps -jp | sed 1d | \ 100*896809e2SPeter Holm tail -1 | awk '{print $4}'` 101*896809e2SPeter Holm [ -z "$pgid" ] && { echo "Zero pgid:$pgid"; ps aj | \ 102*896809e2SPeter Holm sed -n "1p;/$sl/p"; exit 1; } 103*896809e2SPeter Holm sleep 1.`jot -r 1 2 9` 104*896809e2SPeter Holm kill -- -$pgid || { echo "kill -$pgid failed"; exit 1; } 105*896809e2SPeter Holm wait $pid 106*896809e2SPeter Holm rm -f $sleep 107*896809e2SPeter Holm ) & 108*896809e2SPeter Holm done 109*896809e2SPeter Holm while [ `ps -U$testuser | wc -l` -gt 1 ] ; do sleep 2; done 110*896809e2SPeter Holmdone 111*896809e2SPeter Holmwhile pkill swap; do :; done 112*896809e2SPeter Holmwait 113*896809e2SPeter Holmrm /tmp/$prog /tmp/$prog.c 114*896809e2SPeter Holmexit 0 115