+ // Black box objects have a special deleter
+ // which must take care of releasing the descriptor
+ // **AFTER** the box is deleted
+ // (Releasing it in the destructor may cause dl close and crash)
+ /// Black box deleter
+ /// 1) Calls the user overloadable bbDelete method
+ /// 2) Releases the box descriptor
+ struct Deleter : public Object::Deleter
+ {
+ Deleter();
+ void Delete(Object* p);
+ };
+
+ template <class U>
+ static boost::shared_ptr<U> MakeBlackBoxPointer(U* s, bool lock = false)
+ {
+ return MakePointer(s,BlackBox::Deleter(),lock);
+ }
+
+ virtual void bbDelete() { delete this; }