PERFORCE change 123157 for review

Garrett Cooper gcooper at FreeBSD.org
Sun Jul 8 20:42:56 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=123157

Change 123157 by gcooper at optimus-revised_pkgtools on 2007/07/08 20:41:56

	Added minor buffering attempts for parsing +CONTENTS (it appears that this is a point of concern when
	installing files -- lags quite a bit according to the data I've compiled over the lifetime of the process),
	and simple profiling scripts (in Perl and bourne shell) to help illustrate my point.
	
	Please note that in its current state this requires a lot of disk space. I racked up 25 GB of text files
	and logs for running 500 iterations on 128 packages.
	
	Use ./run_prof.sh with arguments (origin name for a package) or none to glob for all packages present in /usr/ports/packages/All

Affected files ...

.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/add/perform.c#3 edit
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/lib.h#3 edit
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/pen.c#3 edit
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/plist.c#3 edit
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/prof_scripts/prof_postprocess.pl#1 add
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/prof_scripts/prof_process.pl#1 add
.. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/prof_scripts/run_prof.sh#1 add

Differences ...

==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/add/perform.c#3 (text+ko) ====

@@ -136,18 +136,35 @@
 		sb.st_size = 100000;	/* Make up a plausible average size */
 	    }
 	    Home = make_playpen(playpen, sb.st_size * 4);
+
+	    static struct timespec before, after, time_diff;
+
 	    if (!Home)
 		errx(1, "unable to make playpen for %lld bytes", (long long)sb.st_size * 4);
 	    where_to = Home;
+
+    	    clock_gettime(CLOCK_REALTIME, &before);
+
 	    /* Since we can call ourselves recursively, keep notes on where we came from */
 	    if (!getenv("_TOP"))
 		setenv("_TOP", Home, 1);
+
+	    clock_gettime(CLOCK_REALTIME, &after);
+
+	    time_diff.tv_nsec = after.tv_nsec - before.tv_nsec;
+	    time_diff.tv_sec = after.tv_sec - before.tv_sec;
+
+    	    printf(  "(%s) Difference: %3.20lf secs\n", "_TOP setenv", (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 )  );
+
 	    if (unpack(pkg_fullname, extract)) {
 		warnx(
 	"unable to extract table of contents file from '%s' - not a package?",
 		pkg_fullname);
 		goto bomb;
 	    }
+
+    	    clock_gettime(CLOCK_REALTIME, &before);
+
 	    cfile = fopen(CONTENTS_FNAME, "r");
 	    if (!cfile) {
 		warnx(
@@ -155,6 +172,14 @@
 		CONTENTS_FNAME);
 		goto bomb;
 	    }
+
+	    clock_gettime(CLOCK_REALTIME, &after);
+
+	    time_diff.tv_nsec = after.tv_nsec - before.tv_nsec;
+	    time_diff.tv_sec = after.tv_sec - before.tv_sec;
+
+    	    printf(  "(%s) Difference: %3.20lf secs\n", "+CONTENTS fopen", (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 )  );
+
 	    read_plist(&Plist, cfile);
 	    fclose(cfile);
 

==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/lib.h#3 (text+ko) ====

@@ -105,6 +105,17 @@
 #define PLIST_FMT_VER_MAJOR	1
 #define PLIST_FMT_VER_MINOR	1
 
