PERFORCE change 167428 for review
David Forsythe
dforsyth at FreeBSD.org
Mon Aug 17 08:12:27 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167428
Change 167428 by dforsyth at squirrel on 2009/08/17 08:11:54
Modify manifest add functions to return pointer to newly added entry. Speed up
plist parse.
Affected files ...
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#45 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#40 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db.c#12 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db_hierdb_read.c#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest.c#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest.h#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest_plist.c#7 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#18 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#15 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#32 edit
Differences ...
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#45 (text+ko) ====
@@ -96,7 +96,7 @@
}
/* Retrieve pkg identity. In hierdb, this is the directory containing the
- * plist. This is a client set identifier, so conflict and dependendency
+ * plist. This is a client set identifier, so conflict and dependency
* checks should not rely on it. */
const char *
@@ -382,17 +382,15 @@
pkg_add_pkg_file(struct pkg *p, const char *path, const char *cwd, const char *md5,
const char *mode, const char *owner, const char *group)
{
- int status;
-
pkg_check_magic(p, __func__);
/* TODO: Add some sanity checks in here. */
- status = PKG_OK;
pkg_parse_manifest(p);
- status |= pkg_manifest_add_file(p->pm, path, md5, cwd, mode, owner, group);
+ if (pkg_manifest_add_file(p->pm, path, md5, cwd, mode, owner, group) == NULL)
+ return (PKG_NOT_OK);
- return (status);
+ return (PKG_OK);
}
int
@@ -472,7 +470,9 @@
{
pkg_check_magic(p, __func__);
pkg_parse_manifest(p);
- return (pkg_manifest_add_depend(p->pm, name, origin, version));
+ if (pkg_manifest_add_depend(p->pm, name, origin, version) == NULL)
+ return (PKG_NOT_OK);
+ return (PKG_OK);
}
#if 0
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#40 (text+ko) ====
@@ -1,6 +1,8 @@
#ifndef __PKG_H__
#define __PKG_H__
+#include <stdio.h> /* For FILE in pkg_dump */
+
/* Plist/DB types. Format is 0xXXXXYYYY, where XXXX is manifest type, and YYYY is db type. */
/* HIERDB: Assumes information is stored in files with names with a preceding '+'.
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db.c#12 (text+ko) ====
@@ -132,24 +132,23 @@
char **list;
struct pkg *entries;
- if (db->pkg_count % 10 == 0) {
- entries = db->pkg_entries;
- list = db->pkg_list;
- db->pkg_entries = realloc(entries, sizeof(*entries) * (db->pkg_count + 11));
- db->pkg_list = realloc(list, sizeof(*list) * (db->pkg_count + 11));
- if (db->pkg_entries == NULL || db->pkg_list == NULL) {
- printf("need moar memory\n");
- exit(100);
- }
+
+ list = NULL;
+ entries = NULL;
+ PARALLEL_ARRAY_LIST_REALLOC(db->pkg_entries, entries, db->pkg_list, list, db->pkg_count, 10);
+
+ if (db->pkg_entries == NULL || db->pkg_list == NULL) {
+ db->pkg_entries = entries;
+ db->pkg_list = list;
+ return (PKG_NOT_OK | PKG_MEMORY_ERR);
}
-
- __pkg_init(&db->pkg_entries[db->pkg_count]);
- status = pkg_clone(p, &db->pkg_entries[db->pkg_count]);
+
+ __pkg_init(&db->pkg_entries[db->pkg_count - 1]);
+ status = pkg_clone(p, &db->pkg_entries[db->pkg_count - 1]);
/* reuse entries. */
- entries = &db->pkg_entries[db->pkg_count];
- db->pkg_list[db->pkg_count] = entries->ident;
- __pkg_set_in_db_ptr(&db->pkg_entries[db->pkg_count], db);
- db->pkg_count++;
+ entries = &db->pkg_entries[db->pkg_count - 1];
+ db->pkg_list[db->pkg_count - 1] = entries->ident;
+ __pkg_set_in_db_ptr(&db->pkg_entries[db->pkg_count - 1], db);
db->pkg_list[db->pkg_count] = NULL;
return (status);
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db_hierdb_read.c#6 (text+ko) ====
@@ -227,23 +227,14 @@
FILE *reqdby_stream;
if (!pkg_db_hierdb_file_exists(db, p, REQUIRED_BY_FILE))
- return (PKG_OK); /* REQUIRED_BY doesn't have to exist. */
+ return (PKG_OK); /* +REQUIRED_BY doesn't have to exist. */
reqdby_stream = pkg_db_hierdb_open_file_stream_read(db, p, REQUIRED_BY_FILE);
- for (count = 0, reqdby = NULL; fgets(line, FILENAME_MAX, reqdby_stream) != NULL; count++) {
- if (count % 10 == 0) {
- list = reqdby;
- reqdby = realloc(list, sizeof(*list) * (count + 11));
- if (reqdby == NULL) {
- reqdby = list;
- return (PKG_MEMORY_ERR | PKG_NOT_OK);
- }
- }
+ for (count = 0, reqdby = NULL; fgets(line, FILENAME_MAX, reqdby_stream) != NULL;) {
pkg_util_trim_newline(line);
- reqdby[count] = strdup(line);
+ STRING_LIST_APPEND(reqdby, line, list, count, 10);
}
- reqdby[count] = NULL;
-
+
fclose(reqdby_stream);
__pkg_set_required_by_ptr(p, reqdby);
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest.c#6 (text+ko) ====
@@ -222,7 +222,7 @@
return ((const char *const *)pm->dirrm_list);
}
-int
+struct pkg_conflict *
pkg_manifest_add_conflict(struct pkg_manifest *pm, const char *name,
const char *version)
{
@@ -236,32 +236,29 @@
rage_quit();
}
- if (pm->conflict_count % 5 == 0) {
- list = pm->conflict_list;
- conflicts = pm->conflict_entries;
- pm->conflict_list = realloc(list, sizeof(*list) * (pm->conflict_count + 6));
- pm->conflict_entries = realloc(conflicts, sizeof(*conflicts) * (pm->conflict_count + 6));
- if (pm->conflict_list == NULL || pm->conflict_entries == NULL) {
- pm->conflict_list = list;
- pm->conflict_entries = conflicts;
- return (PKG_MEMORY_ERR | PKG_NOT_OK);
- }
+ list = NULL;
+ conflicts = NULL;
+ PARALLEL_ARRAY_LIST_REALLOC(pm->conflict_entries, conflicts, pm->conflict_list, list, pm->conflict_count, 5);
+ if (pm->conflict_entries == NULL || pm->conflict_list == NULL) {
+ pm->conflict_entries = conflicts;
+ pm->conflict_list = list;
+ return (NULL);
}
status = PKG_OK;
- pc = &pm->conflict_entries[pm->conflict_count];
+ pc = &pm->conflict_entries[pm->conflict_count - 1];
pkg_conflict_init(pc);
status |= pkg_conflict_set_name(pc, name);
status |= pkg_conflict_set_version(pc, version);
- pm->conflict_list[pm->conflict_count++] = pc->name;
+ pm->conflict_list[pm->conflict_count - 1] = pc->name;
pm->conflict_list[pm->conflict_count] = NULL;
- return (status);
+ return (pc);
}
-int
+struct pkg_depend *
pkg_manifest_add_depend(struct pkg_manifest *pm, const char *name,
const char *version, const char *origin)
{
@@ -274,36 +271,33 @@
pkg_error_msg("cant insert conflict without name into manifest.\n");
rage_quit();
}
-
- if (pm->depend_count % 10 == 0) {
- list = pm->depend_list;
- depends = pm->depend_entries;
- pm->depend_list = realloc(list, sizeof(*list) * (pm->depend_count + 11));
- pm->depend_entries = realloc(depends, sizeof(*depends) * (pm->depend_count + 11));
- if (pm->depend_list == NULL || pm->depend_entries == NULL) {
- pm->depend_list = list;
- pm->depend_entries = depends;
- return (PKG_MEMORY_ERR | PKG_NOT_OK);
- }
+
+ list = NULL;
+ depends = NULL;
+ PARALLEL_ARRAY_LIST_REALLOC(pm->depend_entries, depends, pm->depend_list, list, pm->depend_count, 10);
+ if (pm->depend_entries == NULL || pm->depend_list == NULL) {
+ pm->depend_entries = depends;
+ pm->depend_list = list;
+ return (NULL);
}
status = PKG_OK;
- pd = &pm->depend_entries[pm->depend_count];
+ pd = &pm->depend_entries[pm->depend_count - 1];
pkg_depend_init(pd);
status |= pkg_depend_set_name(pd, name);
status |= pkg_depend_set_origin(pd, origin);
status |= pkg_depend_set_version(pd, version);
- pm->depend_list[pm->depend_count++] = pd->name;
+ pm->depend_list[pm->depend_count - 1] = pd->name;
pm->depend_list[pm->depend_count] = NULL;
- return (status);
+ return (pd);
}
/* Add a file to a manifest. */
-int
+struct pkg_file *
pkg_manifest_add_file(struct pkg_manifest *pm, const char *path, const char *md5,
const char *cwd, const char *mode, const char *owner, const char *group)
{
@@ -313,26 +307,22 @@
struct pkg_file *pf;
if (path == NULL) {
- /* Everything else has defaults. */
- pkg_error_msg("");
+ pkg_error_msg("Cannot add file with empty path to manifest.\n");
rage_quit();
}
-
- if (pm->file_count % 10 == 0) {
- list = pm->file_list;
- files = pm->file_entries;
- pm->file_list = realloc(list, sizeof(*list) * (pm->file_count + 11));
- pm->file_entries = realloc(files, sizeof(*files) * (pm->file_count + 11));
- if (pm->file_list == NULL || pm->file_entries == NULL) {
- pm->file_list = list;
- pm->file_entries = files;
- return (PKG_MEMORY_ERR | PKG_NOT_OK);
- }
+
+ list = NULL;
+ files = NULL;
+ PARALLEL_ARRAY_LIST_REALLOC(pm->file_entries, files, pm->file_list, list, pm->file_count, 10);
+ if (pm->file_entries == NULL || pm->file_list == NULL) {
+ pm->file_entries = files;
+ pm->file_list = list;
+ return (NULL);
}
status = PKG_OK;
- pf = &pm->file_entries[pm->file_count];
+ pf = &pm->file_entries[pm->file_count - 1];
pkg_file_init(pf);
status |= pkg_file_set_path(pf, path);
status |= pkg_file_set_md5(pf, md5);
@@ -341,10 +331,10 @@
status |= pkg_file_set_owner(pf, owner);
status |= pkg_file_set_group(pf, group);
- pm->file_list[pm->file_count++] = pf->path;
+ pm->file_list[pm->file_count - 1] = pf->path;
pm->file_list[pm->file_count] = NULL;
- return (status);
+ return (pf);
}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest.h#6 (text+ko) ====
@@ -125,13 +125,13 @@
int pkg_manifest_add_dirrm_cmd(struct pkg_manifest *pm, const char *dir);
-int pkg_manifest_add_conflict(struct pkg_manifest *pm, const char *name,
+struct pkg_conflict *pkg_manifest_add_conflict(struct pkg_manifest *pm, const char *name,
const char *version);
-int pkg_manifest_add_depend(struct pkg_manifest *pm, const char *name,
+struct pkg_depend *pkg_manifest_add_depend(struct pkg_manifest *pm, const char *name,
const char *version, const char *origin);
-int pkg_manifest_add_file(struct pkg_manifest *pm, const char *path, const char *md5,
+struct pkg_file *pkg_manifest_add_file(struct pkg_manifest *pm, const char *path, const char *md5,
const char *cwd, const char *mode, const char *owner, const char *group);
void pkg_manifest_remove_conflict(struct pkg_manifest *pm, const char *name);
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_manifest_plist.c#7 (text+ko) ====
@@ -63,9 +63,9 @@
char *group;
char *mode;
- char *last_rel_conflict;
- char *last_rel_depend;
- char *last_rel_file;
+ struct pkg_conflict *last_conflict;
+ struct pkg_depend *last_depend;
+ struct pkg_file *last_file;
};
static void parse_state_set_default(struct plist_parse_state *st);
@@ -95,9 +95,9 @@
static void
parse_state_reset_last_rel(struct plist_parse_state *st)
{
- st->last_rel_conflict = NULL;
- st->last_rel_depend = NULL;
- st->last_rel_file = NULL;
+ st->last_conflict = NULL;
+ st->last_depend = NULL;
+ st->last_file = NULL;
}
int
@@ -212,8 +212,6 @@
char trail[FILENAME_MAX];
/* Last file and depend. */
- struct pkg_file *lpf;
- struct pkg_depend *lpd;
status = PKG_OK;
argc = sscanf(line, "%s %[^\n]", cmd, argument);
@@ -343,8 +341,7 @@
status = PKG_NOT_OK;
break;
}
- status = pkg_manifest_add_depend(pm, isolate, NULL, NULL);
- status |= pkg_util_strdup(isolate, &st->last_rel_depend);
+ st->last_depend = pkg_manifest_add_depend(pm, isolate, NULL, NULL);
break;
case (PM_CONFLICTS):
if (strlen(isolate) == 0) {
@@ -352,8 +349,7 @@
status = PKG_NOT_OK;
break;
}
- status = pkg_manifest_add_conflict(pm, isolate, NULL);
- status |= pkg_util_strdup(isolate, &st->last_rel_conflict);
+ st->last_conflict = pkg_manifest_add_conflict(pm, isolate, NULL);
break;
case (PM_COMMENT):
if (strchr(argument, (int)':') != NULL) {
@@ -363,7 +359,7 @@
} else if (sscanf(argument, "ORIGIN:%s %[^\n]", isolate, trail) >= 1) {
status = pkg_util_strdup(isolate, &pm->origin);
} else if (sscanf(argument, "DEPORIGIN:%s %[^\n]", isolate, trail) >= 1) {
- if (st->last_rel_depend == NULL) {
+ if (st->last_depend == NULL) {
pkg_error_msg("misplaced meta comment: deporigin.");
status = PKG_NOT_OK;
break;
@@ -373,11 +369,10 @@
status = PKG_NOT_OK;
break;
}
- lpd = pkg_manifest_select_depend(pm, st->last_rel_depend);
- status = pkg_depend_set_origin(lpd, isolate);
+ status = pkg_depend_set_origin(st->last_depend, isolate);
} else if (sscanf(argument, "MD5:%s %[^\n]", isolate, trail) >= 1) {
- if (st->last_rel_file == NULL) {
- pkg_error_msg("misplace meta comment: md5.");
+ if (st->last_file == NULL) {
+ pkg_error_msg("misplaced meta comment: md5.");
status = PKG_NOT_OK;
break;
}
@@ -386,21 +381,23 @@
status = PKG_NOT_OK;
break;
}
- lpf = pkg_manifest_select_file(pm, st->last_rel_file);
- status = pkg_file_set_md5(lpf, isolate);
+ status = pkg_file_set_md5(st->last_file, isolate);
break;
} /* else { unrecognized comment. } */
}
break;
case (PM_FILE):
pkg_util_trim_newline(line);
- status = pkg_manifest_add_file(pm, line, NULL, st->cwd, st->mode,
+ st->last_file = pkg_manifest_add_file(pm, line, NULL, st->cwd, st->mode,
st->owner, st->group);
- lpf = pkg_manifest_select_file(pm, line);
- if (lpf != NULL)
- status |= pkg_file_set_ignored(lpf);
- st->ignore_next_file = 0;
- status = pkg_util_strdup(line, &st->last_rel_file);
+ if (st->last_file == NULL) {
+ pkg_error_msg("plist parse: add file failed.\n");
+ return (PKG_NOT_OK);
+ }
+ if (st->ignore_next_file != 0) {
+ status |= pkg_file_set_ignored(st->last_file);
+ st->ignore_next_file = 0;
+ }
break;
case (PM_UNKNOWN):
default:
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#18 (text+ko) ====
@@ -187,6 +187,8 @@
(group != NULL ? group : BAD_OR_UNKNOWN_VALUE));
fprintf(stream, "\t\t\tMODE: %s\n",
(mode != NULL ? mode : BAD_OR_UNKNOWN_VALUE));
+ fprintf(stream, "\t\t\tIGNORED: %s\n",
+ (pkg_pkg_file_ignored(p, file) ? "yes" : "no"));
}
fprintf(stream, "\tdepends:\n");
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#15 (text+ko) ====
@@ -2,6 +2,8 @@
#define __PKG_UTIL_H__
#include <dirent.h>
+#include "pkg_error.h"
+#include "pkg.h"
void pkg_util_trim_newline(char *to_trim);
@@ -17,10 +19,33 @@
void rage_quit(void);
-#define APPEND_TO_ARRAY_AND_LIST(struct_type, entries, list, tmp_entries, tmp_list, current_count, increase) \
- tmp_list = list; \
- tmp_entries = entries; \
- list = realloc(tmp_list, sizeof(*tmp_list) * (current_count + increase)); \
- entries = realloc(tmp_entries, sizeof(tmp_entries) * (current_count + increase));
+#define STRING_LIST_APPEND(list, append, tmp_list, list_sz, factor) \
+ if (list_sz % factor == 0) { \
+ tmp_list = list; \
+ list = realloc(tmp_list, sizeof(*tmp_list) * (list_sz + factor + 1)); \
+ } \
+ if (list != NULL) { \
+ list[list_sz++] = strdup(append); \
+ list[list_sz] = NULL; \
+ }
+
+#define ARRAY_FACTOR_REALLOC(array, tmp_array, array_sz, factor) \
+ if (array_sz % factor == 0) { \
+ tmp_array = array; \
+ array = realloc(tmp_array, sizeof(*tmp_array) * (array_sz + factor + 1)); \
+ } \
+ if (array != NULL) \
+ array_sz++
+
+#define PARALLEL_ARRAY_LIST_REALLOC(array, tmp_array, list, tmp_list, sz, factor) \
+ if (sz % factor == 0) { \
+ tmp_array = array; \
+ tmp_list = list; \
+ array = realloc(tmp_array, sizeof(*tmp_array) * (sz + factor + 1)); \
+ list = realloc(tmp_list, sizeof(*tmp_list) * (sz + factor + 1)); \
+ } \
+ if (array != NULL && list != NULL) \
+ sz++
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#32 (text+ko) ====
@@ -74,6 +74,7 @@
pkg_db_close(db);
pkg_db_delete(db);
+
return (EXIT_SUCCESS);
}
@@ -306,8 +307,9 @@
klist = pkg_required_by(p);
if (klist != NULL) {
fprintf(out, "Required by:\n");
- for (; *klist != NULL; buff = *klist++)
+ for (buff = *klist; *klist != NULL; buff = *++klist) {
printf("%s\n", buff);
+ }
}
printf("\n");
}
More information about the p4-projects
mailing list