| # zx_clock_get | |
| ## NAME | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| Acquire the current time. | |
| ## STATUS | |
| `zx_clock_adjust` is currently **DEPRECATED**. Do not make use of it in any new | |
| code. See the [ALTERNATIVES](#alternatives) section of this page for the | |
| updated way to fetch the values which used to be accessible via | |
| `zx_clock_get()`. | |
| ## SYNOPSIS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| ```c | |
| #include <zircon/syscalls.h> | |
| zx_status_t zx_clock_get(zx_clock_t clock_id, zx_time_t* out); | |
| ``` | |
| ## DESCRIPTION | |
| `zx_clock_get()` returns the current time of *clock_id* via | |
| *out*, and returns whether *clock_id* was valid. | |
| ## SUPPORTED CLOCK IDS | |
| **ZX_CLOCK_MONOTONIC** number of nanoseconds since the system was powered on. | |
| **ZX_CLOCK_UTC** number of wall clock nanoseconds since the Unix epoch (midnight on January 1 1970) in UTC | |
| **ZX_CLOCK_THREAD** number of nanoseconds the current thread has been running for. | |
| ## RIGHTS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| TODO(fxbug.dev/32253) | |
| ## RETURN VALUE | |
| On success, `zx_clock_get()` returns **ZX_OK**. | |
| ## ERRORS | |
| **ZX_ERR_INVALID_ARGS** *clock_id* is not a valid clock id, or *out* is an invalid pointer. | |
| ## ALTERNATIVES {#alternatives} | |
| `zx_clock_get()` has been **deprecated**. Refer to the instructions below on how | |
| to gain access to the timelines which had been accessible via calls to | |
| `zx_clock_get()`. | |
| 1. [`ZX_CLOCK_MONOTONIC`](#alternative-zx-clock-monotonic) | |
| 2. [`ZX_CLOCK_UTC`](#alternative-zx-clock-utc) | |
| 3. [`ZX_CLOCK_THREAD`](#alternative-zx-clock-thread) | |
| ### `ZX_CLOCK_MONOTONIC` {#alternative-zx-clock-monotonic} | |
| `zx_clock_get(ZX_CLOCK_MONOTONIC, out_ptr)` has been replaced with calls to | |
| [`zx_clock_get_monotonic()`](clock_get_monotonic.md). Unlike `zx_clock_get`, | |
| `zx_clock_get_monotonic` is almost always implemented in a way which does not | |
| need an actual syscall (which can provide a performance benefit) and it cannot | |
| ever return an error (which can help to simplify code). For example: | |
| ```C | |
| // Where old code used to say something like | |
| zx_time_t now; | |
| zx_status_t status = zx_clock_get(ZX_CLOCK_MONOTONIC, &now); | |
| if (status != ZX_OK) { | |
| // Handle failure here | |
| } | |
| // It can now simply say the following instead | |
| zx_time_t now = zx_clock_get_monotonic(); | |
| ``` | |
| ### `ZX_CLOCK_UTC` {#alternative-zx-clock-utc} | |
| Supplying a clock which provides an accurate representation of the UTC timeline | |
| is no longer a feature which is provided directly by the kernel. Instead, it | |
| has become the responsibility of the Component Manager to distribute a handle to | |
| a [kernel clock object](../kernel_objects/clock.md) to processes which | |
| are permitted to access UTC. This clock handle (when available) is used by the | |
| various runtimes to implement their version of access to UTC. In addition, some | |
| runtimes may provide direct access to this clock handle allowing the user to get | |
| even more detailed information about the clock. | |
| User who wish to access UTC in their programs should make use of their runtime's | |
| standard UTC APIs, or borrow a handle to the underlying clock object if they | |
| need access to the native clock handle. | |
| Here are a few examples of some of the ways that a user in a C runtime can gain | |
| access to UTC. | |
| ```C | |
| #include <inttypes.h> | |
| #include <zircon/time.h> | |
| // Fetching the clock using gettimeofday | |
| #include <sys/time.h> | |
| { | |
| struct timeval_t now_utc; | |
| int status = gettimeofday(&now_utc, NULL); | |
| if (status == 0) { | |
| zx_time_t nsec = ((zx_time_t)now_utc.tv_sec * ZX_SEC(1)) + | |
| ((zx_time_t)now_utc.tv_usec * ZX_USEC(1)) | |
| printf("It has been " PRId64 " nSec since the epoch.\n", nsec); | |
| } else { | |
| printf("gettimeofday(...) call failed (errno = %d)\n", errno); | |
| } | |
| } | |
| // Fetching the clock using clock_gettime | |
| #include <time.h> | |
| { | |
| struct timespec now_utc; | |
| int status = clock_gettime(CLOCK_REALTIME, &now_utc, NULL); | |
| if (status == 0) { | |
| zx_time_t nsec = ((zx_time_t)now_utc.tv_sec * ZX_SEC(1)) + | |
| ((zx_time_t)now_utc.tv_nsec * ZX_NSEC(1)) | |
| printf("It has been " PRId64 " nSec since the epoch.\n", nsec); | |
| } else { | |
| printf("clock_gettime(...) call failed (errno = %d)\n", errno); | |
| } | |
| } | |
| // Gaining direct access to the process's UTC reference clock object. | |
| #include <zircon/clock.h> | |
| #include <zircon/utc.h> | |
| { | |
| // This is a borrowed handle. Do not close it, and do not replace it using | |
| // zx_utc_reference_swap while using it. | |
| zx_handle_t utc_clock = zx_utc_reference_get(); | |
| if (utc_clock != ZX_HANDLE_INVALID) { | |
| zx_time_t nsec; | |
| zx_status_t status = zx_clock_read(utc_clock, &nsec); | |
| if (status == ZX_OK) { | |
| printf("It has been " PRId64 " nSec since the epoch.\n", nsec); | |
| } else { | |
| printf("zx_clock_read(...) syscall failed (status = %d)\n", status); | |
| } | |
| } else { | |
| printf("Error, our runtime has no clock assigned to it!"); | |
| } | |
| } | |
| ``` | |
| ### `ZX_CLOCK_THREAD` {#alternative-zx-clock-thread} | |
| The `ZX_CLOCK_THREAD` clock was never really a clock at all. Instead it | |
| provided access to value which was a property of a thread object, specifically | |
| the cumulative runtime of the calling thread. | |
| Moving forward, this value can be accessed for any thread using | |
| [`zx_object_get_info()`](object_get_info.md) using the topic | |
| [`ZX_INFO_THREAD_STATS`](object_get_info.md#zx-info-thread-stats). | |
| Users will need to have access to the handle thread they wish to query, and that | |
| handle will need to have `ZX_RIGHT_INSPECT` rights set on it. This is generally | |
| the case for threads in a process which have been created by the user. | |
| Here is an example of how to query this value for the current thread running in | |
| the C/C++ runtime. The specific API for obtaining access to the current | |
| thread handle, or for making a syscall, will vary from language runtime to | |
| language runtime. | |
| ```C | |
| #include <inttypes.h> | |
| #include <threads.h> | |
| #include <zircon/syscalls.h> | |
| #include <zircon/syscalls/object.h> | |
| #include <zircon/threads.h> | |
| void test() { | |
| zx_info_thread_stats_t info; | |
| zx_status_t status; | |
| status = zx_object_get_info(thrd_get_zx_handle(thrd_current()), | |
| ZX_INFO_THREAD_STATS, | |
| &info, sizeof(info), | |
| NULL, NULL); | |
| if (status != ZX_OK) { | |
| printf("Current thread has a runtime of " PRId64 "\n", info.total_runtime); | |
| } else { | |
| printf("Failed to fetch current thread runtime (status %d)\n", status); | |
| } | |
| } | |
| ``` | |
| <!-- References updated by update-docs-from-fidl, do not edit. --> | |
| [`zx_clock_get_monotonic()`]: clock_get_monotonic.md | |
| [`zx_object_get_info()`]: object_get_info.md |