From b78488c16b0064a87542d6a5d42332489d3894d5 Mon Sep 17 00:00:00 2001 From: "Jun.S.Shen" Date: Fri, 17 Nov 2023 12:57:43 -0800 Subject: [PATCH 1/3] test Signed-off-by: Jun.S.Shen --- test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 00000000..e69de29b From 20b8d22ed8753cf817e0ec3ca67a58b26064a645 Mon Sep 17 00:00:00 2001 From: "Jun.S.Shen" Date: Fri, 17 Nov 2023 13:31:17 -0800 Subject: [PATCH 2/3] release dynamically allocated channel/timer after use Signed-off-by: Jun.S.Shen --- 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 From 3fb234da1e972a10b95ac7107d81831204e16a3b Mon Sep 17 00:00:00 2001 From: "Jun.S.Shen" Date: Fri, 24 Nov 2023 15:53:07 -0800 Subject: [PATCH 3/3] revert some cleanup code Signed-off-by: Jun.S.Shen --- file.go | 7 ------- pipe.go | 2 -- 2 files changed, 9 deletions(-) diff --git a/file.go b/file.go index 1434d62c..a12bbb70 100644 --- a/file.go +++ b/file.go @@ -327,8 +327,6 @@ 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: @@ -341,16 +339,11 @@ 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 c845a925..a2da6639 100644 --- a/pipe.go +++ b/pipe.go @@ -453,8 +453,6 @@ func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { err = ErrPipeListenerClosed } } - close(ch) - ch = nil return p, err }