mirror of
https://github.com/rwinkhart/go-winio.git
synced 2026-09-05 08:37:37 -04:00
Test bug: Fix server connections not closing in TestEchoWithMessaging
Signed-off-by: Darren Stahl <darst@microsoft.com>
This commit is contained in:
@@ -115,16 +115,18 @@ func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
|
|||||||
|
|
||||||
// closeHandle closes the resources associated with a Win32 handle
|
// closeHandle closes the resources associated with a Win32 handle
|
||||||
func (f *win32File) closeHandle() {
|
func (f *win32File) closeHandle() {
|
||||||
|
f.wgLock.Lock()
|
||||||
// Atomically set that we are closing, releasing the resources only once.
|
// Atomically set that we are closing, releasing the resources only once.
|
||||||
if !f.closing.swap(true) {
|
if !f.closing.swap(true) {
|
||||||
|
f.wgLock.Unlock()
|
||||||
// cancel all IO and wait for it to complete
|
// cancel all IO and wait for it to complete
|
||||||
cancelIoEx(f.handle, nil)
|
cancelIoEx(f.handle, nil)
|
||||||
f.wgLock.Lock()
|
|
||||||
f.wg.Wait()
|
f.wg.Wait()
|
||||||
f.wgLock.Unlock()
|
|
||||||
// at this point, no new IO can start
|
// at this point, no new IO can start
|
||||||
syscall.Close(f.handle)
|
syscall.Close(f.handle)
|
||||||
f.handle = 0
|
f.handle = 0
|
||||||
|
} else {
|
||||||
|
f.wgLock.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -367,11 +367,11 @@ func TestEchoWithMessaging(t *testing.T) {
|
|||||||
OutputBufferSize: 65536,
|
OutputBufferSize: 65536,
|
||||||
}
|
}
|
||||||
l, err := ListenPipe(testPipeName, &c)
|
l, err := ListenPipe(testPipeName, &c)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer l.Close()
|
defer l.Close()
|
||||||
|
|
||||||
listenerDone := make(chan bool)
|
listenerDone := make(chan bool)
|
||||||
clientDone := make(chan bool)
|
clientDone := make(chan bool)
|
||||||
go func() {
|
go func() {
|
||||||
@@ -380,6 +380,8 @@ func TestEchoWithMessaging(t *testing.T) {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
t.Fatal(e)
|
t.Fatal(e)
|
||||||
}
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
time.Sleep(500 * time.Millisecond) // make *sure* we don't begin to read before eof signal is sent
|
time.Sleep(500 * time.Millisecond) // make *sure* we don't begin to read before eof signal is sent
|
||||||
io.Copy(conn, conn)
|
io.Copy(conn, conn)
|
||||||
conn.(CloseWriter).CloseWrite()
|
conn.(CloseWriter).CloseWrite()
|
||||||
|
|||||||
Reference in New Issue
Block a user