Skip to content

Commit d94bf13

Browse files
committed
Merge branch 'master' into release/6.0.0
2 parents 803c4aa + fc15ce9 commit d94bf13

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

include/robotkernel/rk_type.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,28 @@ class rk_type {
4949

5050
std::type_index __type; //!< data type for type conversions
5151
uint8_t *__value; //!< data storage pointer
52+
std::function<void(void*)> __value_deleter;
5253

5354
void decrease_reference(uint8_t *ref) {
5455
if (!ref) {
5556
return;
5657
}
5758

58-
std::unique_lock<std::mutex> lock(__refsLock);
59+
{
60+
std::unique_lock<std::mutex> lock(__refsLock);
61+
62+
reference_map_t::iterator r = __refs.find(ref);
63+
if (r == __refs.end())
64+
return; // should not happen!
5965

60-
if (__refs[ref] <= 1) {
66+
if (r->second > 1) {
67+
r->second --;
68+
return;
69+
}
6170
__refs.erase(ref);
62-
delete ref;
63-
} else {
64-
__refs[ref] = __refs[ref] - 1;
6571
}
72+
// need to do this without lock held!
73+
__value_deleter(ref);
6674
}
6775

6876
void increase_reference(uint8_t *ref) {
@@ -116,6 +124,7 @@ class rk_type {
116124
template<typename T>
117125
rk_type(const T &value) : __type(typeid(T)), __value(NULL) {
118126
set_value((uint8_t *) new T);
127+
__value_deleter = [](void* p) { delete static_cast<T*>(p); };
119128
*((T *) __value) = value;
120129
}
121130

@@ -125,6 +134,7 @@ class rk_type {
125134
*/
126135
rk_type(const rk_type &obj) : __type(obj.__type), __value(NULL) {
127136
set_value(obj.__value);
137+
__value_deleter = obj.__value_deleter;
128138
}
129139

130140
//! assign operator
@@ -133,6 +143,7 @@ class rk_type {
133143
*/
134144
rk_type &operator=(rk_type rhs) {
135145
set_value(rhs.__value);
146+
__value_deleter = rhs.__value_deleter;
136147
__type = rhs.__type;
137148
return *this;
138149
}

0 commit comments

Comments
 (0)