| # 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.) |
| * Mojo handles have a well-defined life-cycle, and are only invalidated by |
| either transfer across a message pipe (as above) or by closing them. Unlike |
| Unix's overloaded `close()` (which may fail due to data loss, i.e., inability |
| to flush), closing a (valid) Mojo handle never fails. |