Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Apr 2017 14:36:09 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r317254 - in head: share/man/man5 share/mk tools/build/options usr.bin/grep
Message-ID:  <201704211436.v3LEa9Ns035517@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Fri Apr 21 14:36:09 2017
New Revision: 317254
URL: https://svnweb.freebsd.org/changeset/base/317254

Log:
  bsdgrep: add BSD_GREP_FASTMATCH knob for built-in fastmatch
  
  Bugs have been found in the fastmatch implementation as used in bsdgrep.
  Some have been fixed (r316495) while fixes for others are in review
  (D10098).
  
  In comparison with the fastmatch implementation, Kyle Evans found that:
  
  - regex(3)'s performance with literal expressions offers a speed
    improvement over fastmatch
  
  - regex(3)'s performance, both with simple BREs and EREs, seems to be
    comparable
  
  The regex implementation was imported in r226035, and the commit message
  reports:
  
      This is a temporary solution until the whole regex library is
      not replaced so that BSD grep development can continue and the
      backported code gets some review and testing. This change only
      improves scalability slightly, there is no big performance boost
      yet but several minor bugs have been found and fixed.
  
  Introduce a WITH_/WITHOUT_BSD_GREP_FASTMATCH knob to support testing
  of both approaches.
  
  PR:		175314, 194823
  Submitted by:	Kyle Evans <kevans91 at ksu.edu>
  Reviewed by:	bdrewery (in part)
  Differential Revision:	https://reviews.freebsd.org/D10282

Added:
  head/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH   (contents, props changed)
Modified:
  head/share/man/man5/src.conf.5
  head/share/mk/src.opts.mk
  head/usr.bin/grep/Makefile
  head/usr.bin/grep/grep.c
  head/usr.bin/grep/grep.h
  head/usr.bin/grep/util.c

Modified: head/share/man/man5/src.conf.5
==============================================================================
--- head/share/man/man5/src.conf.5	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/share/man/man5/src.conf.5	Fri Apr 21 14:36:09 2017	(r317254)
@@ -1,6 +1,6 @@
 .\" DO NOT EDIT-- this file is generated by tools/build/options/makeman.
 .\" $FreeBSD$
-.Dd April 19, 2017
+.Dd April 21, 2017
 .Dt SRC.CONF 5
 .Os
 .Sh NAME
@@ -215,6 +215,11 @@ Set to not build the BSD licensed versio
 .Xr libarchive 3 .
 .It Va WITH_BSD_GREP
 Install BSD-licensed grep as '[ef]grep' instead of GNU grep.
+.It Va WITHOUT_BSD_GREP_FASTMATCH
+Set this option to exclude the fastmatch implementation from
+.Xr bsdgrep 1 ,
+instead using only
+.Xr regex 3 .
 .It Va WITHOUT_BSNMP
 Set to not build or install
 .Xr bsnmpd 1

Modified: head/share/mk/src.opts.mk
==============================================================================
--- head/share/mk/src.opts.mk	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/share/mk/src.opts.mk	Fri Apr 21 14:36:09 2017	(r317254)
@@ -62,6 +62,7 @@ __DEFAULT_YES_OPTIONS = \
     BOOTPARAMD \
     BOOTPD \
     BSD_CPIO \
+    BSD_GREP_FASTMATCH \
     BSDINSTALL \
     BSNMP \
     BZIP2 \

Added: head/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH	Fri Apr 21 14:36:09 2017	(r317254)
@@ -0,0 +1,5 @@
+.\" $FreeBSD$
+Set this option to exclude the fastmatch implementation from
+.Xr bsdgrep 1 ,
+instead using only
+.Xr regex 3 .

Modified: head/usr.bin/grep/Makefile
==============================================================================
--- head/usr.bin/grep/Makefile	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/usr.bin/grep/Makefile	Fri Apr 21 14:36:09 2017	(r317254)
@@ -15,10 +15,14 @@ bsdgrep.1: grep.1
 .endif
 SRCS=	file.c grep.c queue.c util.c
 
-# Extra files ported backported form some regex improvements
+.if ${MK_BSD_GREP_FASTMATCH} == "yes"
+# Extra files ported backported for some regex improvements
 .PATH: ${.CURDIR}/regex
 SRCS+=	fastmatch.c hashtable.c tre-compile.c tre-fastmatch.c
 CFLAGS+=-I${.CURDIR}/regex
+.else
+CFLAGS+= -DWITHOUT_FASTMATCH
+.endif
 
 CFLAGS.gcc+= --param max-inline-insns-single=500
 

