TokenBucket.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // ======================================================================
  2. // \title TokenBucket.cpp
  3. // \author vwong
  4. // \brief cpp file for a rate limiter utility class
  5. //
  6. // \copyright
  7. //
  8. // Copyright (C) 2009-2020 California Institute of Technology.
  9. //
  10. // ALL RIGHTS RESERVED. United States Government Sponsorship
  11. // acknowledged.
  12. // ======================================================================
  13. #include <Utils/TokenBucket.hpp>
  14. namespace Utils {
  15. TokenBucket ::
  16. TokenBucket (
  17. U32 replenishInterval,
  18. U32 maxTokens,
  19. U32 replenishRate,
  20. U32 startTokens,
  21. Fw::Time startTime
  22. ) :
  23. m_replenishInterval(replenishInterval),
  24. m_maxTokens(maxTokens),
  25. m_replenishRate(replenishRate),
  26. m_tokens(startTokens),
  27. m_time(startTime)
  28. {
  29. }
  30. TokenBucket ::
  31. TokenBucket (
  32. U32 replenishInterval,
  33. U32 maxTokens
  34. ) :
  35. m_replenishInterval(replenishInterval),
  36. m_maxTokens(maxTokens),
  37. m_replenishRate(1),
  38. m_tokens(maxTokens),
  39. m_time(0, 0)
  40. {
  41. FW_ASSERT(this->m_maxTokens <= MAX_TOKEN_BUCKET_TOKENS, this->m_maxTokens);
  42. }
  43. void TokenBucket ::
  44. setReplenishInterval(
  45. U32 replenishInterval
  46. )
  47. {
  48. this->m_replenishInterval = replenishInterval;
  49. }
  50. void TokenBucket ::
  51. setMaxTokens(
  52. U32 maxTokens
  53. )
  54. {
  55. this->m_maxTokens = maxTokens;
  56. }
  57. void TokenBucket ::
  58. setReplenishRate(
  59. U32 replenishRate
  60. )
  61. {
  62. this->m_replenishRate = replenishRate;
  63. }
  64. void TokenBucket ::
  65. replenish()
  66. {
  67. if (this->m_tokens < this->m_maxTokens) {
  68. this->m_tokens = this->m_maxTokens;
  69. }
  70. }
  71. U32 TokenBucket ::
  72. getReplenishInterval() const
  73. {
  74. return this->m_replenishInterval;
  75. }
  76. U32 TokenBucket ::
  77. getMaxTokens() const
  78. {
  79. return this->m_maxTokens;
  80. }
  81. U32 TokenBucket ::
  82. getReplenishRate() const
  83. {
  84. return this->m_replenishRate;
  85. }
  86. U32 TokenBucket ::
  87. getTokens() const
  88. {
  89. return this->m_tokens;
  90. }
  91. bool TokenBucket ::
  92. trigger(
  93. const Fw::Time time
  94. )
  95. {
  96. // attempt replenishing
  97. if (this->m_replenishRate > 0) {
  98. Fw::Time replenishInterval = Fw::Time(this->m_replenishInterval / 1000000, this->m_replenishInterval % 1000000);
  99. Fw::Time nextTime = Fw::Time::add(this->m_time, replenishInterval);
  100. while (this->m_tokens < this->m_maxTokens && nextTime <= time) {
  101. // replenish by replenish rate, or up to maxTokens
  102. this->m_tokens += FW_MIN(this->m_replenishRate, this->m_maxTokens - this->m_tokens);
  103. this->m_time = nextTime;
  104. nextTime = Fw::Time::add(this->m_time, replenishInterval);
  105. }
  106. if (this->m_tokens >= this->m_maxTokens && this->m_time < time) {
  107. this->m_time = time;
  108. }
  109. }
  110. // attempt consuming token
  111. if (this->m_tokens > 0) {
  112. this->m_tokens--;
  113. return true;
  114. } else {
  115. return false;
  116. }
  117. }
  118. } // end namespace Utils