summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/ConcurrentQueue.h
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-07-13 15:53:10 +0000
committerAlan Conway <aconway@apache.org>2007-07-13 15:53:10 +0000
commit2b345eb0d9f03db3a0b14fe759dc696e508b6c01 (patch)
tree57172971526ffa7e9f172ec99d4bc2f7b460b41b /cpp/src/qpid/sys/ConcurrentQueue.h
parentc01f57205a289c5af528e7401c1dd93d2cff18fe (diff)
downloadqpid-python-2b345eb0d9f03db3a0b14fe759dc696e508b6c01.tar.gz
* src/qpid/sys/ConcurrentQueue.h: Thread-safe queue with atomic pop()
* src/tests/ConcurrentQueue.cpp: Experimental code to compare a dual-vector, dual-lock implementation with a simple locked deque. Results indicate the more complex design does not perform any better, so ConcurrentQueue.h uses the simpler design. Not part of default test harness, run by hand to see results. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@556045 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/ConcurrentQueue.h')
-rw-r--r--cpp/src/qpid/sys/ConcurrentQueue.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/cpp/src/qpid/sys/ConcurrentQueue.h b/cpp/src/qpid/sys/ConcurrentQueue.h
new file mode 100644
index 0000000000..dd7689666b
--- /dev/null
+++ b/cpp/src/qpid/sys/ConcurrentQueue.h
@@ -0,0 +1,67 @@
+#ifndef QPID_SYS_CONCURRENTQUEUE_H
+#define QPID_SYS_CONCURRENTQUEUE_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/sys/Mutex.h"
+
+#include <deque>
+
+namespace qpid {
+namespace sys {
+
+/**
+ * Thread-safe queue that allows threads to push items onto
+ * the queue concurrently with threads popping items off the
+ * queue.
+ */
+template <class T> class ConcurrentQueue {
+ public:
+ /** Push a data item onto the back of the queue */
+ void push(const T& data) {
+ Mutex::ScopedLock l(lock);
+ queue.push_back(data);
+ }
+
+ /** If the queue is non-empty, pop the front item into data and
+ * return true. If the queue is empty, return false
+ */
+ bool pop(T& data) {
+ Mutex::ScopedLock l(lock);
+ if (queue.empty())
+ return false;
+ else {
+ data = queue.front();
+ queue.pop_front();
+ return true;
+ }
+ }
+
+ private:
+ Mutex lock;
+ std::deque<T> queue;
+};
+
+}} // namespace qpid::sys
+
+
+#endif /*!QPID_SYS_CONCURRENTQUEUE_H*/