annotate variant_effect_predictor/Bio/EnsEMBL/Utils/Cache.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
parents 1f6dce3d34e0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # This package, originally distributed by CPAN, has been modified from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 # its original version in order to be used by the ensembl project.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 # 8 July 2002 - changed package name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 #package Tie::Cache; # old package
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 package Bio::EnsEMBL::Utils::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 use vars qw(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12 $VERSION $Debug $STRUCT_SIZE $REF_SIZE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 $BEFORE $AFTER $KEY $VALUE $BYTES $DIRTY
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 $VERSION = .17;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 $Debug = 0; # set to 1 for summary, 2 for debug output
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18 $STRUCT_SIZE = 240; # per cached elem bytes overhead, approximate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 $REF_SIZE = 16;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 # NODE ARRAY STRUCT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 $KEY = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 $VALUE = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 $BYTES = 2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 $BEFORE = 3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 $AFTER = 4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 $DIRTY = 5;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 =pod
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 Tie::Cache - LRU Cache in Memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 use Tie::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 tie %cache, 'Tie::Cache', 100, { Debug => 1 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 tie %cache2, 'Tie::Cache', { MaxCount => 100, MaxBytes => 50000 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 tie %cache3, 'Tie::Cache', 100, { Debug => 1 , WriteSync => 0};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 # Options ##################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 # Debug => 0 - DEFAULT, no debugging output
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 # 1 - prints cache statistics upon destroying
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 # 2 - prints detailed debugging info
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 # MaxCount => Maximum entries in cache.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 # MaxBytes => Maximum bytes taken in memory for cache based on approximate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 # size of total cache structure in memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 # There is approximately 240 bytes used per key/value pair in the cache for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 # the cache data structures, so a cache of 5000 entries would take
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 # at approximately 1.2M plus the size of the data being cached.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 # MaxSize => Maximum size of each cache entry. Larger entries are not cached.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 # This helps prevent much of the cache being flushed when
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 # you set an exceptionally large entry. Defaults to MaxBytes/10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 # WriteSync => 1 - DEFAULT, write() when data is dirtied for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 # TRUE CACHE (see below)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 # 0 - write() dirty data as late as possible, when leaving
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 # cache, or when cache is being DESTROY'd
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 ############################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 # cache supports normal tied hash functions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 $cache{1} = 2; # STORE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 print "$cache{1}\n"; # FETCH
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 # FIRSTKEY, NEXTKEY
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 while(($k, $v) = each %cache) { print "$k: $v\n"; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 delete $cache{1}; # DELETE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 %cache = (); # CLEAR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 This module implements a least recently used (LRU) cache in memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 through a tie interface. Any time data is stored in the tied hash,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 that key/value pair has an entry time associated with it, and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 as the cache fills up, those members of the cache that are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 the oldest are removed to make room for new entries.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 So, the cache only "remembers" the last written entries, up to the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 size of the cache. This can be especially useful if you access
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 great amounts of data, but only access a minority of the data a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 majority of the time.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 The implementation is a hash, for quick lookups,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 overlaying a doubly linked list for quick insertion and deletion.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 On a WinNT PII 300, writes to the hash were done at a rate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 3100 per second, and reads from the hash at 6300 per second.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Work has been done to optimize refreshing cache entries that are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 frequently read from, code like $cache{entry}, which moves the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 entry to the end of the linked list internally.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 =cut Documentation continues at the end of the module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 sub TIEHASH {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 my($class, $max_count, $options) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 if(ref($max_count)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 $options = $max_count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 $max_count = $options->{MaxCount};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 unless($max_count || $options->{MaxBytes}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 die('you must specify cache size with either MaxBytes or MaxCount');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 my $sync = exists($options->{WriteSync}) ? $options->{WriteSync} : 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 my $self = bless
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 # how many items to cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 max_count=> $max_count,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 # max bytes to cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 max_bytes => $options->{MaxBytes},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 # max size (in bytes) of an individual cache entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 max_size => $options->{MaxSize} || ($options->{MaxBytes} ? (int($options->{MaxBytes}/10) + 1) : 0),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 # class track, so know if overridden subs should be used
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 'class' => $class,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 'subclass' => $class ne 'Tie::Cache' ? 1 : 0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 # current sizes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 count=>0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 bytes=>0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 # inner structures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 head=>0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 tail=>0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 nodes=>{},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 'keys'=>[],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 # statistics
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 hit => 0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 miss => 0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 # config
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 sync => $sync,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 dbg => $options->{Debug} || $Debug
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 }, $class;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 if (($self->{max_bytes} && ! $self->{max_size})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 die("MaxSize must be defined when MaxBytes is");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 if($self->{max_bytes} and $self->{max_bytes} < 1000) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 die("cannot set MaxBytes to under 1000, each raw entry takes $STRUCT_SIZE bytes alone");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 if($self->{max_size} && $self->{max_size} < 3) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 die("cannot set MaxSize to under 3 bytes, assuming error in config");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 # override to write data leaving cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 sub write { undef; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 # commented this section out for speed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 # my($self, $key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 # 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 #}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 # override to get data if not in cache, should return $value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 # associated with $key
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 sub read { undef; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 # commented this section out for speed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 # my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 # undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 #}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 sub FETCH {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 my $node = $self->{nodes}{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 if($node) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 # refresh node's entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 $self->{hit}++; # if $self->{dbg};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 # we used to call delete then insert, but we streamlined code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 if(my $after = $node->[$AFTER]) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 $self->{dbg} > 1 and $self->print("update() node $node to tail of list");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 # reconnect the nodes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 my $before = $after->[$BEFORE] = $node->[$BEFORE];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 if($before) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 $before->[$AFTER] = $after;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 $self->{head} = $after;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 # place at the end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 $self->{tail}[$AFTER] = $node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 $node->[$BEFORE] = $self->{tail};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 $node->[$AFTER] = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 $self->{tail} = $node; # always true after this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 # if there is nothing after node, then we are at the end already
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 # so don't do anything to move the nodes around
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 die("this node is the tail, so something's wrong")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 unless($self->{tail} eq $node);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 $self->print("FETCH [$key, $node->[$VALUE]]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 $node->[$VALUE];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 # we have a cache miss here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 $self->{miss}++; # if $self->{dbg};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 # its fine to always insert a node, even when we have an undef,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 # because even if we aren't a sub-class, we should assume use
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 # that would then set the entry. This model works well with
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 # sub-classing and reads() that might want to return undef as
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 # a valid value.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 my $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 if ($self->{subclass}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 $self->print("read() for key $key") if $self->{dbg} > 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 $value = $self->read($key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 if(defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 my $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 if($self->{max_size}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 # check max size of entry, that it not exceed max size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 $length = &_get_data_length(\$key, \$value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 if($length > $self->{max_size}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 $self->print("direct read() [$key, $value]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 return $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 # if we get here, we should insert the new node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 $node = &create_node($self, \$key, \$value, $length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 &insert($self, $node);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 sub STORE {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 my($self, $key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 my $node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 $self->print("STORE [$key,$value]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 # do not cache undefined values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 defined($value) || return(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 # check max size of entry, that it not exceed max size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 my $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 if($self->{max_size}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 $length = &_get_data_length(\$key, \$value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 if($length > $self->{max_size}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 if ($self->{subclass}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 $self->print("direct write() [$key, $value]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 $self->write($key, $value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 return $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 # do we have node already ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 if($self->{nodes}{$key}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 $node = &delete($self, $key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 # $node = &delete($self, $key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 # $node->[$VALUE] = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 # $node->[$BYTES] = $length || &_get_data_length(\$key, \$value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 # insert new node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 $node = &create_node($self, \$key, \$value, $length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 # $node ||= &create_node($self, \$key, \$value, $length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 &insert($self, $node);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 # if the data is sync'd call write now, otherwise defer the data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 # writing, but mark it dirty so it can be cleanup up at the end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 if ($self->{subclass}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 if($self->{sync}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 $self->print("sync write() [$key, $value]") if $self->{dbg} > 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 $self->write($key, $value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 $node->[$DIRTY] = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 sub DELETE {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 $self->print("DELETE $key") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 my $node = $self->delete($key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $node ? $node->[$VALUE] : undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 sub CLEAR {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 $self->print("CLEAR CACHE") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 if($self->{subclass}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 my $flushed = $self->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 $self->print("FLUSH COUNT $flushed") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 my $node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 while($node = $self->{head}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 $self->delete($self->{head}[$KEY]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 sub EXISTS {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 exists $self->{nodes}{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 # firstkey / nextkey emulate keys() and each() behavior by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 # taking a snapshot of all the nodes at firstkey, and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 # iterating through the keys with nextkey
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 # this method therefore will only supports one each() / keys()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 # happening during any given time.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 sub FIRSTKEY {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 $self->{'keys'} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 my $node = $self->{head};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 while($node) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 push(@{$self->{'keys'}}, $node->[$KEY]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $node = $node->[$AFTER];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 shift @{$self->{'keys'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 sub NEXTKEY {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 my($self, $lastkey) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 shift @{$self->{'keys'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 sub DESTROY {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 # if debugging, snapshot cache before clearing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 if($self->{dbg}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 if($self->{hit} || $self->{miss}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $self->{hit_ratio} =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 sprintf("%4.3f", $self->{hit} / ($self->{hit} + $self->{miss}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 $self->print($self->pretty_self());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 if($self->{dbg} > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 $self->print($self->pretty_chains());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 $self->print("DESTROYING") if $self->{dbg} > 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 $self->CLEAR();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 ####PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 ## Helper Routines
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 ####PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 # we use scalar_refs for the data for speed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 sub create_node {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 my($self, $key, $value, $length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 (defined($$key) && defined($$value))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 || die("need more localized data than $$key and $$value");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 # max_size always defined when max_bytes is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 if (($self->{max_size})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 $length = defined $length ? $length : &_get_data_length($key, $value)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 $length = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 # ORDER SPECIFIC, see top for NODE ARRAY STRUCT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 my $node = [ $$key, $$value, $length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 sub _get_data_length {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 my($key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 my $length = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 my %refs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 my @data = ($$key, $$value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 while(my $elem = shift @data) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 next if $refs{$elem};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 $refs{$elem} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 if(ref $elem && $elem =~ /(SCALAR|HASH|ARRAY)/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 my $type = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 $length += $REF_SIZE; # guess, 16 bytes per ref, probably more
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 if (($type eq 'SCALAR')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 $length += length($$elem);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 } elsif (($type eq 'HASH')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 while (my($k,$v) = each %$elem) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 for my $kv($k,$v) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 if ((ref $kv)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 push(@data, $kv);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 $length += length($kv);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 } elsif (($type eq 'ARRAY')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 for my $val (@$elem){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 if ((ref $val)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 push(@data, $val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 $length += length($val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 $length += length($elem);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 sub insert {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 my($self, $new_node) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 $new_node->[$AFTER] = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 $new_node->[$BEFORE] = $self->{tail};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 $self->print("insert() [$new_node->[$KEY], $new_node->[$VALUE]]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 $self->{nodes}{$new_node->[$KEY]} = $new_node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 # current sizes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 $self->{count}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 $self->{bytes} += $new_node->[$BYTES] + $STRUCT_SIZE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 if($self->{tail}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 $self->{tail}[$AFTER] = $new_node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 $self->{head} = $new_node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 $self->{tail} = $new_node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 ## if we are too big now, remove head
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 while(($self->{max_count} && ($self->{count} > $self->{max_count})) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 ($self->{max_bytes} && ($self->{bytes} > $self->{max_bytes})))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 if($self->{dbg} > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 $self->print("current/max: ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 "bytes ($self->{bytes}/$self->{max_bytes}) ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 "count ($self->{count}/$self->{max_count}) "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 my $old_node = $self->delete($self->{head}[$KEY]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 if ($self->{subclass}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 if($old_node->[$DIRTY]) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 $self->print("dirty write() [$old_node->[$KEY], $old_node->[$VALUE]]")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 $self->write($old_node->[$KEY], $old_node->[$VALUE]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 # if($self->{dbg} > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 # $self->print("after delete - bytes $self->{bytes}; count $self->{count}");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 sub delete {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 my $node = $self->{nodes}{$key} || return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 # return unless $node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 $self->print("delete() [$key, $node->[$VALUE]]") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 my $before = $node->[$BEFORE];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 my $after = $node->[$AFTER];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 # my($before, $after) = $node->{before,after};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 if($before) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 ($before->[$AFTER] = $after);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 $self->{head} = $after;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 if($after) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 ($after->[$BEFORE] = $before);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 $self->{tail} = $before;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 delete $self->{nodes}{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 $self->{bytes} -= ($node->[$BYTES] + $STRUCT_SIZE);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 $self->{count}--;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 $node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 sub flush {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $self->print("FLUSH CACHE") if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 my $node = $self->{head};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 my $flush_count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 while($node) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 if($node->[$DIRTY]) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 $self->print("flush dirty write() [$node->[$KEY], $node->[$VALUE]]")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 if ($self->{dbg} > 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 $self->write($node->[$KEY], $node->[$VALUE]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 $node->[$DIRTY] = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 $flush_count++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 $node = $node->[$AFTER];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 $flush_count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 sub print {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 my($self, $msg) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 print "$self: $msg\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 sub pretty_self {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 my(@prints);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 for(sort keys %{$self}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 next unless defined $self->{$_};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 push(@prints, "$_=>$self->{$_}");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 "{ " . join(", ", @prints) . " }";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 sub pretty_chains {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 my($str);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 my $k = $self->FIRSTKEY();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 $str .= "[head]->";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 my($curr_node) = $self->{head};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 while($curr_node) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 $str .= "[$curr_node->[$KEY],$curr_node->[$VALUE]]->";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 $curr_node = $curr_node->[$AFTER];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 $str .= "[tail]->";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 $curr_node = $self->{tail};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 while($curr_node) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 $str .= "[$curr_node->[$KEY],$curr_node->[$VALUE]]->";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 $curr_node = $curr_node->[$BEFORE];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 $str .= "[head]";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 $str;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 __END__
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 =head1 INSTALLATION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 Tie::Cache installs easily using the make or nmake commands as
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 shown below. Otherwise, just copy Cache.pm to $PERLLIB/site/Tie
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 > perl Makefile.PL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 > make
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 > make test
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 > make install
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 * use nmake for win32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 ** you can also just copy Cache.pm to $perllib/Tie
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 =head1 BENCMARKS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 There is another simpler LRU cache implementation in CPAN,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 Tie::Cache::LRU, which has the same basic size limiting
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 functionality, and for this functionality, the exact same
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 interface.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 Through healthy competition, Michael G Schwern got
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 Tie::Cache::LRU mostly faster than Tie::Cache on reads & writes:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 Cache Size 5000 Tie::Cache 0.17 Tie::Cache::LRU 0.21
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 10000 Writes 1.55 CPU sec 1.10 CPU sec
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 40000 Reads 1.82 CPU sec 1.58 CPU sec
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 10000 Deletes 0.55 CPU sec 0.59 CPU sec
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 Unless you are using TRUE CACHE or MaxBytes functionality,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 using Tie::Cache::LRU should be an easy replacement for Tie::Cache.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 =head1 TRUE CACHE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 To use class as a true cache, which acts as the sole interface
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 for some data set, subclass the real cache off Tie::Cache,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 with @ISA = qw( 'Tie::Cache' ) notation. Then override
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 the read() method for behavior when there is a cache miss,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 and the write() method for behavior when the cache's data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 changes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 When WriteSync is 1 or TRUE (DEFAULT), write() is called immediately
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 when data in the cache is modified. If set to 0, data that has
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 been modified in the cache gets written out when the entries are deleted or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 during the DESTROY phase of the cache object, usually at the end of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 a script.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 To have the dirty data write() periodically while WriteSync is set to 0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 there is a flush() cache API call that will flush the dirty writes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 in this way. Just call the flush() API like:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 my $write_flush_count = tied(%cache)->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 The flush() API was added in the .17 release thanks to Rob Bloodgood.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 =head1 TRUE CACHE EXAMPLE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 use Tie::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 # personalize the Tie::Cache object, by inheriting from it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 package My::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 @ISA = qw(Tie::Cache);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 # override the read() and write() member functions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 # these tell the cache what to do with a cache miss or flush
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 sub read {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 my($self, $key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 print "cache miss for $key, read() data\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 rand() * $key;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 sub write {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 my($self, $key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 print "flushing [$key, $value] from cache, write() data\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 my $cache_size = $ARGV[0] || 2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 my $num_to_cache = $ARGV[1] || 4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 my $Debug = $ARGV[2] || 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 tie %cache, 'My::Cache', $cache_size, {Debug => $Debug};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 # load the cache with new data, each through its contents,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 # and then reload in reverse order.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 for(1..$num_to_cache) { print "read data $_: $cache{$_}\n" }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 while(my($k, $v) = each %cache) { print "each data $k: $v\n"; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 for(my $i=$num_to_cache; $i>0; $i--) { print "read data $i: $cache{$i}\n"; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 # flush writes now, trivial use since will happen in DESTROY() anyway
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 tied(%cache)->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 # clear cache in 2 ways, write will flush out to disk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 %cache = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 undef %cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 =head1 NOTES
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 Many thanks to all those who helped me make this module a reality,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 including:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 :) Tom Hukins who provided me insight and motivation for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 finishing this module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 :) Jamie McCarthy, for trying to make Tie::Cache be all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 that it can be.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 :) Rob Fugina who knows how to "TRULY CACHE".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 :) Rob Bloodgood, for the TRUE CACHE flush() API
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 =head1 AUTHOR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 Please send any questions or comments to Joshua Chamas
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 at chamas@alumni.stanford.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 =head1 COPYRIGHT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 Copyright (c) 1999-2002 Joshua Chamas, Chamas Enterprises Inc.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 Sponsored by development on NodeWorks http://www.nodeworks.com
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 All rights reserved. This program is free software;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 you can redistribute it and/or modify it under the same
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 terms as Perl itself.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703