Modified: head/usr.bin/grep/grep.c
==============================================================================
--- head/usr.bin/grep/grep.c	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/usr.bin/grep/grep.c	Fri Apr 21 14:36:09 2017	(r317254)
@@ -49,7 +49,9 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
+#ifndef WITHOUT_FASTMATCH
 #include "fastmatch.h"
+#endif
 #include "grep.h"
 
 #ifndef WITHOUT_NLS
@@ -86,7 +88,9 @@ unsigned int	 patterns;
 static unsigned int pattern_sz;
 struct pat	*pattern;
 regex_t		*r_pattern;
+#ifndef WITHOUT_FASTMATCH
 fastmatch_t	*fg_pattern;
+#endif
 
 /* Filename exclusion/inclusion patterns */
 unsigned int	fpatterns, dpatterns;
@@ -715,20 +719,25 @@ main(int argc, char *argv[])
 		usage();
 	}
 
+#ifndef WITHOUT_FASTMATCH
 	fg_pattern = grep_calloc(patterns, sizeof(*fg_pattern));
+#endif
 	r_pattern = grep_calloc(patterns, sizeof(*r_pattern));
 
 	/* Check if cheating is allowed (always is for fgrep). */
 	for (i = 0; i < patterns; ++i) {
+#ifndef WITHOUT_FASTMATCH
+		/* Attempt compilation with fastmatch regex and fallback to
+		   regex(3) if it fails. */
 		if (fastncomp(&fg_pattern[i], pattern[i].pat,
-		    pattern[i].len, cflags) != 0) {
-			/* Fall back to full regex library */
-			c = regcomp(&r_pattern[i], pattern[i].pat, cflags);
-			if (c != 0) {
-				regerror(c, &r_pattern[i], re_error,
-				    RE_ERROR_BUF);
-				errx(2, "%s", re_error);
-			}
+		    pattern[i].len, cflags) == 0)
+			continue;
+#endif
+		c = regcomp(&r_pattern[i], pattern[i].pat, cflags);
+		if (c != 0) {
+			regerror(c, &r_pattern[i], re_error,
+			    RE_ERROR_BUF);
+			errx(2, "%s", re_error);
 		}
 	}
 

Modified: head/usr.bin/grep/grep.h
==============================================================================
--- head/usr.bin/grep/grep.h	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/usr.bin/grep/grep.h	Fri Apr 21 14:36:09 2017	(r317254)
@@ -36,7 +36,9 @@
 #include <stdio.h>
 #include <zlib.h>
 
+#ifndef WITHOUT_FASTMATCH
 #include "fastmatch.h"
+#endif
 
 #ifdef WITHOUT_NLS
 #define	getstr(n)	 errstr[n]
@@ -127,7 +129,9 @@ extern unsigned int dpatterns, fpatterns
 extern struct pat *pattern;
 extern struct epat *dpattern, *fpattern;
 extern regex_t	*er_pattern, *r_pattern;
+#ifndef WITHOUT_FASTMATCH
 extern fastmatch_t *fg_pattern;
+#endif
 
 /* For regex errors  */
 #define	RE_ERROR_BUF	512

Modified: head/usr.bin/grep/util.c
==============================================================================
--- head/usr.bin/grep/util.c	Fri Apr 21 13:45:01 2017	(r317253)
+++ head/usr.bin/grep/util.c	Fri Apr 21 14:36:09 2017	(r317254)
@@ -49,7 +49,9 @@ __FBSDID("$FreeBSD$");
 #include <wchar.h>
 #include <wctype.h>
 
+#ifndef WITHOUT_FASTMATCH
 #include "fastmatch.h"
+#endif
 #include "grep.h"
 
 static int	 linesqueued;
@@ -317,10 +319,12 @@ procline(struct str *l, int nottext)
 		for (i = 0; i < patterns; i++) {
 			pmatch.rm_so = st;
 			pmatch.rm_eo = l->len;
+#ifndef WITHOUT_FASTMATCH
 			if (fg_pattern[i].pattern)
 				r = fastexec(&fg_pattern[i],
 				    l->dat, 1, &pmatch, leflags);
 			else
+#endif
 				r = regexec(&r_pattern[i], l->dat, 1,
 				    &pmatch, leflags);
 			r = (r == 0) ? 0 : REG_NOMATCH;
@@ -332,7 +336,11 @@ procline(struct str *l, int nottext)
 				    (size_t)pmatch.rm_eo != l->len)
 					r = REG_NOMATCH;
 			/* Check for whole word match */
+#ifndef WITHOUT_FASTMATCH
 			if (r == 0 && (wflag || fg_pattern[i].word)) {
+#else
+			if (r == 0 && wflag) {
+#endif
 				wchar_t wbegin, wend;
 
 				wbegin = wend = L' ';



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704211436.v3LEa9Ns035517>