00001
00002
00003 #ifndef OSL_NONBLOCKDELETE_H
00004 #define OSL_NONBLOCKDELETE_H
00005
00006 #include <boost/shared_ptr.hpp>
00007 #include <boost/utility.hpp>
00008
00009 #ifdef USE_BOOST_POOL_ALLOCATOR
00010 # define DISABLE_NON_BLOCK_DELETE
00011 #endif
00012
00013 namespace osl
00014 {
00015 namespace misc
00016 {
00017 class NonBlockDelete : boost::noncopyable
00018 {
00019 public:
00021 template <class T>
00022 static void planDelete(T *ptr)
00023 {
00024 boost::shared_ptr<void> holder(ptr);
00025 resetAny(holder);
00026 }
00027
00031 template <class T>
00032 static void reset(boost::shared_ptr<T>& ptr)
00033 {
00034 #ifndef DISABLE_NON_BLOCK_DELETE
00035 boost::shared_ptr<void> holder;
00036 holder = ptr;
00037 #endif
00038 ptr.reset();
00039 #ifndef DISABLE_NON_BLOCK_DELETE
00040 resetAny(holder);
00041 #endif
00042 }
00043 static void resetAny(boost::shared_ptr<void>&);
00044
00048 static void deleteAll();
00049 static bool deleteOne();
00050 static int waiting();
00051 private:
00052 static NonBlockDelete& instance();
00053
00054 NonBlockDelete();
00055 ~NonBlockDelete();
00056 void push_back(boost::shared_ptr<void>&);
00057
00058 class Queue;
00059 boost::shared_ptr<Queue> queue;
00060
00061 class Runner;
00062 friend class Runner;
00063 };
00064
00065 }
00066 using misc::NonBlockDelete;
00067 }
00068
00069 #endif
00070
00071
00072
00073
00074