1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2024 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#ifndef RECORD_MUTEX_H 17484543d1Sopenharmony_ci#define RECORD_MUTEX_H 18484543d1Sopenharmony_ci 19484543d1Sopenharmony_ci#include <sys/types.h> 20484543d1Sopenharmony_ci#include <chrono> 21484543d1Sopenharmony_ci#include <cstdint> 22484543d1Sopenharmony_ci#include <securec.h> 23484543d1Sopenharmony_ci#include "cpp/mutex.h" 24484543d1Sopenharmony_ci 25484543d1Sopenharmony_cinamespace ffrt { 26484543d1Sopenharmony_cienum class MutexOwnerType { 27484543d1Sopenharmony_ci MUTEX_OWNER_TYPE_TASK, 28484543d1Sopenharmony_ci MUTEX_OWNER_TYPE_THREAD, 29484543d1Sopenharmony_ci}; 30484543d1Sopenharmony_ci 31484543d1Sopenharmony_cistruct MutexOwner { 32484543d1Sopenharmony_ci uint64_t id; // 持锁task的id或者持锁线程的id 33484543d1Sopenharmony_ci MutexOwnerType type; 34484543d1Sopenharmony_ci std::chrono::steady_clock::time_point timestamp; 35484543d1Sopenharmony_ci}; 36484543d1Sopenharmony_ci 37484543d1Sopenharmony_ciclass RecordMutex { 38484543d1Sopenharmony_cipublic: 39484543d1Sopenharmony_ci void lock() 40484543d1Sopenharmony_ci { 41484543d1Sopenharmony_ci mutex_.lock(); 42484543d1Sopenharmony_ci LoadInfo(); 43484543d1Sopenharmony_ci } 44484543d1Sopenharmony_ci 45484543d1Sopenharmony_ci void unlock() 46484543d1Sopenharmony_ci { 47484543d1Sopenharmony_ci ClearInfo(); 48484543d1Sopenharmony_ci mutex_.unlock(); 49484543d1Sopenharmony_ci } 50484543d1Sopenharmony_ci 51484543d1Sopenharmony_ci mutex* GetMutex() 52484543d1Sopenharmony_ci { 53484543d1Sopenharmony_ci return &mutex_; 54484543d1Sopenharmony_ci } 55484543d1Sopenharmony_ci 56484543d1Sopenharmony_ci bool HasLock() 57484543d1Sopenharmony_ci { 58484543d1Sopenharmony_ci return owner_.id != 0; 59484543d1Sopenharmony_ci } 60484543d1Sopenharmony_ci 61484543d1Sopenharmony_ci bool IsTimeout(); 62484543d1Sopenharmony_ci 63484543d1Sopenharmony_ci uint64_t GetOwnerId() 64484543d1Sopenharmony_ci { 65484543d1Sopenharmony_ci return owner_.id; 66484543d1Sopenharmony_ci } 67484543d1Sopenharmony_ci 68484543d1Sopenharmony_ci MutexOwnerType GetOwnerType() 69484543d1Sopenharmony_ci { 70484543d1Sopenharmony_ci return owner_.type; 71484543d1Sopenharmony_ci } 72484543d1Sopenharmony_ci 73484543d1Sopenharmony_ci uint64_t GetDuration(); 74484543d1Sopenharmony_ci 75484543d1Sopenharmony_ciprivate: 76484543d1Sopenharmony_ci void LoadInfo(); 77484543d1Sopenharmony_ci 78484543d1Sopenharmony_ci void ClearInfo() 79484543d1Sopenharmony_ci { 80484543d1Sopenharmony_ci owner_.id = 0; 81484543d1Sopenharmony_ci } 82484543d1Sopenharmony_ci 83484543d1Sopenharmony_ci ffrt::mutex mutex_; 84484543d1Sopenharmony_ci MutexOwner owner_ = { 0 }; 85484543d1Sopenharmony_ci}; 86484543d1Sopenharmony_ci} // namespace ffrt 87484543d1Sopenharmony_ci 88484543d1Sopenharmony_ci#endif