diff --git a/poll.go b/poll.go index 336f686..005fc05 100644 --- a/poll.go +++ b/poll.go @@ -58,12 +58,16 @@ type pollDesc struct { var pdPool = sync.Pool{ New: func() interface{} { - return &pollDesc{ + desc := &pollDesc{ unblockRd: make(chan interface{}, 1), unblockWr: make(chan interface{}, 1), rdTimer: time.NewTimer(0), wdTimer: time.NewTimer(0), } + // creating timer with 0 duration makes it fire right away. Read the channel to prevent a false fire later + <-desc.rdTimer.C + <-desc.wdTimer.C + return desc }, } @@ -200,8 +204,8 @@ func (pd *pollDesc) setDeadline(t time.Time, mode PollMode) { if mode == ModeRead || mode == ModeRead+ModeWrite { pd.rdSeq++ pd.rtSeq = pd.rdSeq - if pd.rdDeadline > 0 { - pd.rdTimer.Stop() + if pd.rdDeadline > 0 && !pd.rdTimer.Stop() { + <-pd.rdTimer.C } pd.rdDeadline = d if d > 0 { @@ -214,8 +218,8 @@ func (pd *pollDesc) setDeadline(t time.Time, mode PollMode) { if mode == ModeWrite || mode == ModeRead+ModeWrite { pd.wdSeq++ pd.wtSeq = pd.wdSeq - if pd.wdDeadline > 0 { - pd.wdTimer.Stop() + if pd.wdDeadline > 0 && !pd.wdTimer.Stop() { + <-pd.wdTimer.C } pd.wdDeadline = d if d > 0 { diff --git a/read.go b/read.go index 0378dad..78037cf 100644 --- a/read.go +++ b/read.go @@ -48,7 +48,9 @@ func (s SrtSocket) Read(b []byte) (n int, err error) { if !errors.Is(err, error(EAsyncRCV)) || s.blocking { return } - s.pd.wait(ModeRead) + if err = s.pd.wait(ModeRead); err != nil { + return + } n, err = srtRecvMsg2Impl(s.socket, b, nil) } } diff --git a/write.go b/write.go index 01cb8a7..1a9363d 100644 --- a/write.go +++ b/write.go @@ -49,7 +49,9 @@ func (s SrtSocket) Write(b []byte) (n int, err error) { if !errors.Is(err, error(EAsyncSND)) || s.blocking { return } - s.pd.wait(ModeWrite) + if err = s.pd.wait(ModeWrite); err != nil { + return + } n, err = srtSendMsg2Impl(s.socket, b, nil) } }