From 420b674988b65af756185ef381185efed7a5e6c8 Mon Sep 17 00:00:00 2001 From: "Jun.S.Shen" Date: Fri, 17 Nov 2023 13:31:17 -0800 Subject: [PATCH] release dynamically allocated channel/timer after use --- file.go | 23 +++++++++++++++++++++++ pipe.go | 2 ++ test.txt | 0 3 files changed, 25 insertions(+) delete mode 100644 test.txt diff --git a/file.go b/file.go index 4f4d4da3..1434d62c 100644 --- a/file.go +++ b/file.go @@ -147,6 +147,22 @@ func (f *win32File) closeHandle() { // Close closes a win32File. func (f *win32File) Close() error { f.closeHandle() + if f.readDeadline.channel != nil { + close(f.readDeadline.channel) + f.readDeadline.channel = nil + } + if f.readDeadline.timer != nil { + f.readDeadline.timer.Stop() + f.readDeadline.timer = nil + } + if f.writeDeadline.channel != nil { + close(f.writeDeadline.channel) + f.writeDeadline.channel = nil + } + if f.writeDeadline.timer != nil { + f.writeDeadline.timer.Stop() + f.writeDeadline.timer = nil + } return nil } @@ -311,6 +327,8 @@ func (d *deadlineHandler) set(deadline time.Time) error { select { case <-d.channel: d.channelLock.Lock() + close(d.channel) + d.channel = nil d.channel = make(chan struct{}) d.channelLock.Unlock() default: @@ -323,11 +341,16 @@ func (d *deadlineHandler) set(deadline time.Time) error { timeoutIO := func() { d.timedout.setTrue() close(d.channel) + d.channel = nil } now := time.Now() duration := deadline.Sub(now) if deadline.After(now) { + if d.timer != nil { + d.timer.Stop() + d.timer = nil + } // Deadline is in the future, set a timer to wait d.timer = time.AfterFunc(duration, timeoutIO) } else { diff --git a/pipe.go b/pipe.go index a2da6639..c845a925 100644 --- a/pipe.go +++ b/pipe.go @@ -453,6 +453,8 @@ func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { err = ErrPipeListenerClosed } } + close(ch) + ch = nil return p, err } diff --git a/test.txt b/test.txt deleted file mode 100644 index e69de29b..00000000