mirror of
https://github.com/xtaci/kcptun.git
synced 2024-04-21 12:32:32 +00:00
fix locking scheme
This commit is contained in:
+12
-4
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user