From 603a1a9dccfd540ad47b700997355b050e2bb37a Mon Sep 17 00:00:00 2001 From: Nathan Giddings Date: Tue, 6 Apr 2021 14:44:45 -0500 Subject: [PATCH] Turned Scheduler into more generic heap --- src/heap.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++ src/heap.hpp | 38 +++++++++++++++++++++++ src/scheduler.cpp | 68 ----------------------------------------- src/scheduler.hpp | 37 ---------------------- 4 files changed, 116 insertions(+), 105 deletions(-) create mode 100644 src/heap.cpp create mode 100644 src/heap.hpp delete mode 100644 src/scheduler.cpp delete mode 100644 src/scheduler.hpp diff --git a/src/heap.cpp b/src/heap.cpp new file mode 100644 index 0000000..6ad056c --- /dev/null +++ b/src/heap.cpp @@ -0,0 +1,78 @@ +#include "heap.hpp" + +template +kernelns::Heap::Heap() +{ + +} + +template +kernelns::Heap::Heap(T** array, size_t maxSize) +{ + m_array = array; + m_size = 0; + m_limit = maxSize; +} + +template +T* kernelns::Heap::extractMin() +{ + if(m_size == 0) + return nullptr; + m_size--; + T* p = m_array[0]; + m_array[0] = m_array[m_size]; + heapify(0); + return p; +} + +template +void kernelns::Heap::insert(T* n) +{ + if(m_size == m_limit) // TODO: have insert return status code + return; + size_t i = m_size; + m_size++; + while(i > 0 && *m_array[(i - 1) / 2] > *n) + { + m_array[i] = m_array[(i - 1) / 2]; + i = (i - 1) / 2; + } + m_array[i] = n; +} + +template +void kernelns::Heap::remove(T* n) +{ + for(size_t i = 0; i < m_size; i++) + { + if(m_array[i] == n) + { + m_size--; + m_array[i] = m_array[m_size]; + heapify(i); + break; + } + } +} + +template +void kernelns::Heap::heapify(size_t i) +{ + if(i * 2 + 1 >= m_size) + return; + if (*m_array[i * 2 + 1] <= *m_array[i] && *m_array[i * 2 + 1] <= *m_array[i * 2 + 2]) + { + T buffer = m_array[i]; + m_array[i] = m_array[i * 2 + 1]; + m_array[i * 2 + 1] = buffer; + heapify(i * 2 + 1); + } + else if (*m_array[i * 2 + 2] <= *m_array[i] && *m_array[i * 2 + 2] <= *m_array[i * 2 + 1]) + { + T buffer = m_array[i]; + m_array[i] = m_array[i * 2 + 2]; + m_array[i * 2 + 2] = buffer; + heapify(i * 2 + 2); + } +} \ No newline at end of file diff --git a/src/heap.hpp b/src/heap.hpp new file mode 100644 index 0000000..93af712 --- /dev/null +++ b/src/heap.hpp @@ -0,0 +1,38 @@ +#ifndef SCHEDULER_H +#define SCHEDULER_H + +#include + +#include "process.hpp" + +namespace kernelns +{ + +template +class Heap +{ +public: + + Heap(); + + Heap(T** array, size_t maxSize); + + T* extractMin(); + + void insert(T* n); + + void remove(T* n); + +private: + + void heapify(size_t index); + + T** m_array; + + size_t m_size, m_limit; + +}; + +}; + +#endif \ No newline at end of file diff --git a/src/scheduler.cpp b/src/scheduler.cpp deleted file mode 100644 index 57089a1..0000000 --- a/src/scheduler.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "scheduler.hpp" - -kernelns::ProcessQueue::ProcessQueue() -{ - -} - -kernelns::ProcessQueue::ProcessQueue(Process** array) -{ - m_array = array; - m_size = 0; -} - -kernelns::Process* kernelns::ProcessQueue::extractMin() -{ - if(m_size == 0) - return NULL; - m_size--; - Process* p = m_array[0]; - m_array[0] = m_array[m_size]; - heapify(0); - return p; -} - -void kernelns::ProcessQueue::insert(Process* n) -{ - size_t i = m_size; - m_size++; - for(; i > 0 && m_array[(i - 1) / 2]->priority > n->priority; i = (i - 1) / 2) - { - m_array[i] = m_array[(i - 1) / 2]; - } - m_array[i] = n; -} - -void kernelns::ProcessQueue::remove(Process* n) -{ - for(size_t i = 0; i < m_size; i++) - { - if(m_array[i] == n) - { - m_size--; - m_array[i] = m_array[m_size]; - heapify(i); - break; - } - } -} - -void kernelns::ProcessQueue::heapify(size_t i) -{ - if(i * 2 + 1 >= m_size) - return; - if (m_array[i]->priority >= m_array[i * 2 + 1]->priority && m_array[i * 2 + 1]->priority <= m_array[i * 2 + 2]->priority) - { - Process* buffer = m_array[i]; - m_array[i] = m_array[i * 2 + 1]; - m_array[i * 2 + 1] = buffer; - heapify(i * 2 + 1); - } - else if (m_array[i]->priority >= m_array[i * 2 + 2]->priority && m_array[i * 2 + 2]->priority <= m_array[i * 2 + 1]->priority) - { - Process* buffer = m_array[i]; - m_array[i] = m_array[i * 2 + 2]; - m_array[i * 2 + 2] = buffer; - heapify(i * 2 + 2); - } -} \ No newline at end of file diff --git a/src/scheduler.hpp b/src/scheduler.hpp deleted file mode 100644 index c58ee32..0000000 --- a/src/scheduler.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef SCHEDULER_H -#define SCHEDULER_H - -#include - -#include "process.hpp" - -namespace kernelns -{ - -class ProcessQueue -{ -public: - - ProcessQueue(); - - ProcessQueue(Process** array); - - Process* extractMin(); - - void insert(Process* n); - - void remove(Process* n); - -private: - - void heapify(size_t index); - - Process** m_array; - - size_t m_size; - -}; - -}; - -#endif \ No newline at end of file