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 <[email protected]>
---
 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

_______________________________________________
pacman-dev mailing list
[email protected]
http://www.archlinux.org/mailman/listinfo/pacman-dev

Reply via email to