PERFORCE change 185318 for review

David Forsythe dforsyth at FreeBSD.org
Tue Nov 2 03:25:51 UTC 2010


http://p4web.freebsd.org/@@185318?ac=10

Change 185318 by dforsyth at skunk on 2010/11/02 03:25:39

	Use FTS in the directorydb _all function.

Affected files ...

.. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#9 edit

Differences ...

==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#9 (text+ko) ====

@@ -12,6 +12,7 @@
 #include <sys/tree.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <fts.h>
 #include <limits.h>
 #include <unistd.h>
 
@@ -85,7 +86,6 @@
 static char		*read_file(const char *);
 static int		 _read_plist_cmp(struct _read_plist *,
 				struct _read_plist *);
-static int		 dselect(const struct dirent *);
 static void		 fbsd_directorydb_pkg_setup(struct pkg_db *,
 				struct pkg *, const char *);
 
@@ -135,12 +135,6 @@
 	return (strcmp(a->key, b->key));
 }
 
-static int
-dselect(const struct dirent *ent)
-{
-	return (ent->d_name[0] != '.' && ent->d_type == DT_DIR);
-}
-
 /* Close a "connection" to a directorydb. */
 int
 fbsd_directorydb_close(struct pkg_db *db)
@@ -245,35 +239,52 @@
 	pkg->add_file = fbsd_directorydb_add_file;
 }
 
+static int
+ftsentcmp(const FTSENT *const *ent1, const FTSENT *const *ent2)
+{
+	const FTSENT *e1;
+	const FTSENT *e2;
+
+	e1 = *ent1;
+	e2 = *ent2;
+
+	return (strcmp(e1->fts_name, e2->fts_name));
+}
+
 struct pkg_list *
 fbsd_directorydb_all(struct pkg_db *db)
 {
-	int c;
 	struct _directorydb *d;
-	struct dirent **ents;
+	FTS *ftsp;
+	FTSENT *ftsent;
+	char *paths[2];
 	struct pkg *pkg;
 	struct pkg_list *list;
-
+	
 	d = db->internal;
 	
-	/* XXX: Since I'm only doing this in _add, go back to fts for the speed.
-	 * */
-	c = scandir(d->path, &ents, dselect, alphasort);
-	if (c < 0) {
-		return (NULL);
-	}
-	
+	/* XXX: Not seeing the kind of speed up I would have liked from this
+	 * loop... */
+
+	paths[0] = strdup(d->path);
+	paths[1] = NULL;
+
+	ftsp = fts_open(paths, FTS_LOGICAL | FTS_NOCHDIR | FTS_NOSTAT,
+		ftsentcmp);
+	assert(ftsp != NULL);
+
 	list = malloc(sizeof(*list));
 	TAILQ_INIT(list);
-	for (int i = 0; i < c; ++i) {
+	while ((ftsent = fts_read(ftsp)) != NULL) {
+		if (ftsent->fts_info != FTS_D || ftsent->fts_level != 1)
+			continue;
+		fts_set(ftsp, ftsent, FTS_SKIP);
+		
 		pkg = pkg_alloc();
-		/* XXX: I should just do a get here. */
-		fbsd_directorydb_pkg_setup(db, pkg, ents[i]->d_name);
-		
+		fbsd_directorydb_pkg_setup(db, pkg, ftsent->fts_name);
 		TAILQ_INSERT_TAIL(list, pkg, next);
-		free(ents[i]);
 	}
-	free(ents);
+	fts_close(ftsp);
 
 	return (list);
 }


More information about the p4-projects mailing list