mu.lock: after acquiring m.ch, why does the re-check only look at closed and not ctx?
- Langage dominant
- Go
- Étoiles
- 5.5k
- Forks
- 372
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
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?
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Piste de recherche
Commencez dans conn.go, autour de mu.lock à la ligne 286, et suivez comment son contexte et les channels fermés sont utilisés par les appelants. Comparez le comportement de l’annulation et de l’acquisition du lock, puis déterminez si le cas signalé nécessite une modification du code ou de la documentation ; le travail est terminé lorsque la question de l’issue a reçu une réponse avec une justification reproductible.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- go
- Domaine
- networking
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Active
- Clarté
- À clarifier
- Accessibilité débutants
- 42/100