From 2d02f6f0fa4347a5f9fb9fa086d85b3182071220 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 19 Jun 2017 11:23:36 -0500 Subject: [PATCH] release_frames() finished. moving on to debugging. --- MP2/MP2_Sources/cont_frame_pool.C | 53 ++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/MP2/MP2_Sources/cont_frame_pool.C b/MP2/MP2_Sources/cont_frame_pool.C index 48ae615..ca996d0 100644 --- a/MP2/MP2_Sources/cont_frame_pool.C +++ b/MP2/MP2_Sources/cont_frame_pool.C @@ -187,7 +187,7 @@ ContFramePool::ContFramePool(unsigned long _base_frame_no, while(c < n_info_frames) { bitmap[i] = bitmap[i] ^ mask; - if(mask == 0x00) + if(mask == 0x02) { i++; mask = 0xC0; @@ -230,7 +230,7 @@ unsigned long ContFramePool::get_frames(unsigned int _n_frames) // check every 2 bits for a free frame in the bitmap while((mask & bitmap[i]) == 0 || ((mask >> 1) & bitmap[i]) == 0) { - if(mask != 0x00) + if(mask != 0x02) { j++; mask >> 2; @@ -250,7 +250,7 @@ unsigned long ContFramePool::get_frames(unsigned int _n_frames) c++; while(c < _n_frames) { - if(mask != 0x00) + if(mask != 0x02) { mask >> 2; } @@ -289,7 +289,7 @@ unsigned long ContFramePool::get_frames(unsigned int _n_frames) unsigned int temp = i; while(c < _n_frames) { - if(mask != 0x00) + if(mask != 0x02) { mask >> 2; } @@ -335,12 +335,28 @@ void ContFramePool::mark_inaccessible(unsigned long _frame_no) nFreeFrames--; } - - -void ContFramePool::release_frames(unsigned long _first_frame_no) +void ContFramePool::release_frames(unsigned long _frame_no) { + unsigned int i = 0; + while(i < pools.size()) + { + if(_frame_no < pools[i].base_frame_no || _frame_no > (pools[i].base_frame_no + pools[i].nframes)) + { + i++; + } + else + { + pools[i].release_frames_here(_frame_no); + return; + } + } + // This is the case where we fail to find the frame in any of the pools. + assert(false); +} - // Find a way to find which pool has this frame. +void ContFramePool::release_frames_here(unsigned long _first_frame_no) +{ + unsigned char * bitmap = this->bitmap; unsigned int bitmap_index = (_first_frame_no - base_frame_no) / 4; unsigned char mask = 0x80 >> ((_first_frame_no - base_frame_no) % 4) * 2; @@ -352,12 +368,27 @@ void ContFramePool::release_frames(unsigned long _first_frame_no) } bitmap[bitmap_index] ^= mask; - nFreeFrames++; + + if(mask != 0x02) + { + mask >> 2; + } + else + { + mask = 0x80; + bitmap_index++; + } + + while(bitmap[bitmap_index] & mask == 0 && (bitmap[bitmap_index] & (mask >> 1)) == 0) + { + bitmap[bitmap_index] ^= mask; + bitmap[bitmap_index] ^= (mask >> 1); + nFreeFrames++; + } } unsigned long ContFramePool::needed_info_frames(unsigned long _n_frames) { - // TODO: IMPLEMENTATION NEEEDED! - assert(false); + return _n_frames / (FRAME_SIZE * 4); }