1 /* 2 * Copyright (c) 2022 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 #ifndef ATOMIC_MAP_H 16 #define ATOMIC_MAP_H 17 18 #include <atomic> 19 #include <map> 20 #include "nocopyable.h" 21 22 namespace OHOS { 23 namespace Rosen { 24 template<class Key, class Value> 25 class AtomicMap { 26 public: insert(const std::pair<Key,Value> & kv)27 void insert(const std::pair<Key, Value>& kv) 28 { 29 locked(); 30 data_.insert(kv); 31 unlocked(); 32 } 33 erase(const Key & key)34 void erase(const Key& key) 35 { 36 locked(); 37 data_.erase(key); 38 unlocked(); 39 } 40 find(Key k)41 auto find(Key k) 42 { 43 locked(); 44 auto key = data_.find(k); 45 unlocked(); 46 return key; 47 } 48 count(Key k)49 int count(Key k) 50 { 51 locked(); 52 int size = data_.count(k); 53 unlocked(); 54 return size; 55 } 56 isExistAndRemove(Key k,uint32_t value)57 bool isExistAndRemove(Key k, uint32_t value) 58 { 59 locked(); 60 if (data_.count(k) <= 0) { 61 unlocked(); 62 return false; 63 } 64 if (data_[k] == value) { 65 data_.erase(k); 66 unlocked(); 67 return true; 68 } 69 unlocked(); 70 return false; 71 } 72 isExist(Key k,uint32_t value)73 bool isExist(Key k, uint32_t value) 74 { 75 locked(); 76 if (data_.count(k) <= 0) { 77 unlocked(); 78 return false; 79 } 80 if (data_[k] == value) { 81 unlocked(); 82 return true; 83 } 84 unlocked(); 85 return false; 86 } 87 private: locked()88 void locked() 89 { 90 bool expect = false; 91 while (!isWritingOrReading_.compare_exchange_weak(expect, true, std::memory_order_relaxed)) { 92 expect = false; 93 } 94 } 95 unlocked()96 void unlocked() 97 { 98 isWritingOrReading_.store(false); 99 } 100 101 std::map<Key, Value> data_; 102 std::atomic<bool> isWritingOrReading_ { false }; 103 }; 104 } // Rosen 105 } // OHOS 106 #endif // ATOMIC_MAP_H