| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <zircon/syscalls.h> |
| #include <zircon/utc.h> |
| |
| #include <atomic> |
| |
| static std::atomic<zx_handle_t> g_zx_utc_reference_handle{ZX_HANDLE_INVALID}; |
| |
| __EXPORT |
| zx_handle_t _zx_utc_reference_get(void) { return g_zx_utc_reference_handle.load(); } |
| |
| __EXPORT decltype(zx_utc_reference_get) zx_utc_reference_get |
| __attribute__((weak, alias("_zx_utc_reference_get"))); |
| |
| __EXPORT |
| zx_status_t _zx_utc_reference_swap(zx_handle_t new_utc_reference, |
| zx_handle_t* prev_utc_reference_out) { |
| // If the user is not disabling the UTC clock entirely, validate the handle |
| // that they gave to us before proceeding. |
| if (new_utc_reference != ZX_HANDLE_INVALID) { |
| zx_time_t new_clock_now; |
| zx_status_t res = _zx_clock_read(new_utc_reference, &new_clock_now); |
| |
| if (res != ZX_OK) { |
| _zx_handle_close(new_utc_reference); |
| return res; |
| } |
| } |
| |
| // Things check out. Go ahead and swap the clocks. |
| *prev_utc_reference_out = g_zx_utc_reference_handle.exchange(new_utc_reference); |
| return ZX_OK; |
| } |
| |
| __EXPORT decltype(zx_utc_reference_swap) zx_utc_reference_swap |
| __attribute__((weak, alias("_zx_utc_reference_swap"))); |