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