1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci/**
17484543d1Sopenharmony_ci * @file sleep.h
18484543d1Sopenharmony_ci *
19484543d1Sopenharmony_ci * @brief Declares the sleep and yield interfaces in C++.
20484543d1Sopenharmony_ci *
21484543d1Sopenharmony_ci * @since 10
22484543d1Sopenharmony_ci * @version 1.0
23484543d1Sopenharmony_ci */
24484543d1Sopenharmony_ci#ifndef FFRT_API_CPP_SLEEP_H
25484543d1Sopenharmony_ci#define FFRT_API_CPP_SLEEP_H
26484543d1Sopenharmony_ci#include <chrono>
27484543d1Sopenharmony_ci#include "c/sleep.h"
28484543d1Sopenharmony_ci
29484543d1Sopenharmony_cinamespace ffrt {
30484543d1Sopenharmony_cinamespace this_task {
31484543d1Sopenharmony_cistatic inline void yield()
32484543d1Sopenharmony_ci{
33484543d1Sopenharmony_ci    ffrt_yield();
34484543d1Sopenharmony_ci}
35484543d1Sopenharmony_ci
36484543d1Sopenharmony_citemplate <class _Rep, class _Period>
37484543d1Sopenharmony_ciinline void sleep_for(const std::chrono::duration<_Rep, _Period>& d)
38484543d1Sopenharmony_ci{
39484543d1Sopenharmony_ci    ffrt_usleep(std::chrono::duration_cast<std::chrono::microseconds>(d).count());
40484543d1Sopenharmony_ci}
41484543d1Sopenharmony_ci
42484543d1Sopenharmony_citemplate<class _Clock, class _Duration>
43484543d1Sopenharmony_ciinline void sleep_until(
44484543d1Sopenharmony_ci    const std::chrono::time_point<_Clock, _Duration>& abs_time)
45484543d1Sopenharmony_ci{
46484543d1Sopenharmony_ci    sleep_for(abs_time.time_since_epoch() - _Clock::now().time_since_epoch());
47484543d1Sopenharmony_ci}
48484543d1Sopenharmony_ci} // namespace this_task
49484543d1Sopenharmony_ci} // namespace ffrt
50484543d1Sopenharmony_ci#endif
51