1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#ifndef HISTREAMER_FOUNDATION_OSAL_THREAD_H 17fa7767c5Sopenharmony_ci#define HISTREAMER_FOUNDATION_OSAL_THREAD_H 18fa7767c5Sopenharmony_ci 19fa7767c5Sopenharmony_ci#include <functional> 20fa7767c5Sopenharmony_ci#include <memory> // NOLINT 21fa7767c5Sopenharmony_ci#include <pthread.h> 22fa7767c5Sopenharmony_ci#include <string> 23fa7767c5Sopenharmony_ci#include "osal/task/mutex.h" 24fa7767c5Sopenharmony_ci 25fa7767c5Sopenharmony_cinamespace OHOS { 26fa7767c5Sopenharmony_cinamespace Media { 27fa7767c5Sopenharmony_cienum class ThreadPriority : int { 28fa7767c5Sopenharmony_ci LOW = 9, 29fa7767c5Sopenharmony_ci NORMAL = 16, 30fa7767c5Sopenharmony_ci MIDDLE = 24, 31fa7767c5Sopenharmony_ci HIGH = 32, 32fa7767c5Sopenharmony_ci HIGHEST = 39, 33fa7767c5Sopenharmony_ci}; 34fa7767c5Sopenharmony_ci 35fa7767c5Sopenharmony_ciclass Thread { 36fa7767c5Sopenharmony_cipublic: 37fa7767c5Sopenharmony_ci explicit Thread(ThreadPriority priority = ThreadPriority::HIGH) noexcept; 38fa7767c5Sopenharmony_ci 39fa7767c5Sopenharmony_ci Thread(const Thread&) = delete; 40fa7767c5Sopenharmony_ci 41fa7767c5Sopenharmony_ci Thread& operator=(const Thread&) = delete; 42fa7767c5Sopenharmony_ci 43fa7767c5Sopenharmony_ci Thread(Thread&& other) noexcept; 44fa7767c5Sopenharmony_ci 45fa7767c5Sopenharmony_ci Thread& operator=(Thread&& other) noexcept; 46fa7767c5Sopenharmony_ci 47fa7767c5Sopenharmony_ci virtual ~Thread() noexcept; 48fa7767c5Sopenharmony_ci 49fa7767c5Sopenharmony_ci bool HasThread() const noexcept; 50fa7767c5Sopenharmony_ci 51fa7767c5Sopenharmony_ci void SetName(const std::string& name); 52fa7767c5Sopenharmony_ci 53fa7767c5Sopenharmony_ci bool CreateThread(const std::function<void()>& func); 54fa7767c5Sopenharmony_ci 55fa7767c5Sopenharmony_ci bool IsRunningInSelf(); 56fa7767c5Sopenharmony_ci 57fa7767c5Sopenharmony_ciprivate: 58fa7767c5Sopenharmony_ci struct State { 59fa7767c5Sopenharmony_ci virtual ~State() = default; 60fa7767c5Sopenharmony_ci std::function<void()> func{}; 61fa7767c5Sopenharmony_ci std::string name; 62fa7767c5Sopenharmony_ci }; 63fa7767c5Sopenharmony_ci 64fa7767c5Sopenharmony_ci void SetNameInternal(); 65fa7767c5Sopenharmony_ci static void* Run(void* arg); // NOLINT: void* 66fa7767c5Sopenharmony_ci 67fa7767c5Sopenharmony_ci pthread_t id_{}; 68fa7767c5Sopenharmony_ci std::string name_; 69fa7767c5Sopenharmony_ci ThreadPriority priority_; 70fa7767c5Sopenharmony_ci std::unique_ptr<State> state_{}; 71fa7767c5Sopenharmony_ci mutable Mutex mutex_{}; 72fa7767c5Sopenharmony_ci std::atomic<bool> isExistThread_{false}; 73fa7767c5Sopenharmony_ci}; 74fa7767c5Sopenharmony_ci} // namespace Media 75fa7767c5Sopenharmony_ci} // namespace OHOS 76fa7767c5Sopenharmony_ci#endif // HISTREAMER_FOUNDATION_OSAL_THREAD_H 77