+#define BUFFER_TRY 1
+#define SIMPLE_PROF_TRY 1
+
+#ifndef BUFFER_TRY
+#define BUFFER_TRY 0
+#endif
+
+#ifndef SIMPLE_PROF_TRY
+#define SIMPLE_PROF_TRY 0
+#endif
+
 enum _plist_t {
     PLIST_FILE, PLIST_CWD, PLIST_CMD, PLIST_CHMOD,
     PLIST_CHOWN, PLIST_CHGRP, PLIST_COMMENT, PLIST_IGNORE,
@@ -158,7 +169,18 @@
 char		*where_playpen(void);
 void		leave_playpen(void);
 off_t		min_free(const char *);
+//static char     *find_playpen(char *, off_t);
+
+#if SIMPLE_PROF_TRY
+
+char		*make_playpen_np(char *, off_t);
+void		leave_playpen_np(void);
+char            *find_playpen_np(char *, off_t);
+
+char*           run_generic_playpen_prof(char *fn_name, ...);
 
+#endif
+
 /* String */
 char 		*get_dash_string(char **);
 char		*copy_string(const char *);
@@ -189,6 +211,10 @@
 int		unpack(const char *, const char *);
 void		format_cmd(char *, int, const char *, const char *, const char *);
 
+#if SIMPLE_PROF_TRY
+int             delete_hierarchy_np(const char *, Boolean, Boolean);
+#endif
+
 /* Msg */
 void		upchuck(const char *);
 void		barf(const char *, ...);
@@ -213,6 +239,19 @@
 int		delete_package(Boolean, Boolean, Package *);
 Boolean 	make_preserve_name(char *, int, const char *, const char *);
 
+#if SIMPLE_PROF_TRY
+
+int             run_generic_plist_prof(char *fn_name, ...);
+void		add_plist_np(Package *, plist_t, const char *);
+void		add_plist_top_np(Package *, plist_t, const char *);
+void		delete_plist_np(Package *pkg, Boolean all, plist_t type, const char *name);
+void		write_plist_np(Package *, FILE *);
+void		read_plist_np(Package *, FILE *);
+int		plist_cmd_np(const char *, char **);
+int		delete_package_np(Boolean, Boolean, Package *);
+
+#endif
+
 /* For all */
 int		pkg_perform(char **);
 int		real_main(int, char **);

==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/pen.c#3 (text+ko) ====

@@ -32,16 +32,72 @@
 static char PenLocation[FILENAME_MAX];
 static char Previous[FILENAME_MAX];
 
+#if SIMPLE_PROF_TRY
+char *
+run_generic_playpen_prof(char *fn_name, ...)
+{
+
+    static struct timespec before, after, time_diff;
+
+    va_list arg_list;
+
+    va_start(arg_list, fn_name);
+
+    clock_gettime(CLOCK_PROF, &before);
+
+    char *ret_string = NULL;
+
+    if(!strcmp(fn_name, "make_playpen")) {
+
+	char *pen = va_arg(arg_list, char*);
+	off_t sz = va_arg(arg_list, off_t);
+
+	ret_string = make_playpen_np(pen, sz);
+
+    } else if(!strcmp(fn_name, "find_playpen")) {
+
+	char *pen = va_arg(arg_list, char*);
+	off_t sz = va_arg(arg_list, off_t);
+
+	ret_string = find_playpen_np(pen, sz);
+
+    } else if(!strcmp(fn_name, "leave_playpen")) {
+	leave_playpen_np();
+    }
+
+    clock_gettime(CLOCK_PROF, &after);
+
+    va_end(arg_list);
+
+    time_diff.tv_nsec = after.tv_nsec - before.tv_nsec;
+
+    time_diff.tv_sec = after.tv_sec - before.tv_sec;
+
+    printf(  "(%s) Difference: %3.20lf secs\n", fn_name, (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 )  );
+
+    return ret_string;
+
+}
+#endif
+
 char *
 where_playpen(void)
 {
     return PenLocation;
 }
 
+static char *
+find_playpen(char *pen, off_t sz) {
+#if SIMPLE_PROF_TRY
+    return run_generic_playpen_prof("find_playpen", pen, sz);
+}
+
 /* Find a good place to play. */
-static char *
-find_play_pen(char *pen, off_t sz)
+char *
+find_playpen_np(char *pen, off_t sz)
 {
+#endif
+
     char *cp;
     struct stat sb;
 
@@ -91,14 +147,23 @@
     free(pstack[pdepth--]);
 }
     
+char *
+make_playpen(char *pen, off_t sz)
+{
+#if SIMPLE_PROF_TRY
+    return run_generic_playpen_prof("make_playpen", pen, sz);
+}
+
 /*
  * Make a temporary directory to play in and chdir() to it, returning
  * pathname of previous working directory.
  */
 char *
-make_playpen(char *pen, off_t sz)
+make_playpen_np(char *pen, off_t sz)
 {
-    if (!find_play_pen(pen, sz))
+#endif
+
+    if (!find_playpen(pen, sz))
 	return NULL;
 
     if (!mkdtemp(pen)) {
@@ -139,10 +204,19 @@
     return Previous;
 }
 
+void
+leave_playpen()
+{
+#if SIMPLE_PROF_TRY
+    run_generic_playpen_prof("leave_playpen");
+}
+
 /* Convenience routine for getting out of playpen */
 void
-leave_playpen()
+leave_playpen_np()
 {
+#endif
+
     void (*oldsig)(int);
 
     /* Don't interrupt while we're cleaning up */

==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/plist.c#3 (text+ko) ====

@@ -25,10 +25,109 @@
 #include <err.h>
 #include <md5.h>
 
+#include <stdarg.h>
+#include <sys/time.h>
+
+#if SIMPLE_PROF_TRY
+int
+run_generic_plist_prof(char *fn_name, ...)
+{
+
+    static struct timespec before, after, time_diff;
+
+    va_list arg_list;
+
+    int ret_code = 0;
+
+    va_start(arg_list, fn_name);
+
+    clock_gettime(CLOCK_REALTIME, &before);
+
+    if(!strcmp(fn_name, "read_plist")) {
+
+	Package *pkg = va_arg(arg_list, Package*);
+	FILE *fp = va_arg(arg_list, FILE*);
+
+	read_plist_np(pkg, fp);
+
+    } else if(!strcmp(fn_name, "write_plist")) {
+
+	Package *pkg = va_arg(arg_list, Package*);
+	FILE *fp = va_arg(arg_list, FILE*);
+
+	write_plist_np(pkg, fp);
+
+    } else if(!strcmp(fn_name, "delete_package")) {
+
+	Boolean ign_err = va_arg(arg_list, Boolean);
+	Boolean rem_dirs = va_arg(arg_list, Boolean);
+
+	Package *pkg = va_arg(arg_list, Package*);
+
+	ret_code = delete_package_np(ign_err, rem_dirs, pkg);
+
+    } else if(!strcmp(fn_name, "delete_hierarchy")) {
+
+	char *dirname = (char*) va_arg(arg_list, const char*);
+
+	Boolean ign_err = va_arg(arg_list, Boolean);
+	Boolean rem_dirs = va_arg(arg_list, Boolean);
+
+	ret_code = delete_hierarchy_np(dirname, ign_err, rem_dirs);
+
+    } else if(!strcmp(fn_name, "plist_cmd")) {
+
+	char * str = va_arg(arg_list, char*);
+	char ** arg = va_arg(arg_list, char**);
+
+	ret_code = plist_cmd_np(str, arg);
+
+    } else if(!strcmp(fn_name, "add_plist")) {
+
+	Package *p = va_arg(arg_list, Package*);
+	plist_t type = va_arg(arg_list, plist_t);
+	const char *arg = va_arg(arg_list, const char*);
+
+	add_plist_np(p, type, arg);
+
+    } else if(!strcmp(fn_name, "add_plist_top")) {
+
+	Package *p = va_arg(arg_list, Package*);
+	plist_t type = va_arg(arg_list, plist_t);
+	const char *arg = va_arg(arg_list, const char*);
+
+	add_plist_top_np(p, type, arg);
+
+    }
+
+    clock_gettime(CLOCK_REALTIME, &after);
+
+    va_end(arg_list);
+
+    time_diff.tv_nsec = after.tv_nsec - before.tv_nsec;
+
+    time_diff.tv_sec = after.tv_sec - before.tv_sec;
+
+    printf(  "(%s) Difference: %3.20lf secs\n", fn_name, (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 )  );
+
+    return ret_code;
+
+}
+#endif
+
 /* Add an item to a packing list */
 void
 add_plist(Package *p, plist_t type, const char *arg)
 {
+#if SIMPLE_PROF_TRY
+    run_generic_plist_prof("add_plist", p, type, arg);
+}
+
+void
+add_plist_np(Package *p, plist_t type, const char *arg)
+{
+#endif
+
     PackingList tmp;
 
     tmp = new_plist_entry();
@@ -54,11 +153,20 @@
     default:
 	break;
     }
+
 }
 
 void
 add_plist_top(Package *p, plist_t type, const char *arg)
 {
+#if SIMPLE_PROF_TRY
+    run_generic_plist_prof("add_plist_top", p, type, arg);
+}
+
+void
+add_plist_top_np(Package *p, plist_t type, const char *arg)
+{
+#endif
     PackingList tmp;
 
     tmp = new_plist_entry();
@@ -176,13 +284,22 @@
     pkg->head = pkg->tail = NULL;
 }
 
+int
+plist_cmd(const char *s, char **arg)
+{
+#if SIMPLE_PROF_TRY
+    return run_generic_plist_prof("plist_cmd", s, arg);
+}
+
 /*
  * For an ascii string denoting a plist command, return its code and
  * optionally its argument(s)
  */
 int
-plist_cmd(const char *s, char **arg)
+plist_cmd_np(const char *s, char **arg)
 {
+#endif
+
     char cmd[FILENAME_MAX + 20];	/* 20 == fudge for max cmd len */
     char *cp;
     const char *sp;
@@ -251,32 +368,85 @@
 	return FAIL;
 }
 
+void
+read_plist(Package *pkg, FILE *fp)
+{
+#if SIMPLE_PROF_TRY
+    run_generic_plist_prof("read_plist", pkg, fp);
+}
+
 /* Read a packing list from a file */
 void
-read_plist(Package *pkg, FILE *fp)
+read_plist_np(Package *pkg, FILE *fp)
 {
-    char *cp, pline[FILENAME_MAX];
-    int cmd, major, minor;
+#endif
+
+#if BUFFER_TRY
+
+#define MAX_BUFFER_LINES 20
+
+    char pline[MAX_BUFFER_LINES][FILENAME_MAX];
+
+    int i = -1;
+    int j = -1;
+
+#else
+    char pline[FILENAME_MAX];
+#endif
+
+    char *cp;
+    int cmd, len, major, minor;
 
     pkg->fmtver_maj = 1;
     pkg->fmtver_mnr = 0;
     pkg->origin = NULL;
+
+#if BUFFER_TRY
+
+    while (i) {
+
+	for(i = 0; i < MAX_BUFFER_LINES && fgets(pline[i], FILENAME_MAX, fp); i++) ; 
+
+	if(!i)
+	    break;
+
+	for(j = 0; j < i; j++) {
+
+	    len = strlen(pline[j]);
+
+	    while(len && isspace(pline[j][len-1]))
+		pline[j][--len] = '\0';
+	    if(!len)
+		continue;
+	    cp = pline[j];
+
+#else
+
     while (fgets(pline, FILENAME_MAX, fp)) {
-	int len = strlen(pline);
+	len = strlen(pline);
 
 	while (len && isspace(pline[len - 1]))
 	    pline[--len] = '\0';
 	if (!len)
 	    continue;
 	cp = pline;
-	if (pline[0] != CMD_CHAR) {
+
+#endif
+
+	if (cp[0] != CMD_CHAR) {
 	    cmd = PLIST_FILE;
 	    goto bottom;
 	}
+
+#if BUFFER_TRY
+	    cmd = plist_cmd(pline[j] + 1, &cp);
+#else
 	cmd = plist_cmd(pline + 1, &cp);
+#endif
+
 	if (cmd == FAIL) {
 	    warnx("%s: unknown command '%s' (package tools out of date?)",
-		__func__, pline);
+		__func__, cp);
 	    goto bottom;
 	}
 	if (*cp == '\0') {
@@ -298,15 +468,31 @@
 		exit(2);
 	    }
 	}
+
 bottom:
 	add_plist(pkg, cmd, cp);
+#if BUFFER_TRY
+
+        }
+#endif
+
     }
+
+}
+
+void
+write_plist(Package *pkg, FILE *fp)
+{
+#if SIMPLE_PROF_TRY
+    run_generic_plist_prof("write_plist", pkg, fp);
 }
 
 /* Write a packing list to a file, converting commands to ascii equivs */
 void
-write_plist(Package *pkg, FILE *fp)
+write_plist_np(Package *pkg, FILE *fp)
 {
+#endif
+
     PackingList plist = pkg->head;
 
     while (plist) {
@@ -402,6 +588,13 @@
     }
 }
 
+int
+delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg)
+{
+#if SIMPLE_PROF_TRY
+    return run_generic_plist_prof("delete_package", ign_err, nukedirs, pkg);
+}
+
 /*
  * Delete the results of a package installation.
  *
@@ -409,14 +602,18 @@
  * run it too in cases of failure.
  */
 int
-delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg)
+delete_package_np(Boolean ign_err, Boolean nukedirs, Package *pkg)
 {
+#endif
+
     PackingList p;
     const char *Where = ".", *last_file = "";
     Boolean fail = SUCCESS;
     Boolean preserve;
     char tmp[FILENAME_MAX], *name = NULL;
     char *prefix = NULL;
+    char linkbuf[FILENAME_MAX];
+    int len;
 
     preserve = find_plist_option(pkg, "preserve") ? TRUE : FALSE;
     for (p = pkg->head; p; p = p->next) {
@@ -464,8 +661,6 @@
 		     * by readlink().
 		     */
 		    if (issymlink(tmp) && verscmp(pkg, 1, 0) > 0) {
-			int len;
-			char linkbuf[FILENAME_MAX];
 
 			if ((len = readlink(tmp, linkbuf, FILENAME_MAX)) > 0)
 			     cp = MD5Data((unsigned char *)linkbuf, len, buf);
@@ -536,13 +731,23 @@
 #define	REMOVE(file,ie) (remove(file) && !(ie))
 #endif
 
+int
+delete_hierarchy(const char *dir, Boolean ign_err, Boolean nukedirs)
+{
+#if SIMPLE_PROF_TRY
+    return run_generic_plist_prof("delete_hierarchy", dir, ign_err, nukedirs);
+}
+
 /* Selectively delete a hierarchy */
 int
-delete_hierarchy(const char *dir, Boolean ign_err, Boolean nukedirs)
+delete_hierarchy_np(const char *dir, Boolean ign_err, Boolean nukedirs)
 {
+#endif
+
     char *cp1, *cp2;
 
     cp1 = cp2 = strdup(dir);
+
     if (!fexists(dir)) {
 	if (!ign_err)
 	    warnx("%s '%s' doesn't exist",


More information about the p4-projects mailing list