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

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


f/ltfOronOT04HOCTb 141

p = findPtrlnfo(adcar) ; p->refcount-;

Далее, если новый адрес уже существует в системе,

увеличивает на единицу его счетчик.

Иначе создает новый элемент в списке gclist.

р = findPtrlnfo(t);

if(p != gclist.endO)

p->refcount++; else {

Создает и запоминает этот элемент. GCInfo<T> gcObj(t, size); gclist.push front(gcObj);

addr = t; store the address. ReleaseMutex (hMutex); return t;

Перегружает присваивание одного объекта GCPtr другому объекту GCPtr. template <class Т, int size>

GCPtr<T. size> & GCPtr<T, size>::operator=(GCPtr &rv) { if(WaitForSingleObject(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc();

list<GCInfo<T> >::iterator p;

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

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

Р = findPtrlnfo(addr);

P->ref count-;

Далее увеличивает на единицу счетчик ссылок нового объекта. .Р = findPtrInfо(rv.addr); P->refcount+-t-; наращивает refcount



142 . Главаз

addr = rv.addr; запоминает адрес.

ReieaseMutex(hMutex); return rv;

Функция-утилита, отображающая список gclist. tenplate <class T, int size> void GCPtr<T, sizei>:: showlist () {

if (WaitForSingleObject (hMutex, 10000) ==WAIT TIMTOtJT) throw TimeOutExc();

list<GCInfo<T> >::iterator p;

cout gclist< typeid(T) .nameO

size >:\n ; cout memPtr refcount valueXn ;

if (gclist.beginO == gclist.endO) { cout - Enpty -\n\n ; return;

for(p = gclist.beginO; p != gclist.endO; p++) { cout [ (void *) p->memPtr ]

p->refcount ; if(p->memPtr) cout *p->memPtr;

else cout --- ;

cout endl;

cout endl;

ReieaseMutex(hMutex)f

Находит указатель в списке gclist. tenplate <class T, int size> typename list<GCInfo<T> >::iterator GCPtr<T, size>::findPtrInfo(T *ptr) {



Очищает список gclist, когда програмьла завершается.

list<GCInfo<T> >::iterator p;

Находит ptr в списке gclist. for(p = gclist.beginO; p != gclist.endO; p++) if(p->memPtr == ptr) return p;

return p;

Точка входа для потока сборщика мусора, tenplate <class Т, int size>

unsigned stdcall GCPtr<T, size>: :gc(void * param) {

#ifdef DISPLAY

cout Garbage collection started.\n ; #endif

While(isRunningO) { collect();

collectO; собирает мусор перед выходом из функции

Освобождает и устанавливает дескриптор потока таким образом, чтобы поток сбора мусора можно было возобновить при необходимости. CloseHandle (hThrd); hThrd = 0;

#ifdef DISPLAY

cout Garbage collection terminated for typeid(T) .nameO \n ;

#endif eturn 0;



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

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