summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1995-01-27 13:51:18 +0000
committerdfr <dfr@FreeBSD.org>1995-01-27 13:51:18 +0000
commitb5c6599aa47b119e1aaac3b629eb0e9d109696be (patch)
tree5986ac07eacadb29138ca6a2d36d88439ac6212a
parent10b39986dbddbee6ce01e3a1116d709675a9ad9a (diff)
downloadFreeBSD-src-b5c6599aa47b119e1aaac3b629eb0e9d109696be.zip
FreeBSD-src-b5c6599aa47b119e1aaac3b629eb0e9d109696be.tar.gz
Reclaim memory used for telldir cookies on closedir.
-rw-r--r--lib/libc/gen/closedir.c1
-rw-r--r--lib/libc/gen/telldir.c29
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/libc/gen/closedir.c b/lib/libc/gen/closedir.c
index d3fc00b..7e595e5 100644
--- a/lib/libc/gen/closedir.c
+++ b/lib/libc/gen/closedir.c
@@ -55,5 +55,6 @@ closedir(dirp)
dirp->dd_loc = 0;
(void)free((void *)dirp->dd_buf);
(void)free((void *)dirp);
+ _reclaim_telldir(dirp);
return(close(fd));
}
diff --git a/lib/libc/gen/telldir.c b/lib/libc/gen/telldir.c
index 979fee4..71c6a46 100644
--- a/lib/libc/gen/telldir.c
+++ b/lib/libc/gen/telldir.c
@@ -58,6 +58,7 @@ struct ddloc {
long loc_index; /* key associated with structure */
long loc_seek; /* magic cookie returned by getdirentries */
long loc_loc; /* offset of entry in buffer */
+ DIR* loc_dirp; /* directory which used this entry */
};
#define NDIRHASH 32 /* Num of hash lists, must be a power of 2 */
@@ -82,6 +83,7 @@ telldir(dirp)
lp->loc_index = index;
lp->loc_seek = dirp->dd_seek;
lp->loc_loc = dirp->dd_loc;
+ lp->loc_dirp = dirp;
lp->loc_next = dd_hash[LOCHASH(index)];
dd_hash[LOCHASH(index)] = lp;
return (index);
@@ -126,3 +128,30 @@ found:
free((caddr_t)lp);
#endif
}
+
+/*
+ * Reclaim memory for telldir cookies which weren't used.
+ */
+void
+_reclaim_telldir(dirp)
+ register DIR *dirp;
+{
+ register struct ddloc *lp;
+ register struct ddloc **prevlp;
+ int i;
+
+ for (i = 0; i < NDIRHASH; i++) {
+ prevlp = &dd_hash[i];
+ lp = *prevlp;
+ while (lp != NULL) {
+ if (lp->loc_dirp == dirp) {
+ *prevlp = lp->loc_next;
+ free((caddr_t)lp);
+ lp = *prevlp;
+ continue;
+ }
+ prevlp = &lp->loc_next;
+ lp = lp->loc_next;
+ }
+ }
+}
OpenPOWER on IntegriCloud