mirror of
https://github.com/go-i2p/go-sam-go.git
synced 2025-12-01 09:54:58 -05:00
Fix StreamSession close order to ensure listeners are shut down before base session; add delay for read deadlines to take effect
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -47,5 +47,5 @@ review.md
|
||||
SAMv3.md
|
||||
testplan.md
|
||||
err
|
||||
/*.log
|
||||
*.log
|
||||
*.test
|
||||
@@ -338,16 +338,21 @@ func (s *StreamSession) Close() error {
|
||||
// which needs the write lock, while BaseSession.Close() can block on network I/O
|
||||
s.mu.Unlock()
|
||||
|
||||
// Close the base session first to unblock any pending reads
|
||||
if err := s.BaseSession.Close(); err != nil {
|
||||
logger.WithError(err).Error("Failed to close base session")
|
||||
// Continue with listener cleanup even if base session close fails
|
||||
}
|
||||
|
||||
// CRITICAL FIX: Close listeners BEFORE closing the base session
|
||||
// This ensures SetReadDeadline() in closeWithoutUnregister() unblocks any
|
||||
// pending reads in accept loops before BaseSession.Close() marks session as closed
|
||||
for _, listener := range listeners {
|
||||
listener.closeWithoutUnregister()
|
||||
}
|
||||
|
||||
// Brief delay to allow read deadlines to take effect and unblock pending reads
|
||||
time.Sleep(150 * time.Millisecond)
|
||||
|
||||
// Close the base session after listeners are shut down
|
||||
if err := s.BaseSession.Close(); err != nil {
|
||||
logger.WithError(err).Error("Failed to close base session")
|
||||
}
|
||||
|
||||
logger.Debug("Successfully closed StreamSession")
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user