]> Creatis software - bbtk.git/blob - kernel/src/bbtkObject.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkObject.cxx
1 #include "bbtkObject.h"
2 #include "bbtkMessageManager.h"
3 #include "bbtkPackage.h"
4
5 namespace bbtk
6
7   
8
9   //=======================================================================
10   Object::ObjectListType Object::mgObjectList;
11   Object::ObjectListType Object::mgPackageList;
12   //=======================================================================
13
14   //=======================================================================
15   Object::Object()
16   { 
17   }
18   //=======================================================================
19
20
21   //=======================================================================
22   Object::~Object()
23   { 
24   }
25   //=======================================================================
26
27   //=======================================================================
28   void Object::InsertInObjectList(Pointer p)
29   { 
30     bbtkDebugMessage("object",9,"##> Object::InsertInObjectList(\""
31                      <<p->GetObjectName()<<"\" ["<<p<<"])"<<std::endl);
32     boost::weak_ptr<Object> w(p);
33     mgObjectList.insert(w); 
34   }
35   //=======================================================================
36
37   //=======================================================================
38   void Object::InsertInPackageList(Pointer p)
39   { 
40     bbtkDebugMessage("object",9,"##> Object::InsertInPackageList(\""
41                      <<p->GetObjectName()<<"\" ["<<p<<"])"<<std::endl);
42     boost::weak_ptr<Object> w(p);
43     mgPackageList.insert(w); 
44   }
45   //=======================================================================
46
47
48   //=======================================================================
49   void Object::RemoveFromObjectList(WeakPointer p)
50   { 
51     bbtkDebugMessage("object",9,"##> Object::RemoveFromObjectList()"
52                      <<std::endl);
53     mgObjectList.erase(p);
54
55   }
56   //=======================================================================
57
58
59   //=======================================================================
60   std::string Object::GetObjectName() const
61   {
62     return std::string("**Unknown object**");
63   }
64   //=======================================================================
65
66   //=======================================================================
67   std::string Object::GetObjectInfo() const
68   {
69     return std::string("");
70   }
71   //=======================================================================
72   
73   //=======================================================================
74   void Object::PrintObjectListInfo(const std::string& name)
75   {
76     
77     std::cout 
78       << "=============== Living bbtk::Object pointers ========="<<std::endl;
79
80     long n = 0;
81     long u = 0;
82     size_t m = 0;
83     ObjectListType::iterator i;
84     for (i = mgObjectList.begin();
85          i!=mgObjectList.end();
86          ++i)
87       {
88         if (i->use_count() == 0) 
89           {
90             u++;
91           }
92         else 
93           { 
94             Object::Pointer p(i->lock());
95             if (p->GetObjectName().find(name) != std::string::npos ) 
96               {
97                 std::cout << n << "/" << mgObjectList.size() << " ";
98                 PrintObjectInfo(p);
99                 m += p->GetObjectSize();
100                 n++;
101               }
102           }
103       }
104     std::cout 
105       << "------------------------------------------------------"<<std::endl; 
106
107     std::cout << " Total : "<<n<<" objects - "<<m<<" b"<<std::endl;
108     if (u==1)
109       {
110         std::cout<<"* Note : "<<u
111                  <<" object in list has 0 ref count, "
112                  <<"i.e. destroyed without removing itself from the living objects list ! (this is just an implementation error not a memory leak)"<<std::endl;
113       }
114     else if (u>1)
115       {
116         std::cout<<"* Note : "<<u
117                  <<" objects in list have 0 ref count, "
118                  <<"i.e. destroyed without removing themselves from the living objects list ! (this is just an implementation error not a memory leak)"<<std::endl;
119       }
120     std::cout
121       << "============ EO Living bbtk::Object pointers ========="<<std::endl;
122         
123   }
124   //=======================================================================
125
126   /*
127   //=======================================================================
128   void Object::PrintObjectInfo(const std::string& name)
129   {
130     long n = 0;
131     ObjectListType::iterator i;
132     for (i = mgObjectList.begin();
133          i!=mgObjectList.end();
134          ++i)
135       {
136         n++;
137         if (i->use_count() == 0) continue;
138         Object::Pointer p(i->lock());   
139         if (p->GetObjectName().find(name) != std::string::npos ) 
140           {
141             std::cout << n << "/" << mgObjectList.size() << " ";
142             PrintObjectInfo(p);
143           }
144       }
145   }
146   //=======================================================================
147   */
148   //=======================================================================
149   void Object::PrintObjectInfo(const Object::Pointer& p)
150   {
151     std::cout << "* [" << p << "] \t" 
152               << p.use_count()-1 << " r \t"
153               << p->GetObjectRecursiveSize() << " ("
154               << p->GetObjectSize() << ") b \t"
155               << p->GetObjectName() 
156               << std::endl;
157     std::cout << p->GetObjectInfo();
158   }
159   //=======================================================================
160
161   //=======================================================================
162   /// Objects deleter
163   void Object::Deleter::operator() (Object* p)
164   {
165     std::string name = p->GetObjectName();
166 #ifdef BBTK_COMPILE_DEBUG_MESSAGES
167     void* adr = (void*)p;
168     bbtkDebugMessage("object",1,"##> Object::Deleter : deleting \""
169                      <<name<<"\" ["<<adr<<"]"<<std::endl);
170 #endif
171     Object::RemoveFromObjectList(mPointer);
172     this->Delete(p);
173     bbtkDebugMessage("object",2,"<## Object::Deleter : \""<<name<<"\" ["
174                      <<adr<<"] deleted"<<std::endl);
175   }
176   //=======================================================================
177
178
179
180
181   //=======================================================================
182   void Object::ReleasePackages()
183   {
184     bbtkDebugMessage("object",1,"##> Object::ReleasePackages()"<<std::endl);
185     // Release package pointers
186     ObjectListType::iterator i;
187     for (i = mgPackageList.begin();
188          i!= mgPackageList.end();
189          ++i)
190       {
191         if (i->use_count() != 0) 
192           { 
193             bbtkDebugMessage("object",1,"##> Releasing package '"<<
194                              i->lock()->GetThisPointer<Package>()->GetName()
195                              <<"'"<<std::endl);
196             //      Object::Pointer p(i->lock());
197             Package::WeakPointer w(i->lock()->GetThisPointer<Package>());
198             Package::Release(w);
199             /*
200             if (p->GetObjectName().find(name) != std::string::npos ) 
201               {
202                 std::cout << n << "/" << mgObjectList.size() << " ";
203                 PrintObjectInfo(p);
204                 m += p->GetObjectSize();
205                 n++;
206               }
207             */
208           }
209       }  
210
211   }
212   //=======================================================================
213
214
215
216
217   //=======================================================================
218   bool StaticInitTime::PrintObjectListInfo = false;
219   //=======================================================================
220   //=======================================================================
221   StaticInitTime::StaticInitTime() 
222   {
223   }
224   //=======================================================================
225   //=======================================================================
226   StaticInitTime::~StaticInitTime()
227   {
228     Object::ReleasePackages();
229
230     if (PrintObjectListInfo) 
231       {
232         std::cout << std::endl
233                   << "************************** main ended *******************"
234                   << std::endl << std::endl;
235         Object::PrintObjectListInfo("");
236       }
237     if (Object::GetObjectsCount()>0)
238       {
239         std::cout << std::endl;
240         std::cout << "**************************** WARNING *************************"
241                   <<std::endl; 
242         std::cout << "**** "<< Object::GetObjectsCount()
243                   <<" bbtk objects still alive after main ended"<<std::endl;
244         if (!PrintObjectListInfo) 
245           {
246             
247             std::cout << "**** "
248                       <<"Rerun bbi with -D option or put 'debug -D' in bbs file"
249                   <<std::endl;
250             std::cout << "**** "
251                       <<"to view the objects list "
252                       <<std::endl;
253           }
254         std::cout << "**************************************************************"
255                   <<std::endl
256                   <<std::endl;
257
258      }
259   }
260   //=======================================================================
261   //=======================================================================
262   //  The static instance
263   static StaticInitTime i;
264   //=======================================================================
265
266 }