# zx_clock_create

## NAME

<!-- Updated by update-docs-from-fidl, do not edit. -->

Create a new clock object.

## SYNOPSIS

<!-- 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

<!-- 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 which is
  guaranteed to never run backwards. Monotonic clocks must always move forward.
+ **ZX_CLOCK_OPT_CONTINUOUS** : When set, creates a clock which 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](/docs/reference/kernel_objects/clock.md)
 - [`zx_clock_get_details()`]
 - [`zx_clock_read()`]
 - [`zx_clock_update()`]

<!-- References updated by update-docs-from-fidl, do not edit. -->

[`zx_clock_get_details()`]: clock_get_details.md
[`zx_clock_read()`]: clock_read.md
[`zx_clock_update()`]: clock_update.md
