Программирование >>  Формирование пользовательского контейнера 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 156


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;

Сначала уменьшает на единицу счетчик ссылок

для фрагмента памяти, на который ссылается в данный момент.



1 ... 42 43 44 [ 45 ] 46 47 48 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика