diff options
Diffstat (limited to 'gnu/usr.bin/perl/lib/cacheout.pl')
-rw-r--r-- | gnu/usr.bin/perl/lib/cacheout.pl | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gnu/usr.bin/perl/lib/cacheout.pl b/gnu/usr.bin/perl/lib/cacheout.pl new file mode 100644 index 0000000..513c25b --- /dev/null +++ b/gnu/usr.bin/perl/lib/cacheout.pl @@ -0,0 +1,40 @@ +# Open in their package. + +sub cacheout'open { + open($_[0], $_[1]); +} + +# But only this sub name is visible to them. + +sub cacheout { + package cacheout; + + ($file) = @_; + if (!$isopen{$file}) { + if (++$numopen > $maxopen) { + local(@lru) = sort {$isopen{$a} <=> $isopen{$b};} keys(%isopen); + splice(@lru, $maxopen / 3); + $numopen -= @lru; + for (@lru) { close $_; delete $isopen{$_}; } + } + &open($file, ($saw{$file}++ ? '>>' : '>') . $file) + || die "Can't create $file: $!\n"; + } + $isopen{$file} = ++$seq; +} + +package cacheout; + +$seq = 0; +$numopen = 0; + +if (open(PARAM,'/usr/include/sys/param.h')) { + local($.); + while (<PARAM>) { + $maxopen = $1 - 4 if /^\s*#\s*define\s+NOFILE\s+(\d+)/; + } + close PARAM; +} +$maxopen = 16 unless $maxopen; + +1; |