From owner-p4-projects@FreeBSD.ORG Tue Nov 2 03:25:51 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3935B106566C; Tue, 2 Nov 2010 03:25:51 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E525A106564A for ; Tue, 2 Nov 2010 03:25:50 +0000 (UTC) (envelope-from dforsyth@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id B71CF8FC12 for ; Tue, 2 Nov 2010 03:25:50 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oA23Pocu002985 for ; Tue, 2 Nov 2010 03:25:50 GMT (envelope-from dforsyth@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oA23Po8u002982 for perforce@freebsd.org; Tue, 2 Nov 2010 03:25:50 GMT (envelope-from dforsyth@FreeBSD.org) Date: Tue, 2 Nov 2010 03:25:50 GMT Message-Id: <201011020325.oA23Po8u002982@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to dforsyth@FreeBSD.org using -f From: David Forsythe To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 185318 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Nov 2010 03:25:51 -0000 http://p4web.freebsd.org/@@185318?ac=10 Change 185318 by dforsyth@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 #include #include +#include #include #include @@ -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); }