| 1 | use std::cell::Cell; |
| 2 | use std::time::{Instant, SystemTime}; |
| 3 | |
| 4 | thread_local! { |
| 5 | static COUNTER: Cell<u32> = const { Cell::new(0) }; |
| 6 | } |
| 7 | |
| 8 | fn 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 | } |