]> 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     void* adr = (void*)p;
167     bbtkDebugMessage("object",1,"##> Object::Deleter : deleting \""
168                      <<name<<"\" ["<<adr<<"]"<<std::endl);
169     Object::RemoveFromObjectList(mPointer);
170     this->Delete(p);
171     bbtkDebugMessage("object",2,"<## Object::Deleter : \""<<name<<"\" ["
172                      <<adr<<"] deleted"<<std::endl);
173   }
174   //=======================================================================
175
176
177
178
179   //=======================================================================
180   void Object::ReleasePackages()
181   {
182     bbtkDebugMessage("object",1,"##> Object::ReleasePackages()"<<std::endl);
183     // Release package pointers
184     ObjectListType::iterator i;
185     for (i = mgPackageList.begin();
186          i!= mgPackageList.end();
187          ++i)
188       {
189         if (i->use_count() != 0) 
190           { 
191             bbtkDebugMessage("object",1,"##> Releasing package '"<<
192                              i->lock()->GetThisPointer<Package>()->GetName()
193                              <<"'"<<std::endl);
194             //      Object::Pointer p(i->lock());
195             Package::WeakPointer w(i->lock()->GetThisPointer<Package>());
196             Package::Release(w);
197             /*
198             if (p->GetObjectName().find(name) != std::string::npos ) 
199               {
200                 std::cout << n << "/" << mgObjectList.size() << " ";
201                 PrintObjectInfo(p);
202                 m += p->GetObjectSize();
203                 n++;
204               }
205             */
206           }
207       }  
208
209   }
210   //=======================================================================
211
212
213
214
215   //=======================================================================
216   bool StaticInitTime::PrintObjectListInfo = false;
217   //=======================================================================
218   //=======================================================================
219   StaticInitTime::StaticInitTime() 
220   {
221   }
222   //=======================================================================
223   //=======================================================================
224   StaticInitTime::~StaticInitTime()
225   {
226     Object::ReleasePackages();
227
228     if (PrintObjectListInfo) 
229       {
230         std::cout << std::endl
231                   << "************************** main ended *******************"
232                   << std::endl << std::endl;
233         Object::PrintObjectListInfo("");
234       }
235     if (Object::GetObjectsCount()>0)
236       {
237         std::cout << std::endl;
238         std::cout << "**************************** WARNING *************************"
239                   <<std::endl; 
240         std::cout << "**** "<< Object::GetObjectsCount()
241                   <<" bbtk objects still alive after main ended"<<std::endl;
242         if (!PrintObjectListInfo) 
243           {
244             
245             std::cout << "**** "
246                       <<"Rerun bbi with -D option or put 'debug -D' in bbs file"
247                   <<std::endl;
248             std::cout << "**** "
249                       <<"to view the objects list "
250                       <<std::endl;
251           }
252         std::cout << "**************************************************************"
253                   <<std::endl
254                   <<std::endl;
255
256      }
257   }
258   //=======================================================================
259   //=======================================================================
260   //  The static instance
261   static StaticInitTime i;
262   //=======================================================================
263
264 }