diff options
author | dfr <dfr@FreeBSD.org> | 1995-01-27 13:51:18 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1995-01-27 13:51:18 +0000 |
commit | b5c6599aa47b119e1aaac3b629eb0e9d109696be (patch) | |
tree | 5986ac07eacadb29138ca6a2d36d88439ac6212a | |
parent | 10b39986dbddbee6ce01e3a1116d709675a9ad9a (diff) | |
download | FreeBSD-src-b5c6599aa47b119e1aaac3b629eb0e9d109696be.zip FreeBSD-src-b5c6599aa47b119e1aaac3b629eb0e9d109696be.tar.gz |
Reclaim memory used for telldir cookies on closedir.
-rw-r--r-- | lib/libc/gen/closedir.c | 1 | ||||
-rw-r--r-- | lib/libc/gen/telldir.c | 29 |
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; + } + } +} |