mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-19 09:40:23 +08:00
optimize(orbyte): use manual destroy
This commit is contained in:
2
go.mod
2
go.mod
@@ -8,7 +8,7 @@ require (
|
|||||||
github.com/fumiama/blake2b-simd v0.0.0-20220412110131-4481822068bb
|
github.com/fumiama/blake2b-simd v0.0.0-20220412110131-4481822068bb
|
||||||
github.com/fumiama/go-base16384 v1.7.0
|
github.com/fumiama/go-base16384 v1.7.0
|
||||||
github.com/fumiama/go-x25519 v1.0.0
|
github.com/fumiama/go-x25519 v1.0.0
|
||||||
github.com/fumiama/orbyte v0.0.0-20250403074130-f9204e9924a1
|
github.com/fumiama/orbyte v0.0.0-20250403152421-da8338096f2d
|
||||||
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac
|
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac
|
||||||
github.com/klauspost/compress v1.17.9
|
github.com/klauspost/compress v1.17.9
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -11,8 +11,8 @@ github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMW
|
|||||||
github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM=
|
github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM=
|
||||||
github.com/fumiama/go-x25519 v1.0.0 h1:hiGg9EhseVmGCc8T1jECVkj8Keu/aJ1ZK05RM8Vuavo=
|
github.com/fumiama/go-x25519 v1.0.0 h1:hiGg9EhseVmGCc8T1jECVkj8Keu/aJ1ZK05RM8Vuavo=
|
||||||
github.com/fumiama/go-x25519 v1.0.0/go.mod h1:8VOhfyGZzw4IUs4nCjQFqW9cA3V/QpSCtP3fo2dLNg4=
|
github.com/fumiama/go-x25519 v1.0.0/go.mod h1:8VOhfyGZzw4IUs4nCjQFqW9cA3V/QpSCtP3fo2dLNg4=
|
||||||
github.com/fumiama/orbyte v0.0.0-20250403074130-f9204e9924a1 h1:E6/hCWUUcwJBlbNRHDl2VyqX0l48Xv6sVYPLh4ZFpPQ=
|
github.com/fumiama/orbyte v0.0.0-20250403152421-da8338096f2d h1:paZ9NH9v7pwULgypKZytzuYNtODDGQGMvXcD6mzpXEs=
|
||||||
github.com/fumiama/orbyte v0.0.0-20250403074130-f9204e9924a1/go.mod h1:qkUllQ1+gTx5sGrmKvIsqUgsnOO21Hiq847YHJRifbk=
|
github.com/fumiama/orbyte v0.0.0-20250403152421-da8338096f2d/go.mod h1:qkUllQ1+gTx5sGrmKvIsqUgsnOO21Hiq847YHJRifbk=
|
||||||
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac h1:A/5A0rODsg+EQHH61Ew5mMUtDpRXaSNqHhPvW+fN4C4=
|
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac h1:A/5A0rODsg+EQHH61Ew5mMUtDpRXaSNqHhPvW+fN4C4=
|
||||||
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo=
|
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo=
|
||||||
github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0 h1:WfrSFlIlCAtg6Rt2IGna0HhJYSDE45YVHiYqO4wwsEw=
|
github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0 h1:WfrSFlIlCAtg6Rt2IGna0HhJYSDE45YVHiYqO4wwsEw=
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ func (p *Packet) PreCRC64() (crc uint64) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
w.Destroy()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,11 +59,13 @@ func (p *Packet) WriteHeaderTo(buf *bytes.Buffer) {
|
|||||||
buf.Write((*[PacketHeadNoCRCLen]byte)(
|
buf.Write((*[PacketHeadNoCRCLen]byte)(
|
||||||
(unsafe.Pointer)(p),
|
(unsafe.Pointer)(p),
|
||||||
)[:])
|
)[:])
|
||||||
pbuf.NewBytes(buf.Len()).V(func(b []byte) {
|
b := pbuf.NewBytes(buf.Len())
|
||||||
|
b.V(func(b []byte) {
|
||||||
copy(b, buf.Bytes())
|
copy(b, buf.Bytes())
|
||||||
ClearTTL(b)
|
ClearTTL(b)
|
||||||
p.md5h8 = algo.MD5Hash8(b)
|
p.md5h8 = algo.MD5Hash8(b)
|
||||||
})
|
})
|
||||||
|
b.ManualDestroy()
|
||||||
_ = binary.Write(buf, binary.LittleEndian, p.md5h8)
|
_ = binary.Write(buf, binary.LittleEndian, p.md5h8)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -76,14 +79,17 @@ func (p *Packet) WriteHeaderTo(buf *bytes.Buffer) {
|
|||||||
w.Write(p.src[:])
|
w.Write(p.src[:])
|
||||||
w.Write(p.dst[:])
|
w.Write(p.dst[:])
|
||||||
w.P(func(buf *pbuf.Buffer) {
|
w.P(func(buf *pbuf.Buffer) {
|
||||||
pbuf.NewBytes(buf.Len()).V(func(b []byte) {
|
b := pbuf.NewBytes(buf.Len())
|
||||||
|
b.V(func(b []byte) {
|
||||||
copy(b, buf.Bytes())
|
copy(b, buf.Bytes())
|
||||||
ClearTTL(b)
|
ClearTTL(b)
|
||||||
p.md5h8 = algo.MD5Hash8(b)
|
p.md5h8 = algo.MD5Hash8(b)
|
||||||
})
|
})
|
||||||
|
b.ManualDestroy()
|
||||||
})
|
})
|
||||||
w.WriteUInt64(p.md5h8)
|
w.WriteUInt64(p.md5h8)
|
||||||
w.P(func(b *pbuf.Buffer) {
|
w.P(func(b *pbuf.Buffer) {
|
||||||
_, _ = buf.ReadFrom(b)
|
_, _ = buf.ReadFrom(b)
|
||||||
})
|
})
|
||||||
|
w.Destroy()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ func (pb *DataBuilder) Zstd() *DataBuilder {
|
|||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
logrus.Debugln(file.Header(), strconv.FormatUint(ub.DAT.md5h8, 16), "data after zstd", file.ToLimitHexString(ub.Bytes(), 64))
|
logrus.Debugln(file.Header(), strconv.FormatUint(ub.DAT.md5h8, 16), "data after zstd", file.ToLimitHexString(ub.Bytes(), 64))
|
||||||
}
|
}
|
||||||
|
data.ManualDestroy()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +126,9 @@ func (pb *DataBuilder) Seal(aead cipher.AEAD, teatyp uint8, additional uint16) *
|
|||||||
data := algo.EncodeAEAD(aead, additional, b.Bytes())
|
data := algo.EncodeAEAD(aead, additional, b.Bytes())
|
||||||
ub.Reset()
|
ub.Reset()
|
||||||
data.V(func(b []byte) { ub.Write(b) })
|
data.V(func(b []byte) { ub.Write(b) })
|
||||||
|
data.ManualDestroy()
|
||||||
})
|
})
|
||||||
|
w.Destroy()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,6 +142,7 @@ func (pb *DataBuilder) Plain(teatyp uint8, additional uint16) *PacketBuilder {
|
|||||||
ub.Reset()
|
ub.Reset()
|
||||||
_, _ = ub.ReadFrom(b)
|
_, _ = ub.ReadFrom(b)
|
||||||
})
|
})
|
||||||
|
w.Destroy()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,6 +232,11 @@ func (pb *PacketBuilder) Split(mtu int, nofrag bool) (pbs []PacketBytes) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Destroy call this once no one use it.
|
||||||
|
func (pb *PacketBuilder) Destroy() {
|
||||||
|
(*PacketItem)(pb).ManualDestroy()
|
||||||
|
}
|
||||||
|
|
||||||
func BuildPacketFromBytes(pb PacketBytes) pbuf.Bytes {
|
func BuildPacketFromBytes(pb PacketBytes) pbuf.Bytes {
|
||||||
w := bin.SelectWriter()
|
w := bin.SelectWriter()
|
||||||
pb.B(func(_ []byte, p *Packet) {
|
pb.B(func(_ []byte, p *Packet) {
|
||||||
|
|||||||
@@ -55,11 +55,13 @@ func ParsePacketHeader(data []byte) (pbytes PacketBytes, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var crc uint64
|
var crc uint64
|
||||||
pbuf.NewBytes(int(PacketHeadNoCRCLen)).V(func(b []byte) {
|
b := pbuf.NewBytes(int(PacketHeadNoCRCLen))
|
||||||
|
b.V(func(b []byte) {
|
||||||
copy(b, data[:PacketHeadNoCRCLen])
|
copy(b, data[:PacketHeadNoCRCLen])
|
||||||
ClearTTL(b)
|
ClearTTL(b)
|
||||||
crc = algo.MD5Hash8(b)
|
crc = algo.MD5Hash8(b)
|
||||||
})
|
})
|
||||||
|
b.ManualDestroy()
|
||||||
if crc != pb.DAT.md5h8 {
|
if crc != pb.DAT.md5h8 {
|
||||||
err = ErrBadCRCChecksum
|
err = ErrBadCRCChecksum
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
@@ -80,6 +82,7 @@ func ParsePacketHeader(data []byte) (pbytes PacketBytes, err error) {
|
|||||||
pb.DAT.hashrem = int64(sz)
|
pb.DAT.hashrem = int64(sz)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.ManualDestroy()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pbytes = pbuf.BufferItemToBytes(p)
|
pbytes = pbuf.BufferItemToBytes(p)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ var (
|
|||||||
|
|
||||||
type LinkData struct {
|
type LinkData struct {
|
||||||
H head.Packet
|
H head.Packet
|
||||||
D pbuf.Bytes
|
D []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link 是本机到 peer 的连接抽象
|
// Link 是本机到 peer 的连接抽象
|
||||||
@@ -74,7 +74,7 @@ func (l *Link) ToLower(header *head.Packet, data pbuf.Bytes) {
|
|||||||
if l.pipe != nil {
|
if l.pipe != nil {
|
||||||
l.pipe <- LinkData{
|
l.pipe <- LinkData{
|
||||||
H: *header,
|
H: *header,
|
||||||
D: data,
|
D: data.Copy().Trans(),
|
||||||
}
|
}
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
logrus.Debugln("[listen] deliver to pipe of", l.peerip)
|
logrus.Debugln("[listen] deliver to pipe of", l.peerip)
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ func (m *Me) listen() (conn p2p.Conn, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *Me) waitordispatch(addr p2p.EndPoint, buf pbuf.Bytes, n int) {
|
func (m *Me) waitordispatch(addr p2p.EndPoint, buf pbuf.Bytes, n int) {
|
||||||
|
defer buf.ManualDestroy()
|
||||||
|
|
||||||
recvtotlcnt := atomic.AddUint64(&m.recvtotlcnt, uint64(buf.Len()))
|
recvtotlcnt := atomic.AddUint64(&m.recvtotlcnt, uint64(buf.Len()))
|
||||||
recvloopcnt := atomic.AddUintptr(&m.recvloopcnt, 1)
|
recvloopcnt := atomic.AddUintptr(&m.recvloopcnt, 1)
|
||||||
recvlooptime := atomic.LoadInt64(&m.recvlooptime)
|
recvlooptime := atomic.LoadInt64(&m.recvlooptime)
|
||||||
@@ -100,6 +102,7 @@ func (m *Me) waitordispatch(addr p2p.EndPoint, buf pbuf.Bytes, n int) {
|
|||||||
}
|
}
|
||||||
m.dispatch(p, b, addr)
|
m.dispatch(p, b, addr)
|
||||||
})
|
})
|
||||||
|
h.ManualDestroy()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +154,9 @@ func (m *Me) dispatch(header *head.Packet, body []byte, addr p2p.EndPoint) {
|
|||||||
data = data.SliceFrom(8)
|
data = data.SliceFrom(8)
|
||||||
if p.usezstd {
|
if p.usezstd {
|
||||||
data.V(func(b []byte) {
|
data.V(func(b []byte) {
|
||||||
|
old := data
|
||||||
data, err = algo.DecodeZstd(b) // skip hash
|
data, err = algo.DecodeZstd(b) // skip hash
|
||||||
|
old.ManualDestroy()
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
@@ -169,4 +174,5 @@ func (m *Me) dispatch(header *head.Packet, body []byte, addr p2p.EndPoint) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
fn(header, p, data)
|
fn(header, p, data)
|
||||||
|
data.ManualDestroy()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,8 +312,11 @@ func (m *Me) sendAllSameDst(packet []byte) (n int) {
|
|||||||
pcp.V(func(b []byte) {
|
pcp.V(func(b []byte) {
|
||||||
copy(b, packet)
|
copy(b, packet)
|
||||||
})
|
})
|
||||||
go pcp.V(func(b []byte) {
|
go func() {
|
||||||
lnk.WritePacket(head.ProtoData, b, lnk.me.ttl)
|
pcp.V(func(b []byte) {
|
||||||
})
|
lnk.WritePacket(head.ProtoData, b, lnk.me.ttl)
|
||||||
|
})
|
||||||
|
pcp.ManualDestroy()
|
||||||
|
}()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ func (m *Me) wait(data []byte, addr p2p.EndPoint) (h head.PacketBytes) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
data = w.ToBytes().Copy().Trans()
|
data = w.ToBytes().Copy().Trans()
|
||||||
|
w.Destroy()
|
||||||
if len(data) < bound {
|
if len(data) < bound {
|
||||||
bound = len(data)
|
bound = len(data)
|
||||||
endl = "."
|
endl = "."
|
||||||
@@ -142,6 +143,9 @@ func (m *Me) wait(data []byte, addr p2p.EndPoint) (h head.PacketBytes) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
|
if !h.HasInit() {
|
||||||
|
header.ManualDestroy()
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,11 +57,13 @@ func (l *Link) WritePacket(proto uint8, data []byte, ttl uint8) {
|
|||||||
pktb = pb.Seal(l.keys[teatype], teatype, sndcnt&0x07ff)
|
pktb = pb.Seal(l.keys[teatype], teatype, sndcnt&0x07ff)
|
||||||
}
|
}
|
||||||
bs := pktb.Split(int(mtu), false)
|
bs := pktb.Split(int(mtu), false)
|
||||||
|
pktb.Destroy()
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
logrus.Debugln("[send] split packet into", len(bs), "parts")
|
logrus.Debugln("[send] split packet into", len(bs), "parts")
|
||||||
}
|
}
|
||||||
for _, b := range bs { //TODO: impl. nofrag
|
for _, b := range bs { //TODO: impl. nofrag
|
||||||
go l.write2peer(head.BuildPacketFromBytes(b), randseq(sndcnt))
|
go l.write2peer(head.BuildPacketFromBytes(b), randseq(sndcnt))
|
||||||
|
b.ManualDestroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +71,7 @@ func (l *Link) WritePacket(proto uint8, data []byte, ttl uint8) {
|
|||||||
//
|
//
|
||||||
// 因为不保证可达所以不返回错误。
|
// 因为不保证可达所以不返回错误。
|
||||||
func (l *Link) write2peer(b pbuf.Bytes, seq uint32) {
|
func (l *Link) write2peer(b pbuf.Bytes, seq uint32) {
|
||||||
|
defer b.ManualDestroy()
|
||||||
if l.doublepacket {
|
if l.doublepacket {
|
||||||
err := l.write2peer1(b, seq)
|
err := l.write2peer1(b, seq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -96,6 +99,7 @@ func (l *Link) write2peer1(b pbuf.Bytes, seq uint32) (err error) {
|
|||||||
if conn == nil {
|
if conn == nil {
|
||||||
return io.ErrClosedPipe
|
return io.ErrClosedPipe
|
||||||
}
|
}
|
||||||
|
isnewb := false
|
||||||
b.V(func(data []byte) {
|
b.V(func(data []byte) {
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
bound := 64
|
bound := 64
|
||||||
@@ -107,6 +111,7 @@ func (l *Link) write2peer1(b pbuf.Bytes, seq uint32) (err error) {
|
|||||||
logrus.Debugln("[send] crc seq", fmt.Sprintf("%08x", seq), "raw data bytes", hex.EncodeToString(data[:bound]), endl)
|
logrus.Debugln("[send] crc seq", fmt.Sprintf("%08x", seq), "raw data bytes", hex.EncodeToString(data[:bound]), endl)
|
||||||
}
|
}
|
||||||
b = l.me.xorenc(data, seq)
|
b = l.me.xorenc(data, seq)
|
||||||
|
isnewb = true
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
bound := 64
|
bound := 64
|
||||||
endl := "..."
|
endl := "..."
|
||||||
@@ -121,7 +126,12 @@ func (l *Link) write2peer1(b pbuf.Bytes, seq uint32) (err error) {
|
|||||||
})
|
})
|
||||||
if l.me.base14 {
|
if l.me.base14 {
|
||||||
b.V(func(data []byte) {
|
b.V(func(data []byte) {
|
||||||
|
old := b
|
||||||
b = pbuf.ParseBytes(base14.Encode(data)...)
|
b = pbuf.ParseBytes(base14.Encode(data)...)
|
||||||
|
if isnewb {
|
||||||
|
old.ManualDestroy()
|
||||||
|
}
|
||||||
|
isnewb = true
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
bound := 64
|
bound := 64
|
||||||
endl := "..."
|
endl := "..."
|
||||||
@@ -141,5 +151,8 @@ func (l *Link) write2peer1(b pbuf.Bytes, seq uint32) (err error) {
|
|||||||
}
|
}
|
||||||
_, err = conn.WriteToPeer(b, peerep)
|
_, err = conn.WriteToPeer(b, peerep)
|
||||||
})
|
})
|
||||||
|
if isnewb {
|
||||||
|
b.ManualDestroy()
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func (p *packet) pack() *net.Buffers {
|
|||||||
return &net.Buffers{magicbuf, bin.NewWriterF(func(w *bin.Writer) {
|
return &net.Buffers{magicbuf, bin.NewWriterF(func(w *bin.Writer) {
|
||||||
w.WriteByte(byte(p.typ))
|
w.WriteByte(byte(p.typ))
|
||||||
w.WriteUInt16(p.len)
|
w.WriteUInt16(p.len)
|
||||||
}).Trans(), p.dat}
|
}), p.dat}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packet) Read(_ []byte) (int, error) {
|
func (p *packet) Read(_ []byte) (int, error) {
|
||||||
@@ -80,7 +80,8 @@ func (p *packet) ReadFrom(r io.Reader) (n int64, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
p.dat = w.ToBytes().Trans()
|
p.dat = w.ToBytes().Copy().Trans()
|
||||||
|
w.Destroy()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ func init() {
|
|||||||
w.P(func(b *pbuf.Buffer) {
|
w.P(func(b *pbuf.Buffer) {
|
||||||
peer.WritePacket(head.ProtoNotify, b.Bytes(), peer.Me().TTL())
|
peer.WritePacket(head.ProtoNotify, b.Bytes(), peer.Me().TTL())
|
||||||
})
|
})
|
||||||
|
w.Destroy()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// SelectWriter 从池中取出一个 Writer
|
// SelectWriter 从池中取出一个 Writer
|
||||||
|
//
|
||||||
|
// 不要忘记调用 Destroy 以快速回收资源
|
||||||
func SelectWriter() *Writer {
|
func SelectWriter() *Writer {
|
||||||
return (*Writer)(pbuf.NewBuffer(nil))
|
return (*Writer)(pbuf.NewBuffer(nil))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,12 @@ import (
|
|||||||
// Writer 写入
|
// Writer 写入
|
||||||
type Writer pbuf.OBuffer
|
type Writer pbuf.OBuffer
|
||||||
|
|
||||||
func NewWriterF(f func(writer *Writer)) pbuf.Bytes {
|
func NewWriterF(f func(writer *Writer)) []byte {
|
||||||
w := SelectWriter()
|
w := SelectWriter()
|
||||||
f(w)
|
f(w)
|
||||||
return w.ToBytes()
|
b := w.ToBytes().Copy()
|
||||||
|
w.Destroy()
|
||||||
|
return b.Trans()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) P(f func(*pbuf.Buffer)) *Writer {
|
func (w *Writer) P(f func(*pbuf.Buffer)) *Writer {
|
||||||
@@ -64,3 +66,7 @@ func (w *Writer) WriteUInt64(v uint64) {
|
|||||||
func (w *Writer) ToBytes() pbuf.Bytes {
|
func (w *Writer) ToBytes() pbuf.Bytes {
|
||||||
return pbuf.BufferItemToBytes((*pbuf.OBuffer)(w))
|
return pbuf.BufferItemToBytes((*pbuf.OBuffer)(w))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *Writer) Destroy() {
|
||||||
|
(*pbuf.OBuffer)(w).ManualDestroy()
|
||||||
|
}
|
||||||
|
|||||||
@@ -73,14 +73,14 @@ func (s *Tunnel) Read(p []byte) (int, error) {
|
|||||||
d = s.outcache
|
d = s.outcache
|
||||||
} else {
|
} else {
|
||||||
pkt := <-s.out
|
pkt := <-s.out
|
||||||
if !pkt.D.HasInit() {
|
if len(pkt.D) == 0 {
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
}
|
}
|
||||||
if pkt.H.Size() < 4 {
|
if pkt.H.Size() < 4 {
|
||||||
logrus.Warnln("[tunnel] unexpected packet data len", pkt.H.Size(), "content", hex.EncodeToString(pkt.D.Trans()))
|
logrus.Warnln("[tunnel] unexpected packet data len", pkt.H.Size(), "content", hex.EncodeToString(pkt.D))
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
}
|
}
|
||||||
d = pkt.D.Trans()[4:]
|
d = pkt.D[4:]
|
||||||
}
|
}
|
||||||
if d != nil {
|
if d != nil {
|
||||||
if len(p) >= len(d) {
|
if len(p) >= len(d) {
|
||||||
@@ -157,23 +157,21 @@ func (s *Tunnel) handleRead() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
p := s.l.Read()
|
p := s.l.Read()
|
||||||
if !p.D.HasInit() {
|
if len(p.D) == 0 {
|
||||||
logrus.Errorln("[tunnel] read recv nil")
|
logrus.Errorln("[tunnel] read recv nil")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
end := 64
|
end := 64
|
||||||
endl := "..."
|
endl := "..."
|
||||||
if p.D.Len() < 64 {
|
if len(p.D) < 64 {
|
||||||
end = p.D.Len()
|
end = len(p.D)
|
||||||
endl = "."
|
endl = "."
|
||||||
}
|
}
|
||||||
var recvseq uint32
|
var recvseq uint32
|
||||||
p.D.V(func(b []byte) {
|
if config.ShowDebugLog {
|
||||||
if config.ShowDebugLog {
|
logrus.Debugln("[tunnel] read recv", hex.EncodeToString(p.D[:end]), endl)
|
||||||
logrus.Debugln("[tunnel] read recv", hex.EncodeToString(b[:end]), endl)
|
}
|
||||||
}
|
recvseq = binary.LittleEndian.Uint32(p.D[:4])
|
||||||
recvseq = binary.LittleEndian.Uint32(b[:4])
|
|
||||||
})
|
|
||||||
if recvseq == seq {
|
if recvseq == seq {
|
||||||
if config.ShowDebugLog {
|
if config.ShowDebugLog {
|
||||||
logrus.Debugln("[tunnel] dispatch seq", seq)
|
logrus.Debugln("[tunnel] dispatch seq", seq)
|
||||||
|
|||||||
@@ -413,7 +413,10 @@ func (f logFormat) Format(entry *logrus.Entry) ([]byte, error) {
|
|||||||
buf.WriteString(entry.Message)
|
buf.WriteString(entry.Message)
|
||||||
buf.WriteString("\n")
|
buf.WriteString("\n")
|
||||||
|
|
||||||
return buf.ToBytes().Trans(), nil
|
b := buf.ToBytes().Copy()
|
||||||
|
buf.Destroy()
|
||||||
|
|
||||||
|
return b.Trans(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
Reference in New Issue
Block a user