Lockless Task Scheduler  v1.0a
A lockless task scheduler
concurrency.h
1 // ***********************************************************************
2 // Assembly : task_scheduler
3 // Author : viknash
4 // ***********************************************************************
5 // <copyright file="concurrency.h" >
6 // Copyright (c) viknash. All rights reserved.
7 // </copyright>
8 // <summary></summary>
9 // ***********************************************************************
10 #pragma once
11 
12 #include <cstdint>
13 #include <mutex>
14 
15 #include "platform.h"
16 #include "print.h"
17 
21 namespace task_scheduler
22 {
23  class event
24  {
25  public:
26  void signal();
27  void wait();
28 
29  protected:
33  std::mutex lock;
37  std::condition_variable cond_var;
38  };
39 
40  inline void event::signal()
41  {
42  cond_var.notify_one();
43  }
44 
45  inline void event::wait()
46  {
47  std::unique_lock< std::mutex > signal_lock(lock);
48  cond_var.wait(signal_lock);
49  }
50 
51  class alarm : protected event
52  {
53  public :
54  typedef std::function<bool()> wake_up_function;
55  alarm();
56  void sleep(wake_up_function _wake_up_func);
57  void wake_up();
58  protected:
59  bool sleeping;
60  };
61 
62  inline alarm::alarm() :
63  sleeping(false)
64  {
65 
66  }
67 
68  inline void alarm::sleep(wake_up_function _wake_up_func)
69  {
70  std::unique_lock< std::mutex > signal_lock(lock);
71  while (!_wake_up_func)
72  {
73  ts_print("sleep");
74  sleeping = true;
75  cond_var.wait(signal_lock);
76  sleeping = false;
77  ts_print("awake");
78  }
79  }
80 
81  inline void alarm::wake_up()
82  {
83  lock.lock();
84  if (sleeping)
85  {
86  lock.unlock();
87  cond_var.notify_one();
88  }
89  else
90  {
91  lock.unlock();
92  }
93  }
94 
95 };
Class stl_allocator.
Definition: allocator.h:16
std::mutex lock
The signal
Definition: concurrency.h:33
Definition: concurrency.h:51
std::condition_variable cond_var
The radio
Definition: concurrency.h:37
Definition: concurrency.h:23