00001
00002
00003 #ifndef _NONBLOCKDELETE_H
00004 #define _NONBLOCKDELETE_H
00005
00006 #include <boost/shared_ptr.hpp>
00007 #include <boost/utility.hpp>
00008 namespace osl
00009 {
00010 namespace misc
00011 {
00012 class NonBlockDelete : boost::noncopyable
00013 {
00014 public:
00016 template <class T>
00017 static void planDelete(T *ptr)
00018 {
00019 boost::shared_ptr<void> holder(ptr);
00020 resetAny(holder);
00021 }
00022
00026 template <class T>
00027 static void reset(boost::shared_ptr<T>& ptr)
00028 {
00029 boost::shared_ptr<void> holder;
00030 holder = ptr;
00031 ptr.reset();
00032 resetAny(holder);
00033 }
00034 static void resetAny(boost::shared_ptr<void>&);
00035
00040 static void deleteAll();
00041 static int waiting();
00042 private:
00043 static NonBlockDelete& instance();
00044
00045 NonBlockDelete();
00046 ~NonBlockDelete();
00047 void push_back(boost::shared_ptr<void>&);
00048
00049 class Queue;
00050 boost::shared_ptr<Queue> queue;
00051
00052 class Runner;
00053 friend class Runner;
00054 };
00055
00056 }
00057 using misc::NonBlockDelete;
00058 }
00059
00060 #endif
00061
00062
00063
00064