scheduler_memory.cpp 1.55 KB
Newer Older
1 2 3 4 5 6 7
#include "pls/internal/scheduling/scheduler_memory.h"

namespace pls {
    namespace internal {
        namespace scheduling {
            malloc_scheduler_memory::malloc_scheduler_memory(const size_t num_threads, const size_t memory_per_stack):
                    num_threads_{num_threads} {
8 9
                threads_ = reinterpret_cast<aligned_thread *>(base::alignment::allocate_aligned(num_threads * sizeof(aligned_thread)));
                thread_states_ = reinterpret_cast<aligned_thread_state *>(base::alignment::allocate_aligned(num_threads * sizeof(aligned_thread_state)));
10

11 12
                task_stacks_ = reinterpret_cast<aligned_aligned_stack *>(base::alignment::allocate_aligned(num_threads * sizeof(aligned_aligned_stack)));
                task_stacks_memory_ = reinterpret_cast<char**>(base::alignment::allocate_aligned(num_threads * sizeof(char*)));
13
                for (size_t i = 0; i < num_threads_; i++) {
14 15
                    task_stacks_memory_[i] = reinterpret_cast<char*>(base::alignment::allocate_aligned(memory_per_stack));
                    new ((void*)task_stacks_[i].pointer()) data_structures::aligned_stack(task_stacks_memory_[i], memory_per_stack);
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
                }
            }

            malloc_scheduler_memory::~malloc_scheduler_memory() {
                free(threads_);
                free(thread_states_);

                for (size_t i = 0; i < num_threads_; i++) {
                    free(task_stacks_memory_[i]);
                }
                free(task_stacks_);
                free(task_stacks_memory_);
            }
        }
    }
}