buffer: fix build issues on Go 1.8.

geesefs-0-30-9
Aaron Jacobs 2016-12-19 14:43:05 +11:00
commit dfa49f5592
4 changed files with 56 additions and 2 deletions

View File

@ -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
memclr(unsafe.Pointer(&m.header), uintptr(OutMessageHeaderSize))
// 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.

View File

@ -19,6 +19,8 @@ import "unsafe"
//go:noescape
// Zero the n bytes starting at p.
//
// REQUIRES: the region does not contain any Go pointers.
func memclr(p unsafe.Pointer, n uintptr)
//go:noescape

View File

@ -0,0 +1,37 @@
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build amd64 arm64 ppc64 ppc64le
// +build go1.8
// Assembly code isn't subject to visibility restrictions, so we can jump
// directly into package runtime.
//
// Technique copied from here:
// https://github.com/golang/go/blob/d8c6dac/src/os/signal/sig.s
#include "textflag.h"
#ifdef GOARCH_ppc64
#define JMP BR
#endif
#ifdef GOARCH_ppc64le
#define JMP BR
#endif
TEXT ·memclr(SB),NOSPLIT,$0-16
JMP runtime·memclrNoHeapPointers(SB)
TEXT ·memmove(SB),NOSPLIT,$0-24
JMP runtime·memmove(SB)

View File

@ -13,6 +13,7 @@
// limitations under the License.
// +build amd64 arm64 ppc64 ppc64le
// +build !go1.8
// Assembly code isn't subject to visibility restrictions, so we can jump
// directly into package runtime.