mu.lock: after acquiring m.ch, why does the re-check only look at closed and not ctx?
- Lingua principale
- Go
- Stelle
- 5.5k
- Fork
- 372
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
Hi, I was looking at [mu.lock](https://github.com/coder/websocket/blob/master/conn.go#L286) and had a question about this part:
```go
func (m *mu) lock(ctx context.Context) error {
select {
case <-m.c.closed:
return net.ErrClosed
case <-ctx.Done():
return fmt.Errorf("failed to acquire lock: %w", ctx.Err())
case m.ch <- struct{}{}:
// To make sure the connection is certainly alive.
// As it's possible the send on m.ch was selected
// over the receive on closed.
select {
case <-m.c.closed:
// Make sure to release.
m.unlock()
return net.ErrClosed
default:
}
return nil
}
}
```
After acquiring the lock, `closed` is checked again in case both branches were ready.
Why isn't `ctx.Done()` checked here as well?
Could `ctx` be canceled right after `m.ch` is selected, causing `lock` to return `nil` while holding the lock with an already-canceled context?
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
Inizia in conn.go, intorno a mu.lock alla riga 286, e traccia come il relativo contesto e i channel chiusi vengono usati dai chiamanti. Confronta il comportamento della cancellazione e dell’acquisizione del lock, quindi determina se il caso segnalato richiede una modifica al codice o alla documentazione; il lavoro è completato quando la domanda dell’issue ha ricevuto una risposta con una motivazione riproducibile.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- go
- Ambito
- networking
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Attiva
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 42/100