xref: /freebsd/tools/test/stress2/misc/poll.sh (revision 5ca8e32633c4ffbbcd6762e5888b6a4ba0708c6c)
1#!/bin/sh
2
3# A pipe_poll() regression test.
4# Python test scenario by Alexander Motin <mav@FreeBSD.org>
5# https://reviews.freebsd.org/D21333
6
7# Hang seen:
8# $ procstat -k 19529
9#   PID    TID COMM        KSTACK
10# 19529 101381 python3.7 - ... _sleep kqueue_kevent kern_kevent_fp kern_kevent kern_kevent_generic sys_kevent amd64_syscall fast_syscall_common
11# 19529 101630 python3.7 - ... _sleep pipe_read dofileread kern_readv sys_read amd64_syscall fast_syscall_common
12# 19529 101631 python3.7 - ... _sleep umtxq_sleep do_sem2_wait __umtx_op_sem2_wait amd64_syscall fast_syscall_common
13# $
14
15# Fixed by r351348
16
17[ -z "`type python3 2>/dev/null`" ] && exit 0
18cat > /tmp/poll.py <<EOF
19#!/usr/local/bin/python3
20
21import concurrent.futures
22import asyncio
23
24procpool = concurrent.futures.ProcessPoolExecutor(
25    max_workers=1,
26)
27
28def x():
29    return ['x'] * 10241
30
31async def say():
32    for i in range(100000):
33        await asyncio.get_event_loop().run_in_executor(procpool, x)
34        print(i)
35
36loop = asyncio.get_event_loop()
37loop.run_until_complete(say())
38loop.close()
39EOF
40chmod +x /tmp/poll.py
41
42log=/tmp/poll.log
43start=`date +%s`
44cpuset -l 0 /tmp/poll.py > $log &
45pid=$!
46sleep 60
47s1=`wc -l < $log`
48sleep 60
49s2=`wc -l < $log`
50while pgrep -qf poll.py; do pkill -f poll.py; done
51wait $pid
52[ $s2 -gt $s1 ] && s=0 || s=1
53
54rm -f /tmp/poll.py $log
55exit $s
56
57dtrace -wn '*::pipe_poll:entry {@rw[execname,probefunc] = count(); }'
58