aligned_stack.cpp 1.76 KB
Newer Older
1 2 3 4 5 6 7 8
#include "pls/internal/data_structures/aligned_stack.h"
#include "pls/internal/base/system_details.h"

namespace pls {
namespace internal {
namespace data_structures {

aligned_stack::aligned_stack(char *memory_pointer, size_t size) :
9
    unaligned_memory_pointer_{memory_pointer},
10 11 12
    memory_pointer_{memory_pointer}, // MUST be aligned
    max_offset_{size / base::system_details::CACHE_LINE_SIZE},
    current_offset_{0} {
13
  PLS_ASSERT((pointer_t) memory_pointer_ % base::system_details::CACHE_LINE_SIZE == 0,
14 15 16 17 18 19
             "Must initialize an aligned_stack with a properly aligned memory region!")
}

aligned_stack::aligned_stack(char *unaligned_memory_pointer, size_t size, size_t unaligned_size) :
    unaligned_memory_pointer_{unaligned_memory_pointer},
    memory_pointer_{base::alignment::next_alignment(unaligned_memory_pointer)},
20 21
    max_offset_{unaligned_size / base::system_details::CACHE_LINE_SIZE},
    current_offset_{0} {
22 23 24 25
  PLS_ASSERT(size == base::alignment::previous_alignment(unaligned_size),
             "Initialized aligned stack with invalid memory configuration!")
}

26
char *aligned_stack::memory_at_offset(stack_offset offset) const {
27
  const auto byte_offset = offset * base::system_details::CACHE_LINE_SIZE;
28
  return reinterpret_cast<char *>(memory_pointer_ + byte_offset);
29 30
}

31
char *aligned_stack::push_bytes(size_t size) {
32 33 34
  size_t round_up_size = base::alignment::next_alignment(size);
  size_t num_cache_lines = round_up_size / base::system_details::CACHE_LINE_SIZE;

35
  char *result = memory_at_offset(current_offset_);
36 37 38

  // Move head to next aligned position after new object
  current_offset_ += num_cache_lines;
39
  PLS_ASSERT(current_offset_ <= max_offset_,
40 41 42 43 44 45 46 47
             "Tried to allocate object on alligned_stack without sufficient memory!");

  return result;
}

}
}
}