From e655168599a1a3ff42ae49789b21fa3b2b248ada Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 19 Jun 2017 10:44:57 -0500 Subject: [PATCH] mark_inaccessible should be finished. Initial skeleton for release_frames. --- MP2/MP2_Sources/cont_frame_pool.C | 46 +++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/MP2/MP2_Sources/cont_frame_pool.C b/MP2/MP2_Sources/cont_frame_pool.C index 39a325a..48ae615 100644 --- a/MP2/MP2_Sources/cont_frame_pool.C +++ b/MP2/MP2_Sources/cont_frame_pool.C @@ -259,7 +259,7 @@ unsigned long ContFramePool::get_frames(unsigned int _n_frames) temp++; mask = 0x80; } - if((mask & bitmap[temp]) != 0 ^^ ((mask >> 1) & bitmap[temp]) != 0) + if((mask & bitmap[temp]) != 0 && ((mask >> 1) & bitmap[temp]) != 0) { c++; } @@ -310,14 +310,50 @@ unsigned long ContFramePool::get_frames(unsigned int _n_frames) void ContFramePool::mark_inaccessible(unsigned long _base_frame_no, unsigned long _n_frames) { - // TODO: IMPLEMENTATION NEEEDED! - assert(false); + // Mark all frames in the range as being used. + int i ; + for(i = _base_frame_no; i < _base_frame_no + _n_frames; i++){ + mark_inaccessible(i); + } + nFreeFrames -= _n_frames; } +void ContFramePool::mark_inaccessible(unsigned long _frame_no) +{ + // Let's first do a range check. + assert ((_frame_no >= base_frame_no) && (_frame_no < base_frame_no + nframes)); + + unsigned int bitmap_index = (_frame_no - base_frame_no) / 4; + unsigned char mask = 0x80 >> ((_frame_no - base_frame_no) % 4) * 2; + + // Is the frame being used already? + assert(((bitmap[bitmap_index] & mask) != 0) && (bitmap[bitmap_index] & (mask >> 1)) != 0); + + // Update bitmap + bitmap[bitmap_index] ^= mask; + bitmap[bitmap_index] ^= mask >> 1; + nFreeFrames--; +} + + + void ContFramePool::release_frames(unsigned long _first_frame_no) { - // TODO: IMPLEMENTATION NEEEDED! - assert(false); + + // Find a way to find which pool has this frame. + + unsigned int bitmap_index = (_first_frame_no - base_frame_no) / 4; + unsigned char mask = 0x80 >> ((_first_frame_no - base_frame_no) % 4) * 2; + + if((bitmap[bitmap_index] & mask) != 0 && (bitmap[bitmap_index] & (mask >> 1)) != 0) + { + Console::puts("Error, Frame being released is not being used\n"); + assert(false); + } + + bitmap[bitmap_index] ^= mask; + + nFreeFrames++; } unsigned long ContFramePool::needed_info_frames(unsigned long _n_frames)