From cea04881bd376b3681655f0976654016255c542a Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 14:41:59 +1100 Subject: [PATCH] buffer: generate decent code for OutMessage.Reset in Go 1.8 beta 2. --- internal/buffer/out_message.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/internal/buffer/out_message.go b/internal/buffer/out_message.go index 8166b6f..94d5407 100644 --- a/internal/buffer/out_message.go +++ b/internal/buffer/out_message.go @@ -55,8 +55,22 @@ func init() { // Reset resets m so that it's ready to be used again. Afterward, the contents // are solely a zeroed fusekernel.OutHeader struct. func (m *OutMessage) Reset() { - m.payloadOffset = 0 - m.header = fusekernel.OutHeader{} + // Ideally we'd like to write: + // + // m.payloadOffset = 0 + // m.header = fusekernel.OutHeader{} + // + // But Go 1.8 beta 2 generates bad code for this + // (https://golang.org/issue/18370). Encourage it to generate the same code + // as Go 1.7.4 did. + if unsafe.Offsetof(m.payload) != 24 { + panic("unexpected OutMessage layout") + } + + a := (*[3]uint64)(unsafe.Pointer(m)) + a[0] = 0 + a[1] = 0 + a[2] = 0 } // OutHeader returns a pointer to the header at the start of the message.