condition_variable.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /****************************************************************************
  2. *
  3. * Copyright (c) 2017, Michael Becker (michael.f.becker@gmail.com)
  4. *
  5. * This file is part of the FreeRTOS Add-ons project.
  6. *
  7. * Source Code:
  8. * https://github.com/michaelbecker/freertos-addons
  9. *
  10. * Project Page:
  11. * http://michaelbecker.github.io/freertos-addons/
  12. *
  13. * On-line Documentation:
  14. * http://michaelbecker.github.io/freertos-addons/docs/html/index.html
  15. *
  16. * Permission is hereby granted, free of charge, to any person obtaining a
  17. * copy of this software and associated documentation files
  18. * (the "Software"), to deal in the Software without restriction, including
  19. * without limitation the rights to use, copy, modify, merge, publish,
  20. * distribute, sublicense, and/or sell copies of the Software, and to
  21. * permit persons to whom the Software is furnished to do so,subject to the
  22. * following conditions:
  23. *
  24. * + The above copyright notice and this permission notice shall be included
  25. * in all copies or substantial portions of the Software.
  26. * + Credit is appreciated, but not required, if you find this project
  27. * useful enough to include in your application, product, device, etc.
  28. *
  29. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  30. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  31. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  32. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  33. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  34. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  35. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  36. *
  37. ***************************************************************************/
  38. #ifndef CONDITION_VARIABLE_HPP_
  39. #define CONDITION_VARIABLE_HPP_
  40. #include <list>
  41. #include "mutex.hpp"
  42. /**
  43. * Condition variables are an additon to the FreeRTOS C++ Wrapper
  44. * classes. If you want to include them, you need to define the
  45. * following in your makefile or project.
  46. */
  47. #ifdef CPP_FREERTOS_CONDITION_VARIABLES
  48. namespace cpp_freertos {
  49. //
  50. // Forward declaration. We need to prevent a circular dependency
  51. // between the Thread class and the ConditionVariable class.
  52. //
  53. class Thread;
  54. /**
  55. * Class implementation of condition variable based on
  56. * FreeRTOS C++ Wrapper classes.
  57. *
  58. * A condition variable isn't really a variable. It's a list
  59. * of threads.
  60. *
  61. * The design here is that a Thread "waits", and a ConditionVariable
  62. * "signals". This affects where the public interfaces reside.
  63. */
  64. class ConditionVariable {
  65. /////////////////////////////////////////////////////////////////////////
  66. //
  67. // Public API
  68. //
  69. /////////////////////////////////////////////////////////////////////////
  70. public:
  71. /**
  72. * Constructor to create a condition variable.
  73. */
  74. ConditionVariable();
  75. /**
  76. * Signal a thread waiting on this ConditionVariable.
  77. * Signaling is implemented as FIFO.
  78. */
  79. void Signal();
  80. /**
  81. * Signal all threads waiting on this ConditionVariable.
  82. */
  83. void Broadcast();
  84. /////////////////////////////////////////////////////////////////////////
  85. //
  86. // Private API
  87. // The internals of this wrapper class.
  88. //
  89. /////////////////////////////////////////////////////////////////////////
  90. private:
  91. /**
  92. * Protect the internal ConditionVariable state.
  93. */
  94. MutexStandard Lock;
  95. /**
  96. * Implementation of a wait list of Threads.
  97. */
  98. std::list<Thread *> WaitList;
  99. /**
  100. * Internal helper function to queue a Thread to
  101. * this ConditionVariable's wait list.
  102. */
  103. void AddToWaitList(Thread *thread);
  104. /**
  105. * The Thread class and the ConditionVariable class are interdependent.
  106. * If we allow the Thread class to access the internals of the
  107. * ConditionVariable, we can reduce the public interface which is a
  108. * good thing.
  109. */
  110. friend class Thread;
  111. };
  112. }
  113. #endif
  114. #endif