Lockless Task Scheduler  v1.0a
A lockless task scheduler
memory.h
1 // ***********************************************************************
2 // Assembly : task_scheduler
3 // Author : viknash
4 // ***********************************************************************
5 // <copyright file="memory.h" >
6 // Copyright (c) viknash. All rights reserved.
7 // </copyright>
8 // <summary></summary>
9 // ***********************************************************************
10 #pragma once
11 
12 
13 #include <memory>
14 #include <atomic>
15 
16 #include "utils.h"
17 #include "profile.h"
18 #include "alignment.h"
19 
23 namespace task_scheduler
24 {
25 
26 
31  {
32 
36  struct metadata_type
37  {
41  size_t space;
42  };
43 
44  public:
50  inline void *operator new(size_t _size) { return operator new(_size, ALIGNMENT); };
57  void *operator new(size_t _size, size_t _alignment);
63  inline void *operator new[](size_t _size) { return operator new(_size, ALIGNMENT); };
70  inline void *operator new[](size_t _size, size_t _alignment) { return operator new(_size, _alignment); }
77  void operator delete(void *_ptr, size_t _size);
84  inline void operator delete[](void *_ptr, size_t _size) { operator delete(_ptr, _size); }
85 
86  };
87 
88  void *default_mem_interface::operator new(size_t _size, size_t _alignment)
89  {
90  metadata_type metadata = { 0 };
91  metadata.space = _size + sizeof(metadata_type) + _alignment;
92  profile::memory* profile = get<profile::memory, default_mem_interface>();
93  profile->allocate_begin(metadata.space, false);
94  void *raw_pointer = malloc(metadata.space);
95  profile->allocate_end(&raw_pointer, metadata.space, false);
96  ts_assert(raw_pointer);
97  void *aligned_pointer = std::align(_alignment, _size + sizeof(metadata_type), raw_pointer, metadata.space);
98  ts_assert(aligned_pointer);
99  *(metadata_type *)((char *)aligned_pointer + _size) = metadata;
100  return aligned_pointer;
101  }
102 
103  void default_mem_interface::operator delete(void *_ptr, size_t _size)
104  {
105  size_t alignment = ALIGNMENT;
106  void *aligned_pointer = _ptr;
107  metadata_type *metadata = (metadata_type *)((char *)aligned_pointer + _size);
108  void *raw_pointer =
109  (void *)((char *)aligned_pointer - (_size + sizeof(metadata_type) + alignment - metadata->space));
110  free(raw_pointer);
111  }
112 
113 
114 #define task_scheduler_default_mem_interface_catch_all_allocations() \
115  default_mem_interface gDefaultMemInterface; \
116  void *operator new(size_t n) { return gDefaultMemInterface.operator new(n); } \
117  void operator delete(void *p, size_t n) throw() { gDefaultMemInterface.operator delete(p, n); } \
118  void *operator new[](size_t n) { return gDefaultMemInterface.operator new[](n); } \
119  void operator delete[](void *p, size_t n) throw() { gDefaultMemInterface.operator delete[](p, n); }
120 
121 };
Class stl_allocator.
Definition: allocator.h:16
Definition: profilebase.h:128