From 7e754f12d304704d44e10fd4d2fdb8710526656e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 9 Apr 2007 13:04:50 +0000 Subject: Implement first instance of NOFORK applet - echo find: use NOFORK/NOEXEC; small -exec buglet also eliminated vfork_daemon_rexec: honor PREFER_APPLETS echo: small size improvements find -exec echo {} \; with PREFER_APPLETS=y runs 4 times faster --- findutils/find.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'findutils/find.c') diff --git a/findutils/find.c b/findutils/find.c index 594eafca4..7b5a09d56 100644 --- a/findutils/find.c +++ b/findutils/find.c @@ -242,9 +242,30 @@ ACTF(exec) for (i = 0; i < ap->exec_argc; i++) argv[i] = subst(ap->exec_argv[i], ap->subst_count[i], fileName); argv[i] = NULL; /* terminate the list */ - rc = wait4pid(spawn(argv)); - if (rc) + + if (ENABLE_FEATURE_EXEC_PREFER_APPLETS) { + const struct BB_applet *a = find_applet_by_name(argv[0]); + if (a) { + if (a->nofork) { + rc = a->main(ap->exec_argc, argv); + goto f; + } +#ifndef BB_NOMMU + if (a->noexec) { + rc = fork(); + if (rc) goto w; + current_applet = a; + run_current_applet_and_exit(ap->exec_argc, argv); + } +#endif + } + } + rc = spawn(argv); + w: + rc = wait4pid(rc); + if (rc < 0) bb_perror_msg("%s", argv[0]); + f: for (i = 0; i < ap->exec_argc; i++) free(argv[i]); return rc == 0; /* return 1 if success */ -- cgit v1.2.3