00001 #include "bcsignals.h" 00002 #include "garbage.h" 00003 #include "mutex.h" 00004 00005 #include <string.h> 00006 00007 Garbage *Garbage::garbage = 0; 00008 00009 00010 GarbageObject::GarbageObject(char *title) 00011 { 00012 Garbage::garbage->add_object(this); 00013 users = 0; 00014 deleted = 0; 00015 this->title = new char[strlen(title) + 1]; 00016 strcpy(this->title, title); 00017 } 00018 00019 GarbageObject::~GarbageObject() 00020 { 00021 if(!deleted) 00022 printf("GarbageObject::~GarbageObject: title=%s users=%d was not deleted by Garbage::delete_object\n", title, users); 00023 delete [] title; 00024 } 00025 00026 00027 void GarbageObject::add_user() 00028 { 00029 Garbage::garbage->lock->lock("GarbageObject::add_user"); 00030 users++; 00031 Garbage::garbage->lock->unlock(); 00032 } 00033 00034 void GarbageObject::remove_user() 00035 { 00036 Garbage::garbage->lock->lock("GarbageObject::add_user"); 00037 users--; 00038 if(users < 0) printf("GarbageObject::remove_user: users=%d Should be >= 0.\n", users); 00039 Garbage::garbage->remove_expired(); 00040 // *this is now invalid 00041 Garbage::garbage->lock->unlock(); 00042 } 00043 00044 00045 00046 00047 00048 Garbage::Garbage() 00049 { 00050 lock = new Mutex("Garbage::lock", 1); 00051 } 00052 00053 00054 Garbage::~Garbage() 00055 { 00056 delete lock; 00057 } 00058 00059 void Garbage::add_object(GarbageObject *ptr) 00060 { 00061 lock->lock("Garbage::add_object"); 00062 objects.append(ptr); 00063 lock->unlock(); 00064 } 00065 00066 void Garbage::delete_object(GarbageObject *ptr) 00067 { 00068 Garbage *garbage = Garbage::garbage; 00069 garbage->lock->lock("Garbage::delete_object"); 00070 ptr->deleted = 1; 00071 00072 // Remove expired objects here 00073 remove_expired(); 00074 garbage->lock->unlock(); 00075 } 00076 00077 void Garbage::remove_expired() 00078 { 00079 Garbage *garbage = Garbage::garbage; 00080 for(int i = 0; i < garbage->objects.total; i++) 00081 { 00082 GarbageObject *ptr = garbage->objects.values[i]; 00083 if(ptr->users <= 0 && ptr->deleted) 00084 { 00085 // Must remove pointer to prevent recursive deletion of the same object. 00086 // But i is still invalid. 00087 garbage->objects.remove_number(i); 00088 00089 delete ptr; 00090 i--; 00091 } 00092 } 00093 } 00094 00095 00096
1.5.5