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