1484543d1Sopenharmony_ci 2484543d1Sopenharmony_ci 3484543d1Sopenharmony_ci/* 4484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 5484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 6484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 7484543d1Sopenharmony_ci * You may obtain a copy of the License at 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 10484543d1Sopenharmony_ci * 11484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 12484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 13484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 15484543d1Sopenharmony_ci * limitations under the License. 16484543d1Sopenharmony_ci */ 17484543d1Sopenharmony_ci 18484543d1Sopenharmony_ci#ifndef UTIL_TASK_DELETER_HPP 19484543d1Sopenharmony_ci#define UTIL_TASK_DELETER_HPP 20484543d1Sopenharmony_ci 21484543d1Sopenharmony_ci#include <atomic> 22484543d1Sopenharmony_ci#include "internal_inc/non_copyable.h" 23484543d1Sopenharmony_ci#include "sched/execute_ctx.h" 24484543d1Sopenharmony_ci 25484543d1Sopenharmony_cinamespace ffrt { 26484543d1Sopenharmony_ciclass TaskDeleter : private NonCopyable { 27484543d1Sopenharmony_cipublic: 28484543d1Sopenharmony_ci TaskDeleter() {}; 29484543d1Sopenharmony_ci virtual ~TaskDeleter() {} 30484543d1Sopenharmony_ci virtual void FreeMem() = 0; 31484543d1Sopenharmony_ci 32484543d1Sopenharmony_ci inline uint32_t IncDeleteRef() 33484543d1Sopenharmony_ci { 34484543d1Sopenharmony_ci auto v = rc.fetch_add(1); 35484543d1Sopenharmony_ci return v; 36484543d1Sopenharmony_ci } 37484543d1Sopenharmony_ci 38484543d1Sopenharmony_ci inline uint32_t DecDeleteRef() 39484543d1Sopenharmony_ci { 40484543d1Sopenharmony_ci auto v = rc.fetch_sub(1); 41484543d1Sopenharmony_ci if (v == 1) { 42484543d1Sopenharmony_ci FreeMem(); 43484543d1Sopenharmony_ci } 44484543d1Sopenharmony_ci return v; 45484543d1Sopenharmony_ci } 46484543d1Sopenharmony_ci std::atomic_uint32_t rc = 1; 47484543d1Sopenharmony_ci}; 48484543d1Sopenharmony_ci} // namespace ffrt 49484543d1Sopenharmony_ci 50484543d1Sopenharmony_ci#endif // UTIL_TASK_DELETER_HPP 51