From b5c6599aa47b119e1aaac3b629eb0e9d109696be Mon Sep 17 00:00:00 2001 From: dfr Date: Fri, 27 Jan 1995 13:51:18 +0000 Subject: Reclaim memory used for telldir cookies on closedir. --- lib/libc/gen/closedir.c | 1 + lib/libc/gen/telldir.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'lib/libc/gen') 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; + } + } +} -- cgit v1.1