blob: 3917cdf54826c11479f52ccf21b28358aaa830e8 [file] [log] [blame]
// Copyright 2018 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.
#ifndef SYSROOT_ZIRCON_THREADS_H_
#define SYSROOT_ZIRCON_THREADS_H_
#include <threads.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
__BEGIN_CDECLS
// Get the zx_handle_t corresponding to the thrd_t. This handle is still owned by the C11 thread,
// and will not persist after the thread exits. Callers must duplicate the handle, therefore, if
// they wish the thread handle to outlive the execution of the C11 thread.
zx_handle_t thrd_get_zx_handle(thrd_t t);
// Converts a threads.h-style status value to an |zx_status_t|.
static inline zx_status_t __PURE thrd_status_to_zx_status(int thrd_status) {
switch (thrd_status) {
case thrd_success:
return ZX_OK;
case thrd_nomem:
return ZX_ERR_NO_MEMORY;
case thrd_timedout:
return ZX_ERR_TIMED_OUT;
case thrd_busy:
return ZX_ERR_SHOULD_WAIT;
default:
case thrd_error:
return ZX_ERR_INTERNAL;
}
}
__END_CDECLS
#ifdef __cplusplus
#if __has_include(<thread>)
#include <thread>
// Get the zx_handle_t corresponding to the std::thread::native_handle() value.
// See `thrd_get_zx_handle` (above) for constraints on the returned handle.
// Using this API avoids any assumptions about std::thread::native_handle_type
// corresponding exactly to thrd_t or any other particular type.
zx_handle_t native_thread_get_zx_handle(std::thread::native_handle_type);
#endif // __has_include(<thread>)
#endif // __cplusplus
#endif // SYSROOT_ZIRCON_THREADS_H_