| // 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 |
| } |