Lockless Task Scheduler  v1.0a
A lockless task scheduler
lockfreestack.h
1 // ***********************************************************************
2 // <copyright file="lockfreestack.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  template<typename T, class TMemInterface, class TDispenser >
18  {
22 
23  public:
24  inline lock_free_stack(TDispenser* _dispenser = nullptr);
25  inline ~lock_free_stack();
26 
27  inline void push_front(const T& _value);
28 
29  bool pop_front(T& _out);
30 
31  inline bool empty();
32 
33  private:
34 
35  node_stack_type stack;
36  TDispenser* dispenser;
37  };
38 
39  template<typename T, class TMemInterface, class TDispenser >
41  : dispenser(_dispenser)
42  {
43 
44  }
45 
46  template<typename T, class TMemInterface, class TDispenser >
48  {
49  T temp;
50  while (pop_front(temp) == true) {}
51  }
52 
53  template<typename T, class TMemInterface, class TDispenser >
55  {
56  node_type* node = dispenser->new_node();
57  node->store(_value);
58  stack.push_front(node);
59  }
60 
61  template<typename T, class TMemInterface, class TDispenser >
63  {
64  node_type* node;
65  node = stack.pop_front();
66 
67  if (!node)
68  return false;
69 
70  _out = node->load();
71  dispenser->free_node(node);
72 
73  return true;
74  }
75 
76  template<typename T, class TMemInterface, class TDispenser >
78  {
79  return stack.empty();
80  }
81 
82 }
Class stl_allocator.
Definition: allocator.h:16
Definition: lockfreenodestack.h:15
Definition: lockfreenode.h:24
Definition: lockfreestack.h:17