10485dae0Sopenharmony_ci/* 20485dae0Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 30485dae0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40485dae0Sopenharmony_ci * you may not use this file except in compliance with the License. 50485dae0Sopenharmony_ci * You may obtain a copy of the License at 60485dae0Sopenharmony_ci * 70485dae0Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80485dae0Sopenharmony_ci * 90485dae0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100485dae0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110485dae0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120485dae0Sopenharmony_ci * See the License for the specific language governing permissions and 130485dae0Sopenharmony_ci * limitations under the License. 140485dae0Sopenharmony_ci */ 150485dae0Sopenharmony_ci 160485dae0Sopenharmony_ci#ifndef QUEUE_H 170485dae0Sopenharmony_ci#define QUEUE_H 180485dae0Sopenharmony_ci 190485dae0Sopenharmony_ci#include <atomic> 200485dae0Sopenharmony_ci 210485dae0Sopenharmony_ci#include "protocol/retcode_inner/aie_retcode_inner.h" 220485dae0Sopenharmony_ci#include "utils/aie_macros.h" 230485dae0Sopenharmony_ci 240485dae0Sopenharmony_cinamespace OHOS { 250485dae0Sopenharmony_cinamespace AI { 260485dae0Sopenharmony_citemplate<class TYPE> 270485dae0Sopenharmony_ciclass Queue { 280485dae0Sopenharmony_ci FORBID_COPY_AND_ASSIGN(Queue); 290485dae0Sopenharmony_cipublic: 300485dae0Sopenharmony_ci explicit Queue(size_t maxQueueSize); 310485dae0Sopenharmony_ci 320485dae0Sopenharmony_ci virtual ~Queue(); 330485dae0Sopenharmony_ci 340485dae0Sopenharmony_cipublic: 350485dae0Sopenharmony_ci /** 360485dae0Sopenharmony_ci * Check if the queue is empty. 370485dae0Sopenharmony_ci * 380485dae0Sopenharmony_ci * @return true if empty or false if not empty. 390485dae0Sopenharmony_ci */ 400485dae0Sopenharmony_ci bool IsEmpty() const; 410485dae0Sopenharmony_ci 420485dae0Sopenharmony_ci /** 430485dae0Sopenharmony_ci * Check if the queue is full. 440485dae0Sopenharmony_ci * 450485dae0Sopenharmony_ci * @return true if full or false if not full. 460485dae0Sopenharmony_ci */ 470485dae0Sopenharmony_ci bool IsFull() const; 480485dae0Sopenharmony_ci 490485dae0Sopenharmony_ci /** 500485dae0Sopenharmony_ci * Push a message at the rear. 510485dae0Sopenharmony_ci * 520485dae0Sopenharmony_ci * @param [in] msgBlock message to push. 530485dae0Sopenharmony_ci * @return 1011 if the queue is full or 0 if success. 540485dae0Sopenharmony_ci */ 550485dae0Sopenharmony_ci int PushBack(TYPE &msgBlock); 560485dae0Sopenharmony_ci 570485dae0Sopenharmony_ci /** 580485dae0Sopenharmony_ci * Pop a message from the head. 590485dae0Sopenharmony_ci * 600485dae0Sopenharmony_ci * @param [out] msgBlock message from the head. 610485dae0Sopenharmony_ci * @return 1012 if the queue is empty or 0 if success. 620485dae0Sopenharmony_ci */ 630485dae0Sopenharmony_ci int PopFront(TYPE &msgBlock); 640485dae0Sopenharmony_ci 650485dae0Sopenharmony_ci /** 660485dae0Sopenharmony_ci * Query the number of elements in the queue. 670485dae0Sopenharmony_ci * 680485dae0Sopenharmony_ci * @return the number of elements in the queue. 690485dae0Sopenharmony_ci */ 700485dae0Sopenharmony_ci size_t Count() const; 710485dae0Sopenharmony_ci 720485dae0Sopenharmony_ci /** 730485dae0Sopenharmony_ci * Reset the queue. 740485dae0Sopenharmony_ci */ 750485dae0Sopenharmony_ci void Reset(); 760485dae0Sopenharmony_ci 770485dae0Sopenharmony_ciprivate: 780485dae0Sopenharmony_ci /** 790485dae0Sopenharmony_ci * Next position to push elements to. 800485dae0Sopenharmony_ci */ 810485dae0Sopenharmony_ci std::atomic<size_t> pushPos_; 820485dae0Sopenharmony_ci 830485dae0Sopenharmony_ci /** 840485dae0Sopenharmony_ci * Next position to pop message from. 850485dae0Sopenharmony_ci */ 860485dae0Sopenharmony_ci std::atomic<size_t> popPos_; 870485dae0Sopenharmony_ci 880485dae0Sopenharmony_ci /** 890485dae0Sopenharmony_ci * Maximum message of the queue. 900485dae0Sopenharmony_ci */ 910485dae0Sopenharmony_ci size_t totalNum_; 920485dae0Sopenharmony_ci 930485dae0Sopenharmony_ci /** 940485dae0Sopenharmony_ci * Writable message number. 950485dae0Sopenharmony_ci */ 960485dae0Sopenharmony_ci std::atomic<size_t> writeAbleCount_; 970485dae0Sopenharmony_ci 980485dae0Sopenharmony_ci /** 990485dae0Sopenharmony_ci * Readable message number. 1000485dae0Sopenharmony_ci */ 1010485dae0Sopenharmony_ci std::atomic<size_t> readAbleCount_; 1020485dae0Sopenharmony_ci 1030485dae0Sopenharmony_ci struct QueueNode { 1040485dae0Sopenharmony_ci bool empty = true; 1050485dae0Sopenharmony_ci TYPE node; 1060485dae0Sopenharmony_ci }; 1070485dae0Sopenharmony_ci 1080485dae0Sopenharmony_ci QueueNode *queue_; 1090485dae0Sopenharmony_ci}; 1100485dae0Sopenharmony_ci} // namespace AI 1110485dae0Sopenharmony_ci} // namespace OHOS 1120485dae0Sopenharmony_ci 1130485dae0Sopenharmony_ci#include "platform/queuepool/queue.inl" 1140485dae0Sopenharmony_ci 1150485dae0Sopenharmony_ci#endif // QUEUE_H