If we lazily open a handle to the database, and close it later only if we opened it, it could reduce the number of calls quite a bit in a large pacman operation. Signed-off-by: Dan McGee <dan@archlinux.org> --- lib/libalpm/be_files.c | 11 ++++++----- lib/libalpm/db.c | 3 +++ lib/libalpm/db.h | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 3da58a3..4b4df8a 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -347,13 +347,14 @@ static char *get_pkgpath(pmdb_t *db, pmpkg_t *info) static int sync_db(pmdb_t *db) { - int fd; /* by syncing the parent directory, we can be sure any database * changes (adding or removing a package) are committed to disk. */ - fd = open(db->path, 0); - if(fd != -1) { - fsync(fd); - close(fd); + if(!db->fd) { + db->fd = open(db->path, 0); + /* close() happens in _alpm_db_free() */ + } + if(db->fd != -1) { + fsync(db->fd); return 0; } else { return -1; diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 561967c..78ac4ea 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -347,6 +347,9 @@ void _alpm_db_free(pmdb_t *db) FREELIST(db->servers); FREE(db->path); FREE(db->treename); + if(db->fd > 0) { + close(db->fd); + } FREE(db); return; diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 1af1635..fb19751 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -41,6 +41,7 @@ typedef enum _pmdbinfrq_t { struct __pmdb_t { char *path; char *treename; + int fd; unsigned short pkgcache_loaded; alpm_list_t *pkgcache; unsigned short grpcache_loaded; -- 1.6.2