blob: 52e719d5408e401bea17c453ef8ca35bece1c095 [file] [log] [blame] [view]
# zx_clock_create
## NAME
<!-- Contents of this heading updated by update-docs-from-fidl, do not edit. -->
Create a new clock object.
## SYNOPSIS
<!-- Contents of this heading updated by update-docs-from-fidl, do not edit. -->
```c
#include <zircon/syscalls.h>
zx_status_t zx_clock_create(uint64_t options,
const void* args,
zx_handle_t* out);
```
## RIGHTS
<!-- Contents of this heading updated by update-docs-from-fidl, do not edit. -->
None.
## DESCRIPTION
Creates a new zircon clock object. See [clocks](/docs/reference/kernel_objects/clock.md) for an
overview of clock objects.
### Options
The following options are defined for clock objects:
+ **ZX_CLOCK_OPT_MONOTONIC** : When set, creates a clock object that is
guaranteed to never run backwards. Monotonic clocks must always move forward.
+ **ZX_CLOCK_OPT_CONTINUOUS** : When set, creates a clock that is guaranteed to
never jump either forwards or backwards. Continuous clocks may only be
maintained using frequency adjustments and are, by definition, also monotonic.
Attempting to create a clock object with the **ZX_CLOCK_OPT_CONTINUOUS** option
specified, but without the **ZX_CLOCK_OPT_MONOTONIC** option specified is an
error, which will be signalled with **ZX_ERR_INVALID_ARGS**.
+ **ZX_CLOCK_OPT_AUTO_START** : When set, creates a clock that is started
automatically for the user. You don't need to call zx_clock_update() to start
the clock running. Initially, the clock will be a clone of clock monotonic,
meaning that the internal transformation from clock monotonic to the newly
created synthetic clock is the identity function. The created clock does not
have to be created with either the **ZX_CLOCK_OPT_MONOTONIC** or
**ZX_CLOCK_OPT_CONTINUOUS** flags set, however. Once created, users may still
update the clock within the limits defined by the monotonic and continuous
properties specified at create time, the handle rights, and the backstop time
of the clock.
### Arguments
One additional creation-time argument may be specified when configuring the clock, the backstop
time. See [clocks](/docs/reference/kernel_objects/clock.md) for more details about backstop times.
In order to configure a backstop time, a user must pass a `zx_clock_create_args_v1_t` structure to
the `zx_clock_create` call via the `args` parameter. Additionally, the `options` bits must have
`ZX_CLOCK_ARGS_VERSION(1)` set in them.
For example, a user who wished to create a monotonic clock with a backstop time of 5500 might do
something like the following.
```c
#include <zircon/syscalls.h>
#include <zircon/syscalls/clock.h>
zx_handle_t MakeAClock() {
zx_clock_create_args_v1_t args;
zx_handle_t the_clock;
zx_status_t status;
args.backstop_time = 5500;
status = zx_clock_create(ZX_CLOCK_ARGS_VERSION(1) | ZX_CLOCK_OPT_MONOTONIC, &args, &the_clock);
if (status != ZX_OK) {
// Log the error
return ZX_HANDLE_INVALID;
}
return the_clock;
}
```
Users do not have to supply an arguments structure. If an explicit backstop is not required, users
may omit the version bits from the options parameter and simply pass nullptr for args.
## RETURN VALUE
On success, returns **ZX_OK** along with a new clock object via the *out*
handle. Handles to newly created clock objects will have the **ZX_RIGHT_READ**
and **ZX_RIGHT_WRITE** rights assigned to them.
## ERRORS
- **ZX_ERR_INVALID_ARGS** : An invalid option flag was specified, a bad args
structure version or pointer was passed, **ZX_CLOCK_OPT_CONTINUOUS** was
specified without also specifying **ZX_CLOCK_OPT_MONOTONIC**, or the initial
backstop time of an automatically started clock is after the current clock
monotonic time.
- **ZX_ERR_NO_MEMORY** Failure due to lack of memory.
## SEE ALSO
- [clocks]
- [`zx_clock_get_details()`]
- [`zx_clock_read()`]
- [`zx_clock_update()`]
<!-- References updated by update-docs-from-fidl, do not edit. -->
[clocks]: /docs/reference/kernel_objects/clock.md
[`zx_clock_get_details()`]: clock_get_details.md
[`zx_clock_read()`]: clock_read.md
[`zx_clock_update()`]: clock_update.md