blob: 3931b90061b2f4e8cea7dd1def0fc109b620c51b [file] [log] [blame]
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build fuchsia
package fidl
import (
"sync"
"syscall/zx"
)
// messageBytesPool is a pool of buffers that can fit the data part of any
// FIDL message.
var messageBytesPool = sync.Pool{
New: func() interface{} {
return make([]byte, zx.ChannelMaxMessageBytes)
},
}
// messageHandlesPool is a pool of buffers that can fit the handles part of
// any FIDL message.
var messageHandlesPool = sync.Pool{
New: func() interface{} {
return make([]zx.Handle, zx.ChannelMaxMessageHandles)
},
}
// MessageHeader represents a transactional message header.
type MessageHeader struct {
_ struct{} `fidl2:"s,16,4"`
Txid uint32
Reserved uint32
Flags uint32
Ordinal uint32
}
var mMessageHeader = MustCreateMarshaler(MessageHeader{})
func (msg *MessageHeader) Marshaler() Marshaler {
return mMessageHeader
}
func marshalHeaderThenMessage(header *MessageHeader, msg Message, data []byte, handles []zx.Handle) (int, int, error) {
if _, _, err := MarshalNew(header, data[:MessageHeaderSize], nil); err != nil {
return 0, 0, err
}
if msg == nil {
return MessageHeaderSize, 0, nil
}
nb, nh, err := MarshalNew(msg, data[MessageHeaderSize:], handles[:])
if err != nil {
return 0, 0, err
}
return nb + MessageHeaderSize, nh, nil
}
func unmarshalHeaderThenMessage(data []byte, handles []zx.Handle, header *MessageHeader, msg Message) error {
if _, _, err := UnmarshalNew(data[:MessageHeaderSize], nil, header); err != nil {
return err
}
if msg == nil {
return nil
}
if _, _, err := UnmarshalNew(data[MessageHeaderSize:], handles[:], msg); err != nil {
return err
}
return nil
}