From owner-svn-src-stable-12@freebsd.org Mon Mar 30 22:07:20 2020 Return-Path: Delivered-To: svn-src-stable-12@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 9D565268B18; Mon, 30 Mar 2020 22:07:20 +0000 (UTC) (envelope-from emaste@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) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 48rmlp6ljLz4XYK; Mon, 30 Mar 2020 22:07:18 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 037DE25364; Mon, 30 Mar 2020 22:07:12 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 02UM7Bg2044205; Mon, 30 Mar 2020 22:07:11 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 02UM7BDO044204; Mon, 30 Mar 2020 22:07:11 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <202003302207.02UM7BDO044204@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Mon, 30 Mar 2020 22:07:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r359472 - stable/12/lib/libpmc/pmu-events X-SVN-Group: stable-12 X-SVN-Commit-Author: emaste X-SVN-Commit-Paths: stable/12/lib/libpmc/pmu-events X-SVN-Commit-Revision: 359472 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-12@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for only the 12-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Mar 2020 22:07:20 -0000 Author: emaste Date: Mon Mar 30 22:07:11 2020 New Revision: 359472 URL: https://svnweb.freebsd.org/changeset/base/359472 Log: MFC r343758 (mmacy): Fix deterministic builds by sorting input... ...to fts in jevents Modified: stable/12/lib/libpmc/pmu-events/jevents.c Modified: stable/12/lib/libpmc/pmu-events/jevents.c ============================================================================== --- stable/12/lib/libpmc/pmu-events/jevents.c Mon Mar 30 22:02:27 2020 (r359471) +++ stable/12/lib/libpmc/pmu-events/jevents.c Mon Mar 30 22:07:11 2020 (r359472) @@ -54,6 +54,10 @@ #include "json.h" #include "jevents.h" +static int +nftw_ordered(const char *path, int (*fn)(const char *, const struct stat *, int, + struct FTW *), int nfds, int ftwflags); + _Noreturn void _Exit(int); int verbose; @@ -1122,7 +1126,7 @@ int main(int argc, char *argv[]) maxfds = get_maxfds(); mapfile = NULL; - rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0); + rc = nftw_ordered(ldirname, preprocess_arch_std_files, maxfds, 0); if (rc && verbose) { pr_info("%s: Error preprocessing arch standard files %s: %s\n", prog, ldirname, strerror(errno)); @@ -1135,7 +1139,7 @@ int main(int argc, char *argv[]) goto empty_map; } - rc = nftw(ldirname, process_one_file, maxfds, 0); + rc = nftw_ordered(ldirname, process_one_file, maxfds, 0); if (rc && verbose) { pr_info("%s: Error walking file tree %s\n", prog, ldirname); goto empty_map; @@ -1168,4 +1172,91 @@ empty_map: create_empty_mapping(output_file); free_arch_std_events(); return 0; +} + +#include + +static int +fts_compare(const FTSENT * const *a, const FTSENT * const *b) +{ + return (strcmp((*a)->fts_name, (*b)->fts_name)); +} + +static int +nftw_ordered(const char *path, int (*fn)(const char *, const struct stat *, int, + struct FTW *), int nfds, int ftwflags) +{ + char * const paths[2] = { (char *)path, NULL }; + struct FTW ftw; + FTSENT *cur; + FTS *ftsp; + int error = 0, ftsflags, fnflag, postorder, sverrno; + + /* XXX - nfds is currently unused */ + if (nfds < 1) { + errno = EINVAL; + return (-1); + } + + ftsflags = FTS_COMFOLLOW; + if (!(ftwflags & FTW_CHDIR)) + ftsflags |= FTS_NOCHDIR; + if (ftwflags & FTW_MOUNT) + ftsflags |= FTS_XDEV; + if (ftwflags & FTW_PHYS) + ftsflags |= FTS_PHYSICAL; + else + ftsflags |= FTS_LOGICAL; + postorder = (ftwflags & FTW_DEPTH) != 0; + ftsp = fts_open(paths, ftsflags, fts_compare); + if (ftsp == NULL) + return (-1); + while ((cur = fts_read(ftsp)) != NULL) { + switch (cur->fts_info) { + case FTS_D: + if (postorder) + continue; + fnflag = FTW_D; + break; + case FTS_DC: + continue; + case FTS_DNR: + fnflag = FTW_DNR; + break; + case FTS_DP: + if (!postorder) + continue; + fnflag = FTW_DP; + break; + case FTS_F: + case FTS_DEFAULT: + fnflag = FTW_F; + break; + case FTS_NS: + case FTS_NSOK: + fnflag = FTW_NS; + break; + case FTS_SL: + fnflag = FTW_SL; + break; + case FTS_SLNONE: + fnflag = FTW_SLN; + break; + default: + error = -1; + goto done; + } + ftw.base = cur->fts_pathlen - cur->fts_namelen; + ftw.level = cur->fts_level; + error = fn(cur->fts_path, cur->fts_statp, fnflag, &ftw); + if (error != 0) + break; + } +done: + sverrno = errno; + if (fts_close(ftsp) != 0 && error == 0) + error = -1; + else + errno = sverrno; + return (error); }