1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef JS_CONCURRENT_MODULE_UTILS_LOCKS_ASYNC_LOCK_MANAGER_H 17 #define JS_CONCURRENT_MODULE_UTILS_LOCKS_ASYNC_LOCK_MANAGER_H 18 19 #include <string> 20 #include <cstdint> 21 #include <unordered_map> 22 23 #include "common.h" 24 #include "async_lock.h" 25 26 namespace Commonlibrary::Concurrent::LocksModule { 27 28 struct AsyncLockIdentity { 29 bool isAnonymous; 30 uint32_t id; 31 std::string name; 32 }; 33 34 struct AsyncLockDependency { 35 tid_t waiterTid; 36 tid_t holderTid; 37 std::string name; 38 std::string creationStacktrace; 39 }; 40 41 class AsyncLockManager { 42 public: 43 static napi_value Init(napi_env env, napi_value exports); 44 static napi_value Constructor(napi_env env, napi_callback_info cbinfo); 45 static napi_value Request(napi_env env, napi_callback_info cbinfo); 46 static void Destructor(napi_env env, void *nativeObject, void *finalize); 47 48 static napi_value LockAsync(napi_env env, napi_callback_info cbinfo); 49 static napi_value Query(napi_env env, napi_callback_info cbinfo); 50 static napi_value QueryAll(napi_env env, napi_callback_info cbinfo); 51 52 static tid_t GetCurrentTid(napi_env env); 53 static void DumpLocksInfoForThread(tid_t targetTid, std::string &result); 54 55 AsyncLockManager() = delete; 56 AsyncLockManager(const AsyncLockManager &) = delete; 57 AsyncLockManager &operator=(const AsyncLockManager &) = delete; 58 AsyncLockManager(AsyncLockManager &&) = delete; 59 AsyncLockManager &operator=(AsyncLockManager &&) = delete; 60 ~AsyncLockManager() = delete; 61 62 private: 63 static napi_value CreateLockStates(napi_env env, const std::function<bool(const AsyncLockIdentity& ident)> &pred); 64 static napi_value CreateLockState(napi_env env, AsyncLock *asyncLock); 65 static void Request(uint32_t id); 66 static void Request(const std::string &name); 67 static AsyncLock *FindAsyncLockUnsafe(AsyncLockIdentity *id); 68 static bool GetLockMode(napi_env env, napi_value val, LockMode &mode); 69 static bool GetLockOptions(napi_env env, napi_value val, LockOptions &options); 70 71 static void CollectLockDependencies(std::vector<AsyncLockDependency> &dependencies); 72 static void CheckDeadlocksAndLogWarning(); 73 74 static std::mutex lockMutex; 75 static std::unordered_map<std::string, AsyncLock *> lockMap; 76 static std::unordered_map<uint32_t, AsyncLock *> anonymousLockMap; 77 static std::atomic<uint32_t> nextId; 78 }; 79 80 } // namespace Commonlibrary::Concurrent::LocksModule 81 82 #endif 83