Skip to content

Commit ff8d65e

Browse files
committed
extra: give up trying to make more fields of context cloneable, just use ARCs.
1 parent fa8553e commit ff8d65e

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

src/libextra/workcache.rs

+28-16
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use digest::DigestUtil;
1515
use json;
1616
use sha1::Sha1;
1717
use serialize::{Encoder, Encodable, Decoder, Decodable};
18-
use arc::RWARC;
18+
use arc::{ARC,RWARC};
1919
use treemap::TreeMap;
2020

2121
use std::cell::Cell;
@@ -174,11 +174,12 @@ impl Logger {
174174
}
175175
}
176176
177+
#[deriving(Clone)]
177178
struct Context {
178179
db: RWARC<Database>,
179-
logger: Logger,
180-
cfg: json::Object,
181-
freshness: TreeMap<~str,@fn(&str,&str)->bool>
180+
logger: RWARC<Logger>,
181+
cfg: ARC<json::Object>,
182+
freshness: ARC<TreeMap<~str,~fn(&str,&str)->bool>>
182183
}
183184
184185
struct Prep<'self> {
@@ -228,12 +229,14 @@ fn digest_file(path: &Path) -> ~str {
228229
229230
impl Context {
230231
231-
pub fn new(db: RWARC<Database>, lg: Logger, cfg: json::Object) -> Context {
232+
pub fn new(db: RWARC<Database>,
233+
lg: RWARC<Logger>,
234+
cfg: ARC<json::Object>) -> Context {
232235
Context {
233236
db: db,
234237
logger: lg,
235238
cfg: cfg,
236-
freshness: TreeMap::new()
239+
freshness: ARC(TreeMap::new())
237240
}
238241
}
239242
@@ -267,19 +270,20 @@ impl<'self> Prep<'self> {
267270
fn is_fresh(&self, cat: &str, kind: &str,
268271
name: &str, val: &str) -> bool {
269272
let k = kind.to_owned();
270-
let f = self.ctxt.freshness.find(&k);
273+
let f = self.ctxt.freshness.get().find(&k);
271274
let fresh = match f {
272275
None => fail!("missing freshness-function for '%s'", kind),
273276
Some(f) => (*f)(name, val)
274277
};
275-
let lg = self.ctxt.logger;
276-
if fresh {
277-
lg.info(fmt!("%s %s:%s is fresh",
278-
cat, kind, name));
279-
} else {
280-
lg.info(fmt!("%s %s:%s is not fresh",
281-
cat, kind, name))
282-
}
278+
do self.ctxt.logger.write |lg| {
279+
if fresh {
280+
lg.info(fmt!("%s %s:%s is fresh",
281+
cat, kind, name));
282+
} else {
283+
lg.info(fmt!("%s %s:%s is not fresh",
284+
cat, kind, name))
285+
}
286+
};
283287
fresh
284288
}
285289

@@ -380,13 +384,21 @@ fn test() {
380384
}
381385

382386
let cx = Context::new(RWARC(Database::new(Path("db.json"))),
383-
Logger::new(), TreeMap::new());
387+
RWARC(Logger::new()),
388+
ARC(TreeMap::new()));
384389

385390
let s = do cx.with_prep("test1") |prep| {
391+
392+
let subcx = cx.clone();
393+
386394
prep.declare_input("file", pth.to_str(), digest_file(&pth));
387395
do prep.exec |_exe| {
388396
let out = Path("foo.o");
389397
run::process_status("gcc", [~"foo.c", ~"-o", out.to_str()]);
398+
399+
let _proof_of_concept = subcx.prep("subfn");
400+
// Could run sub-rules inside here.
401+
390402
out.to_str()
391403
}
392404
};

0 commit comments

Comments
 (0)