00001 /* checkmateSearcherHolder.tcc 00002 */ 00003 #ifndef OSL_CHECKMATESEARCHERHOLDER_TCC 00004 #define OSL_CHECKMATESEARCHERHOLDER_TCC 00005 00006 #include "osl/search/checkmateSearcherHolder.h" 00007 #include "osl/search/parallelSearch.h" 00008 #include <boost/thread/mutex.hpp> 00009 #include <boost/shared_ptr.hpp> 00010 #include <deque> 00011 #include <iostream> 00012 00013 template <class Checkmate> 00014 struct osl::search::CheckmateSearcherHolder<Checkmate>::Table 00015 : public std::deque<boost::shared_ptr<Checkmate> > 00016 { 00017 typedef boost::shared_ptr<Checkmate> element_t; 00018 typedef std::deque<element_t> base_t; 00019 typedef boost::mutex Mutex; 00020 mutable Mutex mutex; 00021 const Checkmate *seed; 00022 00023 explicit Table(const Checkmate& seed) 00024 : base_t(parallelSearch.numCpus()*8), seed(&seed) 00025 { 00026 } 00027 using base_t::size; 00028 using base_t::operator[]; 00029 boost::shared_ptr<Checkmate> clone(const Worker *key) 00030 { 00031 if (key->threadId() >= size()) 00032 { 00033 Mutex::scoped_lock lk(mutex); 00034 do 00035 { 00036 base_t::push_back(element_t()); 00037 } while (key->threadId() >= size()); 00038 } 00039 element_t& result = operator[](key->threadId()); 00040 if (! result) { 00041 result.reset(new Checkmate(*seed)); 00042 } 00043 return result; 00044 } 00045 void clear() 00046 { 00047 Mutex::scoped_lock lk(mutex); 00048 // ̥åɹԤɤ 00049 base_t::clear(); 00050 } 00051 size_t totalNodeCount() const 00052 { 00053 size_t result = seed->totalNodeCount(); 00054 Mutex::scoped_lock lk(mutex); 00055 for (size_t i=0; i<size(); ++i) { 00056 const element_t& checkmate = operator[](i); 00057 if (checkmate) 00058 result += checkmate->totalNodeCount(); 00059 } 00060 return result; 00061 } 00062 void dumpUseCount() 00063 { 00064 std::cerr << " holders " << size() << "\n"; 00065 Mutex::scoped_lock lk(mutex); 00066 for (size_t i=0; i<size(); ++i) { 00067 element_t& checkmate = operator[](i); 00068 if (checkmate) { 00069 std::cerr << " holder " << i << "/" << size() << " " << checkmate.use_count() << "\n"; 00070 checkmate.reset(); 00071 } 00072 } 00073 } 00074 }; 00075 00076 template <class Checkmate> 00077 osl::search::CheckmateSearcherHolder<Checkmate>:: 00078 CheckmateSearcherHolder(const Checkmate& seed) 00079 : table(new Table(seed)) 00080 { 00081 } 00082 00083 template <class Checkmate> 00084 osl::search::CheckmateSearcherHolder<Checkmate>:: 00085 ~CheckmateSearcherHolder() 00086 { 00087 } 00088 00089 template <class Checkmate> 00090 Checkmate * 00091 osl::search::CheckmateSearcherHolder<Checkmate>:: 00092 clone(const Worker *key) 00093 { 00094 return table->clone(key).get(); 00095 } 00096 00097 template <class Checkmate> 00098 boost::shared_ptr<Checkmate> 00099 osl::search::CheckmateSearcherHolder<Checkmate>:: 00100 cloneShared(const Worker *key) 00101 { 00102 return table->clone(key); 00103 } 00104 00105 template <class Checkmate> 00106 void osl::search::CheckmateSearcherHolder<Checkmate>:: 00107 clear() 00108 { 00109 table->clear(); 00110 } 00111 00112 template <class Checkmate> 00113 size_t osl::search::CheckmateSearcherHolder<Checkmate>:: 00114 totalNodeCount() const 00115 { 00116 return table->totalNodeCount(); 00117 } 00118 00119 #endif /* OSL_CHECKMATESEARCHERHOLDER_TCC */ 00120 // ;;; Local Variables: 00121 // ;;; mode:c++ 00122 // ;;; c-basic-offset:2 00123 // ;;; End: