1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2023 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 FFRT_SPMC_QUEUE_H 17484543d1Sopenharmony_ci#define FFRT_SPMC_QUEUE_H 18484543d1Sopenharmony_ci 19484543d1Sopenharmony_ci#include <atomic> 20484543d1Sopenharmony_ci 21484543d1Sopenharmony_cinamespace ffrt { 22484543d1Sopenharmony_ciclass SpmcQueue { 23484543d1Sopenharmony_cipublic: 24484543d1Sopenharmony_ci ~SpmcQueue(); 25484543d1Sopenharmony_ci 26484543d1Sopenharmony_ci unsigned int GetLength() const; 27484543d1Sopenharmony_ci unsigned int GetCapacity() const; 28484543d1Sopenharmony_ci 29484543d1Sopenharmony_ci /** 30484543d1Sopenharmony_ci * @brief 初始化队列。 31484543d1Sopenharmony_ci * @param capacity 队列容量。 32484543d1Sopenharmony_ci * @retval 成功返回0,失败返回-1。 33484543d1Sopenharmony_ci */ 34484543d1Sopenharmony_ci int Init(unsigned int capacity); 35484543d1Sopenharmony_ci 36484543d1Sopenharmony_ci /** 37484543d1Sopenharmony_ci * @brief 取出队列首部元素。 38484543d1Sopenharmony_ci * @retval 指向首部元素的指针,若队列为空则返回nullptr。 39484543d1Sopenharmony_ci */ 40484543d1Sopenharmony_ci void* PopHead(); 41484543d1Sopenharmony_ci 42484543d1Sopenharmony_ci /** 43484543d1Sopenharmony_ci * @brief 将元素推入队列尾部。 44484543d1Sopenharmony_ci * @param object 要推入队列的元素。 45484543d1Sopenharmony_ci * @retval 成功返回0,失败返回-1。 46484543d1Sopenharmony_ci */ 47484543d1Sopenharmony_ci int PushTail(void* object); 48484543d1Sopenharmony_ci 49484543d1Sopenharmony_ci /** 50484543d1Sopenharmony_ci * @brief 查找特定元素。 51484543d1Sopenharmony_ci * @param target 目标元素。 52484543d1Sopenharmony_ci * @retval 成功返回true,失败返回false。 53484543d1Sopenharmony_ci */ 54484543d1Sopenharmony_ci bool FindElement(void* target); 55484543d1Sopenharmony_ci 56484543d1Sopenharmony_ci /** 57484543d1Sopenharmony_ci * @brief 从队列首部批量取出元素后将元素批量推入目标队列尾部。 58484543d1Sopenharmony_ci * @param dstQueue 目标队列。 59484543d1Sopenharmony_ci * @param elementNum 取出元素数量。 60484543d1Sopenharmony_ci * @param qos 全局队列qos等级。 61484543d1Sopenharmony_ci * @param func 元素入队操作。 62484543d1Sopenharmony_ci * @retval 返回被推入队列尾部的元素数量。 63484543d1Sopenharmony_ci */ 64484543d1Sopenharmony_ci using PushFunc = void(*)(void*, int); 65484543d1Sopenharmony_ci unsigned int PopHeadToAnotherQueue(SpmcQueue& dstQueue, unsigned int elementNum, int qos, PushFunc func); 66484543d1Sopenharmony_ci 67484543d1Sopenharmony_ciprivate: 68484543d1Sopenharmony_ci void** buf_ = nullptr; 69484543d1Sopenharmony_ci unsigned int capacity_ = 0; 70484543d1Sopenharmony_ci std::atomic<unsigned int> head_ {0}; 71484543d1Sopenharmony_ci std::atomic<unsigned int> tail_ {0}; 72484543d1Sopenharmony_ci}; 73484543d1Sopenharmony_ci} 74484543d1Sopenharmony_ci#endif