fix locking scheme

This commit is contained in:
xtaci
2019-12-18 16:26:46 +08:00
parent 361ba7600d
commit 5ad2b958a6
2 changed files with 20 additions and 6 deletions
+12 -4
View File
@@ -16,17 +16,20 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
buf := ctrl.Buffer
var locked bool
for {
var er error
var nr int
rr := c.Read(func(s uintptr) bool {
ctrl.Lock() // writelock will block reading
defer ctrl.Unlock()
ctrl.Lock() // acquire rights to read & write
locked = true
nr, er = syscall.Read(int(s), buf)
if er == syscall.EAGAIN {
ctrl.Unlock()
locked = false
return false
}
return true
return true // keep lock
})
// read EOF
@@ -35,9 +38,10 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
if nr > 0 {
ctrl.Lock()
nw, ew := dst.Write(buf[0:nr])
ctrl.Unlock()
locked = false
if nw > 0 {
written += int64(nw)
}
@@ -64,5 +68,9 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
}
if locked {
ctrl.Unlock()
}
return written, err
}
+8 -2
View File
@@ -15,12 +15,13 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
buf := ctrl.Buffer
var locked bool
for {
var er error
var nr int
rr := c.Read(func(s uintptr) bool {
ctrl.Lock()
defer ctrl.Unlock()
locked = true
var read uint32
var flags uint32
var wsabuf syscall.WSABuf
@@ -37,9 +38,10 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
if nr > 0 {
ctrl.Lock()
nw, ew := dst.Write(buf[0:nr])
ctrl.Unlock()
locked = false
if nw > 0 {
written += int64(nw)
}
@@ -66,5 +68,9 @@ func rawCopy(dst io.Writer, src *net.TCPConn, ctrl *CopyControl) (written int64,
}
}
if locked {
ctrl.Unlock()
}
return written, err
}