rust/pin-init/examples/static_init.rs

Source file repositories/reference/linux-study-clean/rust/pin-init/examples/static_init.rs

File Facts

System
Linux kernel
Corpus path
rust/pin-init/examples/static_init.rs
Extension
.rs
Size
3896 bytes
Lines
124
Domain
Rust Kernel Layer
Bucket
Rust API Membrane
Inferred role
Rust Kernel Layer: implementation source
Status
source implementation candidate

Why This File Exists

Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.

Dependency Surface

Detected Declarations

Annotated Snippet

fn main() {
    #[cfg(feature = "std")]
    {
        let mtx: Pin<Arc<CMutex<usize>>> = Arc::pin_init(CMutex::new(0)).unwrap();
        let mut handles = vec![];
        let thread_count = 20;
        let workload = 1_000;
        for i in 0..thread_count {
            let mtx = mtx.clone();
            handles.push(
                Builder::new()
                    .name(format!("worker #{i}"))
                    .spawn(move || {
                        for _ in 0..workload {
                            *COUNT.lock() += 1;
                            std::thread::sleep(std::time::Duration::from_millis(10));
                            *mtx.lock() += 1;
                            std::thread::sleep(std::time::Duration::from_millis(10));
                            *COUNT.lock() += 1;
                        }
                        println!("{i} halfway");
                        sleep(Duration::from_millis((i as u64) * 10));
                        for _ in 0..workload {
                            std::thread::sleep(std::time::Duration::from_millis(10));
                            *mtx.lock() += 1;
                        }
                        println!("{i} finished");
                    })
                    .expect("should not fail"),
            );
        }
        for h in handles {
            h.join().expect("thread panicked");
        }
        println!("{:?}, {:?}", *mtx.lock(), *COUNT.lock());
        assert_eq!(*mtx.lock(), workload * thread_count * 2);
    }
}

Annotation

Implementation Notes