# Mailboxes are objects that enable synchronous or asynchronous
# IPC via short message-passing of bytes and handles.

object mailbox : object {
    uid 99934ad04ece1e07

    capabilities [
        send
        receive
        close
    ]

    method create [constructor]
    method close [destructor cap:close]

    # Asynchronously send a message to the reciever
    method send [cap:send handle] {
        param tag uint64
        param data buffer [zero_ok]
        param handles ref object [list]
    }

    # Receive a pending message, or block waiting for a message to
    # arrive if block is true.
    method receive [cap:receive] {
        param tag uint64 [out]
        param data buffer [out zero_ok]
        param handles ref object [out list zero_ok]
        param reply_tag uint16 [out optional]
        param badge uint64 [out optional]
        param flags uint64
    }

    # Send a message to the reciever, and block until a
    # response is sent. Note that getting this response
    # does not require the receive capability.
    method call [cap:send handle] {
        param tag uint64 [inout]
        param data buffer [inout zero_ok]
        param handles ref object [inout list zero_ok]
    }

    # Respond to a message sent using call. Note that this
    # requires the receive capability and not the send capability.
    method respond [cap:receive] {
        param tag uint64
        param data buffer [zero_ok]
        param handles ref object [list zero_ok]
        param reply_tag uint16
    }

    # Respond to a message sent using call, and wait for another
    # message to arrive. Note that this does not require the send
    # capability.
    method respond_receive [cap:receive] {
        param tag uint64 [inout]
        param data buffer [inout zero_ok]
        param data_in size
        param handles ref object [inout list zero_ok]
        param handles_in size
        param reply_tag uint16 [inout]
        param badge uint64 [out optional]
        param flags uint64
    }
}
