scheduler_memory.cpp 1.92 KB
Newer Older
1 2 3
#include "pls/internal/scheduling/scheduler_memory.h"

namespace pls {
4 5
namespace internal {
namespace scheduling {
6

7 8 9 10 11 12 13 14 15
malloc_scheduler_memory::malloc_scheduler_memory(const size_t num_threads, const size_t memory_per_stack) :
    num_threads_{num_threads} {
  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)));
  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 *)));
16 17 18 19 20 21

  thread_refs_ = static_cast<scheduler_thread **>(malloc(num_threads * sizeof(scheduler_thread *)));
  thread_state_refs_ = static_cast<thread_state **>(malloc(num_threads * sizeof(thread_state *)));
  task_stack_refs_ =
      static_cast<data_structures::aligned_stack **>(malloc(num_threads * sizeof(data_structures::aligned_stack *)));

22 23 24
  for (size_t i = 0; i < num_threads_; i++) {
    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);
25 26 27 28

    thread_refs_[i] = threads_[i].pointer();
    thread_state_refs_[i] = thread_states_[i].pointer();
    task_stack_refs_[i] = task_stacks_[i].pointer();
29
  }
30 31

  init(num_threads, thread_state_refs_, thread_refs_, task_stack_refs_);
32 33 34 35 36 37 38 39 40 41 42
}

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_);
43 44 45 46

  free(thread_refs_);
  free(thread_state_refs_);
  free(task_stack_refs_);
47
}
48

49 50
}
}
51
}