mpscq.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
22 
23 namespace grpc_core {
24 
25 //
26 // MultiProducerSingleConsumerQueue
27 //
28 
30  node->next.store(nullptr, std::memory_order_relaxed);
31  Node* prev = head_.exchange(node, std::memory_order_acq_rel);
32  prev->next.store(node, std::memory_order_release);
33  return prev == &stub_;
34 }
35 
38  bool empty;
39  return PopAndCheckEnd(&empty);
40 }
41 
44  Node* tail = tail_;
45  Node* next = tail_->next.load(std::memory_order_acquire);
46  if (tail == &stub_) {
47  // indicates the list is actually (ephemerally) empty
48  if (next == nullptr) {
49  *empty = true;
50  return nullptr;
51  }
52  tail_ = next;
53  tail = next;
54  next = tail->next.load(std::memory_order_acquire);
55  }
56  if (next != nullptr) {
57  *empty = false;
58  tail_ = next;
59  return tail;
60  }
61  Node* head = head_.load(std::memory_order_acquire);
62  if (tail != head) {
63  *empty = false;
64  // indicates a retry is in order: we're still adding
65  return nullptr;
66  }
67  Push(&stub_);
68  next = tail->next.load(std::memory_order_acquire);
69  if (next != nullptr) {
70  *empty = false;
71  tail_ = next;
72  return tail;
73  }
74  // indicates a retry is in order: we're still adding
75  *empty = false;
76  return nullptr;
77 }
78 
79 //
80 // LockedMultiProducerSingleConsumerQueue
81 //
82 
84  return queue_.Push(node);
85 }
86 
89  if (mu_.TryLock()) {
90  Node* node = queue_.Pop();
91  mu_.Unlock();
92  return node;
93  }
94  return nullptr;
95 }
96 
99  MutexLock lock(&mu_);
100  bool empty = false;
101  Node* node;
102  do {
103  node = queue_.PopAndCheckEnd(&empty);
104  } while (node == nullptr && !empty);
105  return node;
106 }
107 
108 } // namespace grpc_core
mpscq.h
grpc_core::MultiProducerSingleConsumerQueue::Pop
Node * Pop()
Definition: mpscq.cc:37
grpc_core::MultiProducerSingleConsumerQueue::tail_
Node * tail_
Definition: mpscq.h:67
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
grpc_core::MultiProducerSingleConsumerQueue::Node::next
std::atomic< Node * > next
Definition: mpscq.h:39
grpc_core::LockedMultiProducerSingleConsumerQueue::queue_
MultiProducerSingleConsumerQueue queue_
Definition: mpscq.h:93
grpc_core::LockedMultiProducerSingleConsumerQueue::Push
bool Push(Node *node)
Definition: mpscq.cc:83
grpc_core::MultiProducerSingleConsumerQueue::Push
bool Push(Node *node)
Definition: mpscq.cc:29
grpc_core::MultiProducerSingleConsumerQueue::head_
std::atomic< Node * > head_
Definition: mpscq.h:65
google_benchmark.example.empty
def empty(state)
Definition: example.py:31
grpc_core::LockedMultiProducerSingleConsumerQueue::Pop
Node * Pop()
Definition: mpscq.cc:98
grpc_core::Mutex::Unlock
void Unlock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:70
grpc_core::MultiProducerSingleConsumerQueue::stub_
Node stub_
Definition: mpscq.h:68
grpc_core::MultiProducerSingleConsumerQueue::PopAndCheckEnd
Node * PopAndCheckEnd(bool *empty)
Definition: mpscq.cc:43
grpc_core::Mutex::TryLock
bool TryLock() ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(true)
Definition: src/core/lib/gprpp/sync.h:71
grpc_core::MultiProducerSingleConsumerQueue::Node
Definition: mpscq.h:38
next
AllocList * next[kMaxLevel]
Definition: abseil-cpp/absl/base/internal/low_level_alloc.cc:100
grpc_core::LockedMultiProducerSingleConsumerQueue::mu_
Mutex mu_
Definition: mpscq.h:94
grpc_core::LockedMultiProducerSingleConsumerQueue::TryPop
Node * TryPop()
Definition: mpscq.cc:88
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:30