// Mark a block free in the bitmap void free_block(uint32_t blockno) { // Blockno zero is the null pointer of block numbers. if (blockno == 0) panic("attempt to free zero block"); bitmap[blockno/32] |= 1<<(blockno%32); //bitmap should be flushed - ren if(flush_bitmap()) panic("flushing bitmap failed!"); }
// Search the bitmap for a free block and allocate it. // // Return block number allocated on success, // -E_NO_DISK if we are out of blocks. int alloc_block_num(void) { // LAB 5: Your code here. int i; for(i=0; i < super->s_nblocks; i++) if (block_is_free(i)){ bitmap[i/32] &= ~(1<<(i%32)); //fancy - ren if(flush_bitmap()) panic("flushing bitmap failed!"); return i; } return -E_NO_DISK; }
LRESULT window_visualisation::on_message(HWND wnd,UINT msg,WPARAM wp,LPARAM lp) { if(msg == WM_CREATE) { m_wnd = wnd; long flags = WS_EX_CONTROLPARENT; if (m_frame == 1) flags |= WS_EX_CLIENTEDGE; if (m_frame == 2) flags |= WS_EX_STATICEDGE; uSetWindowLong(wnd, GWL_EXSTYLE, flags); SetWindowPos(wnd,0,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); list_vis.add_item(this); initialised = true; ui_extension::visualisation::create_by_guid(get_visualisation_guid(), p_vis); if (p_vis.is_valid()) { GetClientRect(wnd, &rc_client); window_visualisation_interface::g_create(m_interface, this); try{ p_vis->set_config(&stream_reader_memblock_ref(m_data.get_ptr(), m_data.get_size()),m_data.get_size(),abort_callback_impl()); }catch(const exception_io &){}; p_vis->enable(ui_extension::visualisation_host_ptr(m_interface.get_ptr())); } } else if (msg == WM_DESTROY) { if (p_vis.is_valid()) p_vis->disable(); flush_bitmap(); m_interface.release(); initialised = false; list_vis.remove_item(this); m_wnd=0; } else if (msg == WM_PAINT) { if (p_vis.is_valid()) { RECT rc_paint; if (!GetUpdateRect(wnd, &rc_paint, 0)) { rc_paint = rc_client; } HDC dc = GetDC(wnd); HDC dc_bmp = CreateCompatibleDC(0); if (!bm_display) make_bitmap(dc); HGDIOBJ meh = SelectObject(dc_bmp,bm_display); BitBlt(dc,0,0,rc_client.right,rc_client.bottom,dc_bmp,0,0,SRCCOPY); SelectObject(dc_bmp,meh); DeleteDC(dc_bmp); ReleaseDC(wnd, dc); ValidateRect(wnd, &rc_paint); } } else if (msg == WM_WINDOWPOSCHANGED) { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; if (!(lpwp->flags & SWP_NOSIZE)) { GetClientRect(wnd, &rc_client); flush_bitmap(); } } else if (msg == WM_ERASEBKGND) { return FALSE; } return uDefWindowProc(wnd,msg,wp,lp); }