From nobody Sun Jun 14 14:27:09 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gdbDf43wJz6gnMD for ; Sun, 14 Jun 2026 14:27:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (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-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gdbDf3LRJz3fN3 for ; Sun, 14 Jun 2026 14:27:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781447234; 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=2SKRLJ5hvUzgg/8oyo00CzhgYRCU53MX3CFHFAEUNGU=; b=ySLP0PnK9ZBRpjFpG2STxk19o+GI1q0784nLFPN9CGlSCKRTIhnkzzfWw8D9oTPdkxXD7L /mjDLTNRp2vo+dLUkxtzwrOJQKc0hN2SsConGxhjub21+yqhMW1W2HG3py1V/G5qE7FTLV pQNDloZVKlZWAAtcNQ4H6AWmycQOot4Uvc6rF/KQdoydA7REowHkwgb29iVeDLpoMVQoD1 OeT4zMjsP1NxJWN5uW91GlheZsF4rpJPsdfIp41+bB8nk0pWJYL02G9DqM1f/zXOk1fSAG aVYw1U49p3zjPVW3SQ/pmFDbqFX/dQ82rQ1F4tMOlLZxdEjP3/uVk/VdwoljUQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781447234; a=rsa-sha256; cv=none; b=wERopStWxkzqB2YjkWzEU3gy8o7eB/681P06vTn1U8Ms6MK7G2D22E1s83F2sGcmxp28qD wOAnYmXApmyhC6g6R3XKngiTQajDuSVpfGjptfqi5o3bvseVkFd5pl2vZG5fywrKFqXNOc r0gAzqNdtVSTi5BF5z8Y+BFzfoeAp4OYovihvXO8jnuS7QEZl24QtaJ2SNZo6PcHvf9mic Yxgmqn2Pdpk5CqlBIEmZiCtJvxnTiVywynEnGcEchHsd5ywpxBsU4szQSrlbna7kmyeox9 yTX7NP5TmHrflQf1As3JGnwwtg+2r8UhZ+De/Z4NLY6VMz7FYnDZbjSXDNsYMw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781447234; 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=2SKRLJ5hvUzgg/8oyo00CzhgYRCU53MX3CFHFAEUNGU=; b=aY+H41ONQWasE8hwlu6AbH70NhFcYIXtuldoTNMU3v1ot5LeC/7k0sNjee7lQnGrXd0CFh LhvoufxbMzMCVp64MwD48hmZvgi8KKoTWg/tsPJrTuO0CtSlQWYnb07X4+LDumk+fcFLlV ahHZt0NiR9eCaRBplBolHaU5r2gdy3ysLHBwligVXg262iOmQ3MipxV+zA5NFALZ1jvPLK uOAgGLmTiGyAzAESmYn7zW7J2tYU3CXMfgbBtvS1LYZXKKUQU79YEcxgzdVolWxsPNXj1C qkdDEuzp1BvOaRFzGTGQmVsTH5yQfeHlm5feNm21Bi7TdR+ZeyHjLv+VsPbJsw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gdbDf2mXYz1Bxl for ; Sun, 14 Jun 2026 14:27:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 37a89 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 14 Jun 2026 14:27:09 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Baptiste Daroussin Subject: git: ffe47c424e0a - main - grep: periodic timer-based fflush instead of unconditional per-line flush List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bapt X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ffe47c424e0a45f5d8d20a5944477821bd946eef Auto-Submitted: auto-generated Date: Sun, 14 Jun 2026 14:27:09 +0000 Message-Id: <6a2eba3d.37a89.6e8ac4b2@gitrepo.freebsd.org> The branch main has been updated by bapt: URL: https://cgit.FreeBSD.org/src/commit/?id=ffe47c424e0a45f5d8d20a5944477821bd946eef commit ffe47c424e0a45f5d8d20a5944477821bd946eef Author: Baptiste Daroussin AuthorDate: 2026-06-12 12:13:35 +0000 Commit: Baptiste Daroussin CommitDate: 2026-06-14 14:26:30 +0000 grep: periodic timer-based fflush instead of unconditional per-line flush Replace the unconditional fflush(stdout) in grep_printline and procmatches with a periodic timer that flushes at most once every 100ms. This preserves interactive responsiveness (grep | tee, grep | tail -f) while avoiding 1M+ write(2) syscalls when processing large inputs. The flush interval is tracked via clock_gettime(CLOCK_MONOTONIC) and a static timespec. --line-buffered continues to flush immediately via setlinebuf(3), as before. Benchmark on 1M lines (37MB output to file): unconditional fflush: 1.90s (sys 1.22s) periodic 100ms timer: 0.49s (sys 0.007s) Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D57528 --- usr.bin/grep/util.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/usr.bin/grep/util.c b/usr.bin/grep/util.c index 5b40405852b3..dbb21dcfd78e 100644 --- a/usr.bin/grep/util.c +++ b/usr.bin/grep/util.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -724,12 +725,36 @@ grep_strdup(const char *str) * Print an entire line as-is, there are no inline matches to consider. This is * used for printing context. */ -void grep_printline(struct str *line, int sep) { +static struct timespec printline_last_flush = { 0, 0 }; + +static void +flush_if_stalled(void) +{ + struct timespec now; + + if (lbflag && fileeol == '\n') + return; + + clock_gettime(CLOCK_MONOTONIC, &now); + if (now.tv_sec > printline_last_flush.tv_sec || + (now.tv_sec == printline_last_flush.tv_sec && + now.tv_nsec - printline_last_flush.tv_nsec > 100000000)) { + fflush(stdout); + printline_last_flush = now; + } +} + +void +grep_printline(struct str *line, int sep) +{ printline_metadata(line, sep); fwrite(line->dat, line->len, 1, stdout); putchar(fileeol); - fflush(stdout); + if (lbflag) + fflush(stdout); + else + flush_if_stalled(); } static void @@ -836,7 +861,7 @@ printline(struct parsec *pc, int sep, size_t *last_out) *last_out = pc->ln.len; } putchar('\n'); - fflush(stdout); + flush_if_stalled(); } else if (!oflag) { /* * -o is terminated on every match output, so this @@ -847,7 +872,7 @@ printline(struct parsec *pc, int sep, size_t *last_out) */ terminated = false; } else { - fflush(stdout); + flush_if_stalled(); } } else grep_printline(&pc->ln, sep);