nonBlockDelete.h
Go to the documentation of this file.
00001 /* nonBlockDelete.h
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); // shared_ptr preserves T
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       struct Runner;
00062       friend struct Runner;
00063     };
00064     
00065   }
00066   using misc::NonBlockDelete;
00067 }
00068 
00069 #endif /* OSL_NONBLOCKDELETE_H */
00070 // ;;; Local Variables:
00071 // ;;; mode:c++
00072 // ;;; c-basic-offset:2
00073 // ;;; coding:utf-8
00074 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines