14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#ifndef JS_CONCURRENT_MODULE_WORKER_MESSAGE_QUEUE_H 174d6c458bSopenharmony_ci#define JS_CONCURRENT_MODULE_WORKER_MESSAGE_QUEUE_H 184d6c458bSopenharmony_ci 194d6c458bSopenharmony_ci#include <mutex> 204d6c458bSopenharmony_ci#include <queue> 214d6c458bSopenharmony_ci#include "napi/native_api.h" 224d6c458bSopenharmony_ci#include "napi/native_node_api.h" 234d6c458bSopenharmony_ci 244d6c458bSopenharmony_cinamespace Commonlibrary::Concurrent::WorkerModule { 254d6c458bSopenharmony_ciusing MessageDataType = void*; 264d6c458bSopenharmony_ciclass MessageQueue final { 274d6c458bSopenharmony_cipublic: 284d6c458bSopenharmony_ci void EnQueue(MessageDataType data); 294d6c458bSopenharmony_ci bool DeQueue(MessageDataType *data); 304d6c458bSopenharmony_ci bool IsEmpty() const; 314d6c458bSopenharmony_ci void Clear(napi_env env); 324d6c458bSopenharmony_ci size_t GetSize() const 334d6c458bSopenharmony_ci { 344d6c458bSopenharmony_ci return queue_.size(); 354d6c458bSopenharmony_ci } 364d6c458bSopenharmony_ci 374d6c458bSopenharmony_ciprivate: 384d6c458bSopenharmony_ci std::mutex queueLock_; 394d6c458bSopenharmony_ci std::queue<MessageDataType> queue_; 404d6c458bSopenharmony_ci}; 414d6c458bSopenharmony_ci 424d6c458bSopenharmony_ciclass MarkedMessageQueue final { 434d6c458bSopenharmony_cipublic: 444d6c458bSopenharmony_ci void Push(uint32_t id, MessageDataType data); 454d6c458bSopenharmony_ci void Pop(); 464d6c458bSopenharmony_ci std::pair<uint32_t, MessageDataType> Front(); 474d6c458bSopenharmony_ci bool IsEmpty(); 484d6c458bSopenharmony_ci void Clear(napi_env env); 494d6c458bSopenharmony_ci size_t GetSize() 504d6c458bSopenharmony_ci { 514d6c458bSopenharmony_ci std::unique_lock<std::mutex> lock(queueLock_); 524d6c458bSopenharmony_ci return queue_.size(); 534d6c458bSopenharmony_ci } 544d6c458bSopenharmony_ci 554d6c458bSopenharmony_ciprivate: 564d6c458bSopenharmony_ci std::mutex queueLock_; 574d6c458bSopenharmony_ci std::queue<std::pair<uint32_t, MessageDataType>> queue_; 584d6c458bSopenharmony_ci}; 594d6c458bSopenharmony_ci} // namespace Commonlibrary::Concurrent::WorkerModule 604d6c458bSopenharmony_ci#endif // JS_CONCURRENT_MODULE_WORKER_MESSAGE_QUEUE_H 61