1use std::cell::Cell;
2use std::time::{Instant, SystemTime};
3
4thread_local! {
5 static COUNTER: Cell<u32> = const { Cell::new(0) };
6}
7
8fn main() {
9 let dir = std::env::temp_dir().join(format!("snow-leopard-{}", std::process::id()));
10 std::fs::create_dir_all(&dir).unwrap();
11 let file = dir.join("hello.txt");
12 std::fs::write(&file, "hello from rust").unwrap();
13 let text = std::fs::read_to_string(&file).unwrap();
14 let meta = std::fs::metadata(&file).unwrap();
15 let entries = std::fs::read_dir(&dir).unwrap().count();
16 // 10.6 packs directory entries 4 bytes apart; debug builds check them for alignment.
17 let frameworks = std::fs::read_dir("/System/Library/Frameworks").map_or(0, Iterator::count);
18 std::fs::remove_dir_all(&dir).unwrap();
19
20 let start = Instant::now();
21 let threads: Vec<_> = (0..4)
22 .map(|i| {
23 std::thread::spawn(move || {
24 for _ in 0..=i {
25 COUNTER.with(|c| c.set(c.get() + 1));
26 }
27 COUNTER.with(Cell::get)
28 })
29 })
30 .collect();
31 let counts: Vec<u32> = threads.into_iter().map(|t| t.join().unwrap()).collect();
32 COUNTER.with(|c| c.set(c.get() + 100));
33
34 let mut map = std::collections::HashMap::new();
35 map.insert("random-state", 1);
36
37 let since_epoch = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
38 println!("fs: {text:?} ({} bytes, {entries} entries), {frameworks} frameworks", meta.len());
39 println!("tls: threads {counts:?}, main {}", COUNTER.with(Cell::get));
40 println!("time: {}s since epoch, {:?} elapsed", since_epoch.as_secs(), start.elapsed());
41 println!("args: {:?}, HOME={:?}", std::env::args().collect::<Vec<_>>(), std::env::var("HOME").ok());
42 std::panic::catch_unwind(|| panic!("caught")).unwrap_err();
43 println!("unwind: ok");
44}