lock_map.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __CORE_UTILS_LOCK_MAP_H_
00025 #define __CORE_UTILS_LOCK_MAP_H_
00026
00027 #include <core/threading/mutex.h>
00028 #include <core/utils/refptr.h>
00029 #include <map>
00030
00031 namespace fawkes {
00032
00033
00034 template <typename KeyType,
00035 typename ValueType,
00036 typename LessKey = std::less<KeyType> >
00037 class LockMap : public std::map<KeyType, ValueType, LessKey>
00038 {
00039 public:
00040 LockMap();
00041 LockMap(const LockMap<KeyType, ValueType, LessKey> &lm);
00042 virtual ~LockMap();
00043
00044 void lock();
00045 bool try_lock();
00046 void unlock();
00047 RefPtr<Mutex> mutex() const;
00048
00049 void erase_locked(const KeyType &key);
00050
00051 private:
00052 RefPtr<Mutex> __mutex;
00053
00054 };
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 template <typename KeyType, typename ValueType, typename LessKey>
00070 LockMap<KeyType, ValueType, LessKey>::LockMap()
00071 : __mutex(new Mutex())
00072 {}
00073
00074
00075
00076
00077
00078 template <typename KeyType, typename ValueType, typename LessKey>
00079 LockMap<KeyType, ValueType, LessKey>::LockMap(const LockMap<KeyType, ValueType, LessKey> &lm)
00080 : std::map<KeyType, ValueType, LessKey>::map(lm),
00081 __mutex(new Mutex())
00082 {}
00083
00084
00085
00086 template <typename KeyType, typename ValueType, typename LessKey>
00087 LockMap<KeyType, ValueType, LessKey>::~LockMap()
00088 {}
00089
00090
00091
00092 template <typename KeyType, typename ValueType, typename LessKey>
00093 void
00094 LockMap<KeyType, ValueType, LessKey>::lock()
00095 {
00096 __mutex->lock();
00097 }
00098
00099
00100
00101
00102
00103 template <typename KeyType, typename ValueType, typename LessKey>
00104 bool
00105 LockMap<KeyType, ValueType, LessKey>::try_lock()
00106 {
00107 return __mutex->try_lock();
00108 }
00109
00110
00111
00112 template <typename KeyType, typename ValueType, typename LessKey>
00113 void
00114 LockMap<KeyType, ValueType, LessKey>::unlock()
00115 {
00116 return __mutex->unlock();
00117 }
00118
00119
00120
00121
00122
00123
00124 template <typename KeyType, typename ValueType, typename LessKey>
00125 void
00126 LockMap<KeyType, ValueType, LessKey>::erase_locked(const KeyType &key)
00127 {
00128 __mutex->lock();
00129 std::map<KeyType, ValueType, LessKey>::erase(key);
00130 __mutex->unlock();
00131 }
00132
00133
00134
00135
00136
00137
00138 template <typename KeyType, typename ValueType, typename LessKey>
00139 RefPtr<Mutex>
00140 LockMap<KeyType, ValueType, LessKey>::mutex() const
00141 {
00142 return __mutex;
00143 }
00144
00145
00146 }
00147
00148 #endif