Skip to content

Commit 3ee1adb

Browse files
committed
libstd: teach workcache to check freshness.
1 parent bfb09ee commit 3ee1adb

File tree

1 file changed

+59
-18
lines changed

1 file changed

+59
-18
lines changed

src/libstd/workcache.rs

+59-18
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,18 @@ struct Database {
118118

119119
impl Database {
120120
pure fn prepare(_fn_name: &str,
121-
_declared_inputs: &const WorkMap) ->
122-
Option<(WorkMap, WorkMap, WorkMap, ~str)> {
121+
_declared_inputs: &const WorkMap,
122+
_declared_outputs: &const WorkMap) ->
123+
Option<(WorkMap, WorkMap, ~str)> {
123124
// XXX: load
124125
None
125126
}
126127
pure fn cache(_fn_name: &str,
127-
_declared_inputs: &WorkMap,
128-
_declared_outputs: &WorkMap,
129-
_discovered_inputs: &WorkMap,
130-
_discovered_outputs: &WorkMap,
131-
_result: &str) {
128+
_declared_inputs: &WorkMap,
129+
_declared_outputs: &WorkMap,
130+
_discovered_inputs: &WorkMap,
131+
_discovered_outputs: &WorkMap,
132+
_result: &str) {
132133
// XXX: store
133134
}
134135
}
@@ -138,11 +139,19 @@ struct Logger {
138139
a: ()
139140
}
140141

142+
impl Logger {
143+
pure fn info(i: &str) {
144+
unsafe {
145+
io::println(~"workcache: " + i.to_owned());
146+
}
147+
}
148+
}
149+
141150
struct Context {
142151
db: @Database,
143152
logger: @Logger,
144153
cfg: @json::Object,
145-
freshness: LinearMap<~str,~fn(&str,&str)->bool>
154+
freshness: LinearMap<~str,@pure fn(&str,&str)->bool>
146155
}
147156
148157
struct Prep {
@@ -213,25 +222,57 @@ impl Prep {
213222
val.to_owned());
214223
}
215224
225+
pure fn is_fresh(cat: &str, kind: &str,
226+
name: &str, val: &str) -> bool {
227+
let k = kind.to_owned();
228+
let f = (self.ctxt.freshness.get(&k))(name, val);
229+
if f {
230+
self.ctxt.logger.info(fmt!("%s %s:%s is fresh",
231+
cat, kind, name));
232+
} else {
233+
self.ctxt.logger.info(fmt!("%s %s:%s is not fresh",
234+
cat, kind, name))
235+
}
236+
return f;
237+
}
238+
239+
pure fn all_fresh(cat: &str, map: WorkMap) -> bool {
240+
for map.each |k,v| {
241+
if ! self.is_fresh(cat, k.kind, k.name, *v) {
242+
return false;
243+
}
244+
}
245+
return true;
246+
}
247+
216248
fn exec<T:Send
217249
Serializable<json::Serializer>
218250
Deserializable<json::Deserializer>>(
219251
@mut self, blk: ~fn(&Exec) -> T) -> Work<T> {
252+
220253
let cached = self.ctxt.db.prepare(self.fn_name,
221-
&self.declared_inputs);
254+
&self.declared_inputs,
255+
&self.declared_outputs);
222256

223257
match move cached {
224258
None => (),
225-
Some((move _decl_out,
226-
move _disc_in,
227-
move _disc_out,
259+
Some((move disc_in,
260+
move disc_out,
228261
move res)) => {
229-
// XXX: check deps for freshness, only return if fresh.
230-
let v : T = do io::with_str_reader(res) |rdr| {
231-
let j = result::unwrap(json::from_reader(rdr));
232-
deserialize(&json::Deserializer(move j))
233-
};
234-
return Work::new(self, move Left(move v));
262+
263+
if self.all_fresh("declared input",
264+
self.declared_inputs) &&
265+
self.all_fresh("declared output",
266+
self.declared_outputs) &&
267+
self.all_fresh("discovered input", disc_in) &&
268+
self.all_fresh("discovered output", disc_out) {
269+
270+
let v : T = do io::with_str_reader(res) |rdr| {
271+
let j = result::unwrap(json::from_reader(rdr));
272+
deserialize(&json::Deserializer(move j))
273+
};
274+
return Work::new(self, move Left(move v));
275+
}
235276
}
236277
}
237278

0 commit comments

Comments
 (0)