#[macro_use]
extern crate slog;
use slog::*;
use std::thread;
use std::sync::atomic::Ordering::SeqCst;
use std::sync::atomic::AtomicUsize;
use std::sync::Arc;
use std::time::Duration;
const VERSION : &'static str = "0.1.0";
fn slow_fib(n : u64) -> u64 {
match n {
0|1|2 => 1,
n => slow_fib(n-1) + slow_fib(n-2),
}
}
fn main() {
let root = root_logger!("version" => VERSION);
let _log = child_logger!(root, "child" => 1);
let counter = Arc::new(AtomicUsize::new(0));
let log = child_logger!(root, "counter" => {
let counter = counter.clone();
move || { counter.load(SeqCst)}
});
info!(log, "before-fetch-add"); counter.fetch_add(1, SeqCst);
info!(log, "after-fetch-add");
log.set_drain(
drain::filter_level(
Level::Info,
drain::stream(
std::io::stderr(),
format::Json::new(),
),
),
);
trace!(log, "trace", "lazy-closure" => Box::new(move || slow_fib(40)));
let join = thread::spawn({
let log = log.clone();
move || {
info!(log, "subthread", "stage" => "start");
thread::sleep(Duration::new(1, 0));
info!(log, "subthread", "stage" => "end");
}
});
join.join().unwrap();
}