blob: e66f465fcc0738cd5cfea9eb84ec8c574c7379eb [file] [log] [blame] [view]
# Mojo handles (objects)
Mojo handles are analogous to Unix file descriptors or Windows `HANDLE`s. That
is, they are basically-opaque integers that a program can use to refer to system
resources. Like their Unix and Windows equivalents, a Mojo handle value only has
meaning within a given process.
That said, there are some differences:
* There is a single value, 0, that is guaranteed to never be a valid Mojo
handle. This is unlike Unix, where all negative file descriptors are usually
taken to be invalid, even if -1 is often taken to be the "canonical" invalid
file descriptor value.
* The allocation of Mojo handle values is not specified. This is unlike Unix,
where file descriptors are allocated sequentially, with the lowest (positive)
unused value allocated.
* Unlike Windows, there are no "pseudohandles". That is, there is no Mojo handle
value whose meaning is context dependent (within the same process).
* In general, Mojo handles need not be duplicatable, whereas their Unix and
Windows equivalents can universally be duplicated.
* Mojo handles can be sent across [message pipes](message_pipes.md). Unlike
sending file descriptors over Unix domain sockets (using `SCM_RIGHTS`), this
is done with transfer semantics: after a message with attached Mojo handles is
sent, the Mojo handle values become invalid in the sending process. (Even if
the receiving process is the same as the sending process, the received Mojo
handle values will probably be different from the values that were sent.)
* Each Mojo handle has a set of "rights", which control what operations can be
performed on a given handle. The rights for a given handle are immutable.
However, any handle may be replaced with an "equivalent" handle with a
(possibly) reduced set of rights.
* A Mojo handle has a well-defined life-cycle, and is only invalidated either by
being transferred across a message pipe, by being replaced (by an "equivalent"
handle), or by being closed. Unlike Unix's overloaded `close()` (which may
fail due to data loss, i.e., inability to flush), closing a (valid) Mojo
handle never fails.