JlLYPEBGClOXl9rQijCd35cyweddc1h3GT5hKIbpusbusi50pkYkkf+P/g 2zOrDU+vBkK//6Tv84yishLiTiJlMqHDLEsKQNSyyTJgYvHs/kXRU+ied6Sscw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1749535570; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Qv2gselyAxipliYizKgxUr6gxzByVZO376i9+jnE51s=; b=hmlF9MpOnlVdg11Z1HNcy+UfheEHGCW9FTf1kP1QmmXq04y65GQV6MWwBKB4i4IeIYDgVD vIQnui98UEMYfbF6PAunDSrPCeJMOEOpUANDdBElIStWfMFmIqFRMgGOdcUBKc0ZXDFPQ0 etOSqFiGcd7LHa2+NhxNZbhOP4cx5LVBj5aG9d3bkiuSOVRUZLMdfwyBpbVcS4Id6PllbS uti+N5Ws/BkVs8JfDJxu7FbBXmjxAmhYUswrAm/gzaZRyyE/gX//Qtl30uHwwVI3L+Uy7j cfs/QUMo6ziKrcldZyoUKRvlZXF2Ik0DSwgmvcT8QrTpcLWCEXpyY3PIzJSXKg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1749535570; a=rsa-sha256; cv=none; b=OyZPZNviC9QX/z+E/zmR1BRAX8RbuTgU9QxvRqrPX+o+0m1RNiE7O/q7GaL9YlKHlbrSML 1X/+lWdS2kO20k1/vgXuma0+jWeS4+gxtLuCOOqVB4DBcrmluYRyGS+Zya8QntMbsNZ3ge vaybp+QaKYSHWFYn9+jMZi8ECzMgiv8EXcKhIMQPH3DJXb4+ZjyyFbZcr0rL2UGQcByvxA IQt+KPTG4SUFEF5b6QW9yvcDcgxRFtcHxATPMPsvSNotIE+53unJRp6BJ4MPK3KWePSLBv s8pdJFzcD8A+JvgwrDqOxGJALbIBia7o3QJKsbYDfxlW4a665dPbaQ1hbtr3Jw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bGdZp1kvfzD3d; Tue, 10 Jun 2025 06:06:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 55A66AH4003667; Tue, 10 Jun 2025 06:06:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 55A66AJN003664; Tue, 10 Jun 2025 06:06:10 GMT (envelope-from git) Date: Tue, 10 Jun 2025 06:06:10 GMT Message-Id: <202506100606.55A66AJN003664@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: 83259da6c778 - main - tests/unix_stream: peer's shutdown(SHUT_WR) must wake up any event mech List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 83259da6c7782cfdc4d53dbf938d4962e82f3b81 Auto-Submitted: auto-generated The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=83259da6c7782cfdc4d53dbf938d4962e82f3b81 commit 83259da6c7782cfdc4d53dbf938d4962e82f3b81 Author: Gleb Smirnoff AuthorDate: 2025-06-10 04:54:48 +0000 Commit: Gleb Smirnoff CommitDate: 2025-06-10 06:05:07 +0000 tests/unix_stream: peer's shutdown(SHUT_WR) must wake up any event mech --- tests/sys/kern/unix_stream.c | 77 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/tests/sys/kern/unix_stream.c b/tests/sys/kern/unix_stream.c index 72dbe8ca1d92..bb811f78f620 100644 --- a/tests/sys/kern/unix_stream.c +++ b/tests/sys/kern/unix_stream.c @@ -200,6 +200,25 @@ pthread_wrap(void *arg) return (NULL); } +/* + * Launch a thread that would block in event mech and return it. + */ +static pthread_t +pthread_create_blocked(struct check_ctx *ctx) +{ + pthread_t thr; + + ctx->timeout = false; + ctx->nfds = 1; + ATF_REQUIRE(pthread_create(&thr, NULL, pthread_wrap, ctx) == 0); + + /* Sleep a bit to make sure that thread is put to sleep. */ + usleep(10000); + ATF_REQUIRE(pthread_peekjoin_np(thr, NULL) == EBUSY); + + return (thr); +} + static void full_writability_check(struct check_ctx *ctx) { @@ -215,14 +234,7 @@ full_writability_check(struct check_ctx *ctx) ctx->nfds = 0; ctx->method(ctx); - /* Launch blocking thread. */ - ctx->timeout = false; - ctx->nfds = 1; - ATF_REQUIRE(pthread_create(&thr, NULL, pthread_wrap, ctx) == 0); - - /* Sleep a bit to make sure that thread is put to sleep. */ - usleep(10000); - ATF_REQUIRE(pthread_peekjoin_np(thr, NULL) == EBUSY); + thr = pthread_create_blocked(ctx); /* Read some data and re-check, the fd is expected to be returned. */ ATF_REQUIRE(read(ctx->sv[1], buf, space) == (ssize_t)space); @@ -409,6 +421,52 @@ ATF_TC_BODY(peershutdown_readability, tc) close(ctx.sv[1]); } +static void +peershutdown_wakeup(struct check_ctx *ctx) +{ + pthread_t thr; + + ctx->timeout = false; + ctx->nfds = 1; + + do_socketpair(ctx->sv); + thr = pthread_create_blocked(ctx); + shutdown(ctx->sv[1], SHUT_WR); + ATF_REQUIRE(pthread_join(thr, NULL) == 0); + + close(ctx->sv[0]); + close(ctx->sv[1]); +} + +ATF_TC_WITHOUT_HEAD(peershutdown_wakeup_select); +ATF_TC_BODY(peershutdown_wakeup_select, tc) +{ + peershutdown_wakeup(&(struct check_ctx){ + .method = check_select, + .select_what = SELECT_RD, + }); +} + +ATF_TC_WITHOUT_HEAD(peershutdown_wakeup_poll); +ATF_TC_BODY(peershutdown_wakeup_poll, tc) +{ + peershutdown_wakeup(&(struct check_ctx){ + .method = check_poll, + .poll_events = POLLIN | POLLRDNORM | POLLRDHUP, + .poll_revents = POLLRDHUP, + }); +} + +ATF_TC_WITHOUT_HEAD(peershutdown_wakeup_kevent); +ATF_TC_BODY(peershutdown_wakeup_kevent, tc) +{ + peershutdown_wakeup(&(struct check_ctx){ + .method = check_kevent, + .kev_filter = EVFILT_READ, + .kev_flags = EV_EOF, + }); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, getpeereid); @@ -421,6 +479,9 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, peerclosed_writability); ATF_TP_ADD_TC(tp, peershutdown_writability); ATF_TP_ADD_TC(tp, peershutdown_readability); + ATF_TP_ADD_TC(tp, peershutdown_wakeup_select); + ATF_TP_ADD_TC(tp, peershutdown_wakeup_poll); + ATF_TP_ADD_TC(tp, peershutdown_wakeup_kevent); return atf_no_error(); }