lfqueue.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include <util/thread/lfqueue.h>
  3. #include <util/generic/ptr.h>
  4. namespace NNeh {
  5. template <class T>
  6. class TAutoLockFreeQueue {
  7. struct TCounter : TAtomicCounter {
  8. inline void IncCount(const T* const&) {
  9. Inc();
  10. }
  11. inline void DecCount(const T* const&) {
  12. Dec();
  13. }
  14. };
  15. public:
  16. typedef TAutoPtr<T> TRef;
  17. inline ~TAutoLockFreeQueue() {
  18. TRef tmp;
  19. while (Dequeue(&tmp)) {
  20. }
  21. }
  22. inline bool Dequeue(TRef* t) {
  23. T* res = nullptr;
  24. if (Q_.Dequeue(&res)) {
  25. t->Reset(res);
  26. return true;
  27. }
  28. return false;
  29. }
  30. inline void Enqueue(TRef& t) {
  31. Q_.Enqueue(t.Get());
  32. Y_UNUSED(t.Release());
  33. }
  34. inline size_t Size() {
  35. return Q_.GetCounter().Val();
  36. }
  37. private:
  38. TLockFreeQueue<T*, TCounter> Q_;
  39. };
  40. }