UIHexEditorWnd::UIHexEditorWnd( QWidget* p ) : QAbstractScrollArea( p ) { gapSizeAddrHex = 10; gapSizeHexText = 16; bytesPerLine = 16; bytesPerGroup = 2; nibblesPerGroup = bytesPerGroup * 2; hexCharsInLine = bytesPerLine * 2 + (bytesPerLine / bytesPerGroup) - 1; textEdit = false; setStartAddress(0); setEndAddress(0xFFFFFFFF); setAddrAreaColor(this->palette().color(QPalette::AlternateBase)); adjustSettings(); resetSelection(0); goToAddress(0); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(sliderUpdate(int))); connect(&cursorTimer, SIGNAL(timeout()), this, SLOT(updateCursor())); cursorTimer.setInterval(500); cursorTimer.start(); connect(&autoScrollTimer, SIGNAL(timeout()), this, SLOT(autoScroll())); autoScrollTimer.setInterval(5); setMouseTracking(true); }
void MemoryManager::deallocateMemoryOfProcess(Process* process) { // Pequena proteção... if(process->getBeginMemory() == 0 && process->getEndMemory() == 0) return; // Verifica se tem partições adjacentes auto itUp = _freeList.end();// Iterador da partição acima auto itDown = _freeList.end();// Iterador da partição abaixo for(auto it = _freeList.begin(); it != _freeList.end(); it++){ auto tmp = (*it); if(tmp->getEndAddress()+1 == process->getBeginMemory()){ itUp = it; }else if(tmp->getBeginAddress()-1 == process->getEndMemory()){ itDown = it; } if(tmp->getBeginAddress() > process->getEndMemory()) break; } auto pUp = (*itUp);// Partição acima auto pDown = (*itDown);// Partição abaixo // Espaço que ficará livre após este desalocamento unsigned int freeSize = 0; if(itUp != _freeList.end() && itDown != _freeList.end()){// Acima e abaixo // Existem partições livres acima e abaixo da partição que será desalocado pUp->setEndAddress(pDown->getEndAddress());// Atualiza o endereço final da partição acima // com o endereço final da partição abaixo [junta elas] freeSize = pUp->getLength(); delete pDown; _freeList.erase(itDown);// Remove a partição abaixo }else if(itUp != _freeList.end() && itDown == _freeList.end()){// Só acima // Existe uma partição livre acima da que será desalocada pUp->setEndAddress(process->getEndMemory());// Atualiza o endereço final da partição acima // com o endereço final da partição que será desalocada freeSize = pUp->getLength(); }else if(itUp == _freeList.end() && itDown != _freeList.end()){// Só abaixo // Existe uma partição livre abaixo da que será desalocada pDown->setBeginAddress(process->getBeginMemory());// Atualiza o endereço inicial da partição abaixo // com o endereço inicial da partição que será // desalocada freeSize = pDown->getLength(); }else{// Isolada // A partição esta isolada, então simplesmente adicione // ela na _freeList. auto tmp = new Partition(process->getBeginMemory(), process->getEndMemory()); addPartitionInOrder(tmp, false); freeSize = tmp->getLength(); } // Remove a partição do processo da _busyList for(auto it = _busyList.begin(); it != _busyList.end(); it++){ auto tmp = (*it); if(tmp->getProcess() == process){ delete (*it); _busyList.erase(it); break; } } // Zera a memória do processo process->setBeginMemory(0); process->setEndMemory(0); // Verifica se tem algum processo na fila que // caiba no espaço gerado por esta desalocação unsigned int pSize = 0; for(auto it = _queue.begin(); it != _queue.end(); it++){ auto tmp = (*it); pSize = getProcessSize(tmp); if(freeSize >= pSize){ allocateMemoryForProcess(tmp); _queue.erase(it); break; } } }