elast0ny / elast0ny/shared_memory

mutex example initialization procedure appears to be incorrectly synchronized

Aperta
#115 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
Rust
Stelle
443
Fork
63
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

https://github.com/elast0ny/shared_memory/blob/fda413410857e295fa7440691a79296e84bed525/examples/mutex.rs#L65-L89

    let mutex = if shmem.is_owner() {
        // is_init.store(0, Ordering::Relaxed); // not actually needed
        // Initialize the mutex
        let (lock, _bytes_used) = unsafe {
            Mutex::new(
                raw_ptr,                                    // Base address of Mutex
                raw_ptr.add(Mutex::size_of(Some(raw_ptr))), // Address of data protected by mutex
            )
            .unwrap()
        };
        // is_init.store(1, Ordering::Relaxed); // relaxed wouldn't restrict reordering of mutex init unless i'm missing something
        is_init.store(1, Ordering::Release);
        lock
    } else {
        // wait until mutex is initialized
        // while is_init.load(Ordering::Relaxed) != 1 {} // need acquire for release store to is_init to synchronize-with load
        // could also do a relaxed loop with a acquire fence, but that adds an extra instruction in the common case
        while is_init.load(Ordering::Acquire) != 1 {
            std::hint::spin_loop();
        }
        // Load existing mutex
        let (lock, _bytes_used) = unsafe {
            Mutex::from_existing(
                raw_ptr,                                    // Base address of Mutex
                raw_ptr.add(Mutex::size_of(Some(raw_ptr))), // Address of data  protected by mutex
            )
            .unwrap()
        };
        lock
    };

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con examples/mutex.rs, righe 65-89, e verifica come viene inizializzato il mutex condiviso e come viene caricato dai proprietari e dai non proprietari. Verifica l’ordine di sincronizzazione attorno a is_init e determina se l’esempio pubblica in modo sicuro il mutex inizializzato; il lavoro è completato quando la procedura di inizializzazione è sincronizzata correttamente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
rust
Ambito
operating-systems
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.