|
Программирование >> Формирование пользовательского контейнера
138 [ Ггивдз if(isArray) size = arraySize; else size = 1; return Iter<T>(addr + size, addr, addr + size); Возвращает размер списка gclist для этого типа объектов GCPtr. static int gclistSizeO { if(WaitForSingleObject(hMutex. 10000)==WAIT TIMEOUT) throw TimeOutExc (); unsigned sz = gclist.sizeO ; ReieaseMutex(hMutex); return sz; Функция-утилита для вывода на экран списка gclist. static void showlistO; Следующие функции обеспечивают многопоточность. Возвращает true, если сборщик выполняется, static bool isRunningO { return instcount > 0; } Очищает список gclist, когда программа заверщается. static void shutdownO; Точка входа для потока сборщика мусора, static unsigned stdcall gc(void * param); Отводит Пс1мять для статических переменных, tenplate <class Т, int size> list<GCInfo<T> > GCPtr<T, size>::gclist; tenplate <class T, int size> int GCPtr<T, size>: rinstCoiont = 0; fjHoronoTOHHocTb 139 tenplate <class T, int size> HANDLE GCPtr<T, size>::hMutex = 0; tetplate <class T, int size> HANDLE GCPtr<T, size>::hThrd = 0; Деструктор для объекта GCPtr. teroplate <class T, int size> . GCPtr<T, size>: :-GCPtrO { if(WaitForSingleObject(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc () ; list<GCInfo<T> >::iterator p; p = findPtrlnfo(addr); if(p->refcount) p->refcount-; операция декремента для счетчика ссылок Уменьшает на единицу счетчик экземпляров при каждом уничтожении объекта. InstCount-; ReleaseMutex (hMutex) ; Собирает мусор. Возвращает true, если хотя бы один объект удален, template <class Т, int size> bool GCPtr<T, size>::collect О { if(WaitForSingleObj ect(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc () ; bool memfreed = false; list<GCInfo<T> >::iterator p; do { Просматривает список gclist для поиска неопределенных указателей. for(p = gclist.beginO; p != gclist.endO; p++) { Если элемент используется, пропускает, if(p->refcount > 0) continue; memfreed = true; Удаляет неиспользуемые элементы из списка gclist. gclist.remove(*p); Освобождает память, если Free указатель GCPtr равен null, if(p->memPtr) { if(p->isArray) { delete[] p->memPtr; удаляет массив else { delete p->memPtr; удаляет одиночный элемент Возобновляет поиск, break; ) . } while(р != gclist.endO); ReieaseMutex(hMutex); return memfreed; Перегружает присваивание указателя объекту GCPtr. tenplate <class T, int size> T * GCPtr<T, size>::operator=(T *t) { if(WaitForSingleObject(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc (); list<GCInfo<T> >::iterator p; Сначала уменьшает на единицу счетчик ссылок для фрагмента памяти, на который ссылается в данный момент.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |