Lockless Task Scheduler  v1.0a
A lockless task scheduler
lockfreenodedispenser.h
1 // ***********************************************************************
2 // <copyright file="lockfreenodedispenser.h" >
3 // Copyright (c) viknash. All rights reserved.
4 // </copyright>
5 // <summary></summary>
6 // ***********************************************************************
7 #pragma once
8 
9 #include <atomic>
10 
11 #include "atomics.h"
12 #include "lockfreenode.h"
13 
14 namespace task_scheduler {
15 
16 
17  template < typename T, class TMemInterface >
18  class lock_free_node_dispenser : public TMemInterface
19  {
22  typedef std::vector< node_type, stl_allocator< T, TMemInterface > > node_vector;
23 
24  public:
25  lock_free_node_dispenser(uint32_t _start_count = 0)
26  {
27  if (_start_count)
28  {
29  // Array requested
30  array.reserve(_start_count);
31  while (_start_count--)
32  {
33  dispenser.push_front(&array[_start_count]);
34  }
35  }
36  }
37 
39  {
40  if (!array.size())
41  {
42  lock_free_node< T, TMemInterface > *node = dispenser.pop_front();
43  while (node)
44  {
45  delete (node);
46  node = dispenser.pop_front();
47  }
48  }
49  }
50 
51  inline node_type *new_node()
52  {
53  node_type *ret = dispenser.pop_front();
54  if (ret == nullptr)
55  {
56  if (!array.size())
57  {
58  ret = new node_type();
59  }
60  else
61  {
62  ts_print("Insufficient number of pre-allocated Nodes");
63  }
64  }
65 
66  ts_debug_only(ret->next.node = nullptr;);
67  return ret;
68  }
69 
70  inline void free_node(node_type *_node)
71  {
72  assert(_node->next.node == nullptr);
73  dispenser.push_front(_node);
74  }
75 
76  private:
77  node_stack dispenser;
78  node_vector array;
79  };
80 }
Class stl_allocator.
Definition: allocator.h:16
Definition: lockfreenodestack.h:15
Definition: lockfreenodedispenser.h:18
Definition: lockfreenode.h:24