|
Программирование >> Формирование пользовательского контейнера
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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |