@@ -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