Browse Source

tdb2: keep link of every non-internal tdb.

Instead of a per-file linked list, use a per-tdb list.  This is needed
for tdb_foreach().
Rusty Russell 14 years ago
parent
commit
2414f26191
2 changed files with 22 additions and 25 deletions
  1. 19 22
      ccan/tdb2/open.c
  2. 3 3
      ccan/tdb2/private.h

+ 19 - 22
ccan/tdb2/open.c

@@ -19,20 +19,20 @@
 #include <ccan/hash/hash.h>
 #include <ccan/hash/hash.h>
 #include <assert.h>
 #include <assert.h>
 
 
-/* all lock info, to detect double-opens (fcntl file don't nest!) */
-static struct tdb_file *files = NULL;
+/* all tdbs, to detect double-opens (fcntl file don't nest!) */
+static struct tdb_context *tdbs = NULL;
 
 
 static struct tdb_file *find_file(dev_t device, ino_t ino)
 static struct tdb_file *find_file(dev_t device, ino_t ino)
 {
 {
-	struct tdb_file *i;
+	struct tdb_context *i;
 
 
-	for (i = files; i; i = i->next) {
-		if (i->device == device && i->inode == ino) {
-			i->refcnt++;
-			break;
+	for (i = tdbs; i; i = i->next) {
+		if (i->file->device == device && i->file->inode == ino) {
+			i->file->refcnt++;
+			return i->file;
 		}
 		}
 	}
 	}
-	return i;
+	return NULL;
 }
 }
 
 
 static bool read_all(int fd, void *buf, size_t len)
 static bool read_all(int fd, void *buf, size_t len)
@@ -483,7 +483,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
 			goto fail;
 			goto fail;
 		}
 		}
 
 
-		tdb->file->next = files;
 		tdb->file->fd = fd;
 		tdb->file->fd = fd;
 		tdb->file->device = st.st_dev;
 		tdb->file->device = st.st_dev;
 		tdb->file->inode = st.st_ino;
 		tdb->file->inode = st.st_ino;
@@ -596,9 +595,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
 		goto fail;
 		goto fail;
 	}
 	}
 
 
-	/* Add to linked list if we're new. */
-	if (tdb->file->refcnt == 1)
-		files = tdb->file;
+	tdb->next = tdbs;
+	tdbs = tdb;
 	return tdb;
 	return tdb;
 
 
  fail:
  fail:
@@ -653,6 +651,7 @@ fail_errno:
 int tdb_close(struct tdb_context *tdb)
 int tdb_close(struct tdb_context *tdb)
 {
 {
 	int ret = 0;
 	int ret = 0;
+	struct tdb_context **i;
 
 
 	tdb_trace(tdb, "tdb_close");
 	tdb_trace(tdb, "tdb_close");
 
 
@@ -667,24 +666,22 @@ int tdb_close(struct tdb_context *tdb)
 			tdb_munmap(tdb->file);
 			tdb_munmap(tdb->file);
 	}
 	}
 	if (tdb->file) {
 	if (tdb->file) {
-		struct tdb_file **i;
-
 		tdb_lock_cleanup(tdb);
 		tdb_lock_cleanup(tdb);
 		if (--tdb->file->refcnt == 0) {
 		if (--tdb->file->refcnt == 0) {
 			ret = close(tdb->file->fd);
 			ret = close(tdb->file->fd);
-
-			/* Remove from files list */
-			for (i = &files; *i; i = &(*i)->next) {
-				if (*i == tdb->file) {
-					*i = tdb->file->next;
-					break;
-				}
-			}
 			free(tdb->file->lockrecs);
 			free(tdb->file->lockrecs);
 			free(tdb->file);
 			free(tdb->file);
 		}
 		}
 	}
 	}
 
 
+	/* Remove from tdbs list */
+	for (i = &tdbs; *i; i = &(*i)->next) {
+		if (*i == tdb) {
+			*i = tdb->next;
+			break;
+		}
+	}
+
 #ifdef TDB_TRACE
 #ifdef TDB_TRACE
 	close(tdb->tracefd);
 	close(tdb->tracefd);
 #endif
 #endif

+ 3 - 3
ccan/tdb2/private.h

@@ -298,9 +298,6 @@ struct tdb_access_hdr {
 };
 };
 
 
 struct tdb_file {
 struct tdb_file {
-	/* Single list of all TDBs, to detect multiple opens. */
-	struct tdb_file *next;
-
 	/* How many are sharing us? */
 	/* How many are sharing us? */
 	unsigned int refcnt;
 	unsigned int refcnt;
 
 
@@ -325,6 +322,9 @@ struct tdb_file {
 };
 };
 
 
 struct tdb_context {
 struct tdb_context {
+	/* Single list of all TDBs, to detect multiple opens. */
+	struct tdb_context *next;
+
 	/* Filename of the database. */
 	/* Filename of the database. */
 	const char *name;
 	const char *name;