00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdexcept>
00024
00025 #include "refcount.hh"
00026 #include "log.hh"
00027
00028 using namespace VOS;
00029
00030 void RefCounted::acquire() { ++count; }
00031 void RefCounted::release() { if(--count == 0) destroy(); }
00032 int RefCounted::getCount() { return count; }
00033
00034 void RefCounted::destroy() {
00035 delete this;
00036 }
00037
00038 void RefCounted::addExciseListener(ObjectExciseListener* oel) {
00039 if(! exciseListeners) exciseListeners = new set<ObjectExciseListener*>;
00040 if(RefCounted* rc = dynamic_cast<RefCounted*>(oel)) rc->acquire();
00041 exciseListeners->insert(oel);
00042 }
00043
00044 void RefCounted::removeExciseListener(ObjectExciseListener* oel, bool releaseIfRefcounted) {
00045 if(oel) {
00046 if(exciseListeners) {
00047 exciseListeners->erase(oel);
00048 if(releaseIfRefcounted)
00049 if(RefCounted* rc = dynamic_cast<RefCounted*>(oel)) {
00050 rc->release();
00051 }
00052 }
00053 }
00054 }
00055
00056 void RefCounted::excise() {
00057 if(exciseListeners) {
00058
00059
00060 set<ObjectExciseListener*> setcopy = *exciseListeners;
00061 for(set<ObjectExciseListener*>::iterator it = setcopy.begin();
00062 it != setcopy.end();
00063 it++) {
00064 try {
00065 if(*it) (*it)->notifyObjectExcise(this);
00066 } catch(exception& x) {
00067 LOG("refcount", 0, "call to notifyObjectExcise emitted exception: " << x.what());
00068 } catch(...) { }
00069 }
00070 delete exciseListeners;
00071 exciseListeners = 0;
00072 }
00073 }