You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2009/11/24 15:31:32 UTC
svn commit: r883703 - in /activemq/activemq-cpp/trunk/activemq-cpp/src:
main/ main/decaf/internal/util/concurrent/ test/
test/decaf/internal/util/concurrent/
Author: tabish
Date: Tue Nov 24 14:31:31 2009
New Revision: 883703
URL: http://svn.apache.org/viewvc?rev=883703&view=rev
Log:
Add some basic work on Transferer classes for use in a SynchronousQueue
Added:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h (with props)
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/Transferer.h
activemq/activemq-cpp/trunk/activemq-cpp/src/test/Makefile.am
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am?rev=883703&r1=883702&r2=883703&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am Tue Nov 24 14:31:31 2009
@@ -1106,6 +1106,8 @@
decaf/internal/util/concurrent/ConditionImpl.h \
decaf/internal/util/concurrent/MutexImpl.h \
decaf/internal/util/concurrent/SynchronizableImpl.h \
+ decaf/internal/util/concurrent/TransferQueue.h \
+ decaf/internal/util/concurrent/TransferStack.h \
decaf/internal/util/concurrent/Transferer.h \
decaf/internal/util/concurrent/unix/ConditionHandle.h \
decaf/internal/util/concurrent/unix/MutexHandle.h \
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h Tue Nov 24 14:31:31 2009
@@ -0,0 +1,348 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUE_H_
+#define _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUE_H_
+
+#include <decaf/internal/util/concurrent/Transferer.h>
+
+#include <decaf/util/concurrent/locks/LockSupport.h>
+#include <decaf/util/concurrent/atomic/AtomicReference.h>
+#include <decaf/util/concurrent/TimeoutException.h>
+#include <decaf/lang/exceptions/InterruptedException.h>
+
+#include <decaf/lang/Thread.h>
+
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
+
+ using decaf::util::concurrent::atomic::AtomicReference;
+
+ /**
+ * This extends Scherer-Scott dual queue algorithm, differing,
+ * among other ways, by using modes within nodes rather than
+ * marked pointers. The algorithm is a little simpler than
+ * that for stacks because fulfillers do not need explicit
+ * nodes, and matching is done by CAS'ing QNode.item field
+ * from non-null to null (for put) or vice versa (for take).
+ */
+ template< typename E >
+ class TransferQueue : public Transferer<E> {
+ private:
+
+// /** Node class for TransferQueue. */
+// class QNode {
+// private:
+//
+// AtomicReference<QNode> next; // next node in queue
+// volatile decaf::lang::Thread* waiter; // to control park/unpark
+// AtomicReference<E*> item; // CAS'ed to or from null
+//
+// bool data;
+// bool cancelled;
+//
+// public:
+//
+// QNode() : cancelled( false ), data( false ) {
+// }
+//
+// QNode( E* item ) : cancelled( false ), data( true ) {
+// this->item.set( item );
+// }
+//
+// bool casNext( QNode* cmp, QNode* val ) {
+// return ( this->next == cmp && this->next.compareAndSet( cmp, val ) );
+// }
+//
+// bool casItem( E* cmp, E* val ) {
+// return ( this->item == cmp && this->item.compareAndSet( cmp, val ) );
+// }
+//
+// /**
+// * Tries to cancel by CAS'ing ref to NULL if that succeeds then we mark as cancelled.
+// */
+// void tryCancel( E* cmp ) {
+// if( item.compareAndSet( cmp, NULL ) ) {
+// this->cancelled = true;
+// }
+// }
+//
+// bool isCancelled() {
+// return this->item == this;
+// }
+//
+// /**
+// * Returns true if this node is known to be off the queue
+// * because its next pointer has been forgotten due to
+// * an advanceHead operation.
+// */
+// bool isOffList() {
+// return this->next == NULL;
+// }
+// };
+
+ private:
+
+// decaf::util::concurrent::atomic::AtomicReference<QNode> head;
+// decaf::util::concurrent::atomic::AtomicReference<QNode> tail;
+//
+// decaf::util::concurrent::atomic::AtomicReference<QNode> cleanMe;
+
+ public:
+
+ TransferQueue() {
+// // Initialize with a dummy Node.
+// this->head.set( new QNode() );
+// this->tail.set( this->head.get() );
+ }
+
+ virtual ~TransferQueue() {}
+
+ virtual void transfer( E* e, bool timed, long long nanos )
+ throw( decaf::util::concurrent::TimeoutException,
+ decaf::lang::exceptions::InterruptedException )
+ {
+
+ }
+
+ virtual E* transfer( bool timed, long long nanos )
+ throw( decaf::util::concurrent::TimeoutException,
+ decaf::lang::exceptions::InterruptedException )
+ {
+ return NULL;
+ }
+
+ /**
+ * Puts or takes an item.
+ */
+// E* transfer( E* e, bool timed, long long nanos ) {
+
+ /* Basic algorithm is to loop trying to take either of
+ * two actions:
+ *
+ * 1. If queue apparently empty or holding same-mode nodes,
+ * try to add node to queue of waiters, wait to be
+ * fulfilled (or cancelled) and return matching item.
+ *
+ * 2. If queue apparently contains waiting items, and this
+ * call is of complementary mode, try to fulfill by CAS'ing
+ * item field of waiting node and dequeuing it, and then
+ * returning matching item.
+ *
+ * In each case, along the way, check for and try to help
+ * advance head and tail on behalf of other stalled/slow
+ * threads.
+ *
+ * The loop starts off with a null check guarding against
+ * seeing uninitialized head or tail values. This never
+ * happens in current SynchronousQueue, but could if
+ * callers held non-volatile/final ref to the
+ * transferer. The check is here anyway because it places
+ * null checks at top of loop, which is usually faster
+ * than having them implicitly interspersed.
+ */
+
+// QNode s = null; // constructed/reused as needed
+// boolean isData = (e != null);
+//
+// for (;;) {
+// QNode t = tail;
+// QNode h = head;
+// if (t == null || h == null) // saw uninitialized value
+// continue; // spin
+//
+// if (h == t || t.isData == isData) { // empty or same-mode
+// QNode tn = t.next;
+// if (t != tail) // inconsistent read
+// continue;
+// if (tn != null) { // lagging tail
+// advanceTail(t, tn);
+// continue;
+// }
+// if (timed && nanos <= 0) // can't wait
+// return null;
+// if (s == null)
+// s = new QNode(e, isData);
+// if (!t.casNext(null, s)) // failed to link in
+// continue;
+//
+// advanceTail(t, s); // swing tail and wait
+// Object x = awaitFulfill(s, e, timed, nanos);
+// if (x == s) { // wait was cancelled
+// clean(t, s);
+// return null;
+// }
+//
+// if (!s.isOffList()) { // not already unlinked
+// advanceHead(t, s); // unlink if head
+// if (x != null) // and forget fields
+// s.item = s;
+// s.waiter = null;
+// }
+// return (x != null)? x : e;
+//
+// } else { // complementary-mode
+// QNode m = h.next; // node to fulfill
+// if (t != tail || m == null || h != head)
+// continue; // inconsistent read
+//
+// Object x = m.item;
+// if (isData == (x != null) || // m already fulfilled
+// x == m || // m cancelled
+// !m.casItem(x, e)) { // lost CAS
+// advanceHead(h, m); // dequeue and retry
+// continue;
+// }
+//
+// advanceHead(h, m); // successfully fulfilled
+// LockSupport.unpark(m.waiter);
+// return (x != null)? x : e;
+// }
+// }
+// }
+
+ private:
+
+ /**
+ * Spins/blocks until node s is fulfilled.
+ *
+ * @param s the waiting node
+ * @param e the comparison value for checking match
+ * @param timed true if timed wait
+ * @param nanos timeout value
+ * @return matched item, or s if cancelled
+ */
+// Object awaitFulfill(QNode s, Object e, boolean timed, long nanos) {
+// /* Same idea as TransferStack.awaitFulfill */
+// long lastTime = (timed)? System.nanoTime() : 0;
+// Thread w = Thread.currentThread();
+// int spins = ((head.next == s) ?
+// (timed? maxTimedSpins : maxUntimedSpins) : 0);
+// for (;;) {
+// if (w.isInterrupted())
+// s.tryCancel(e);
+// Object x = s.item;
+// if (x != e)
+// return x;
+// if (timed) {
+// long now = System.nanoTime();
+// nanos -= now - lastTime;
+// lastTime = now;
+// if (nanos <= 0) {
+// s.tryCancel(e);
+// continue;
+// }
+// }
+// if (spins > 0)
+// --spins;
+// else if (s.waiter == null)
+// s.waiter = w;
+// else if (!timed)
+// LockSupport.park();
+// else if (nanos > spinForTimeoutThreshold)
+// LockSupport.parkNanos(nanos);
+// }
+// }
+
+ /**
+ * Gets rid of cancelled node s with original predecessor pred.
+ */
+// void clean(QNode pred, QNode s) {
+// s.waiter = null; // forget thread
+// /*
+// * At any given time, exactly one node on list cannot be
+// * deleted -- the last inserted node. To accommodate this,
+// * if we cannot delete s, we save its predecessor as
+// * "cleanMe", deleting the previously saved version
+// * first. At least one of node s or the node previously
+// * saved can always be deleted, so this always terminates.
+// */
+// while (pred.next == s) { // Return early if already unlinked
+// QNode h = head;
+// QNode hn = h.next; // Absorb cancelled first node as head
+// if (hn != null && hn.isCancelled()) {
+// advanceHead(h, hn);
+// continue;
+// }
+// QNode t = tail; // Ensure consistent read for tail
+// if (t == h)
+// return;
+// QNode tn = t.next;
+// if (t != tail)
+// continue;
+// if (tn != null) {
+// advanceTail(t, tn);
+// continue;
+// }
+// if (s != t) { // If not tail, try to unsplice
+// QNode sn = s.next;
+// if (sn == s || pred.casNext(s, sn))
+// return;
+// }
+// QNode dp = cleanMe;
+// if (dp != null) { // Try unlinking previous cancelled node
+// QNode d = dp.next;
+// QNode dn;
+// if (d == null || // d is gone or
+// d == dp || // d is off list or
+// !d.isCancelled() || // d not cancelled or
+// (d != t && // d not tail and
+// (dn = d.next) != null && // has successor
+// dn != d && // that is on list
+// dp.casNext(d, dn))) // d unspliced
+// casCleanMe(dp, null);
+// if (dp == pred)
+// return; // s is already saved node
+// } else if (casCleanMe(null, pred))
+// return; // Postpone cleaning s
+// }
+// }
+
+// /**
+// * Tries to cas nh as new head; if successful, unlink
+// * old head's next node to avoid garbage retention.
+// */
+// void advanceHead( QNode* h, QNode* nh ) {
+// if( h == head.get() && this->head.compareAndSet( h, nh ) ) {
+// h->next = h; // forget old next
+// }
+// }
+//
+// /**
+// * Tries to cas nt as new tail.
+// */
+// void advanceTail( QNode* t, QNode* nt ) {
+// if( this->tail.get() == t ) {
+// this->tail.compareAndSet( t, nt );
+// }
+// }
+//
+// /**
+// * Tries to CAS cleanMe slot.
+// */
+// bool casCleanMe( QNode* cmp, QNode* val ) {
+// return ( this->cleanMe.get() == cmp &&
+// this->cleanMe.compareAndSet( cmp, val ) );
+// }
+
+ };
+
+}}}}
+
+#endif /* _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUE_H_ */
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferQueue.h
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h Tue Nov 24 14:31:31 2009
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACK_H_
+#define _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACK_H_
+
+#include <decaf/internal/util/concurrent/Transferer.h>
+
+#include <decaf/util/concurrent/TimeoutException.h>
+#include <decaf/lang/exceptions/InterruptedException.h>
+
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
+
+ template<typename E>
+ class TransferStack : public Transferer<E> {
+ public:
+
+ TransferStack() {}
+ virtual ~TransferStack() {}
+
+ virtual void transfer( E* e, bool timed, long long nanos )
+ throw( decaf::util::concurrent::TimeoutException,
+ decaf::lang::exceptions::InterruptedException )
+ {
+
+ }
+
+ virtual E* transfer( bool timed, long long nanos )
+ throw( decaf::util::concurrent::TimeoutException,
+ decaf::lang::exceptions::InterruptedException )
+ {
+ return NULL;
+ }
+
+ };
+
+}}}}
+
+#endif /* _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACK_H_ */
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/TransferStack.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/Transferer.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/Transferer.h?rev=883703&r1=883702&r2=883703&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/Transferer.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/util/concurrent/Transferer.h Tue Nov 24 14:31:31 2009
@@ -15,21 +15,21 @@
* limitations under the License.
*/
-
#ifndef _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERER_H_
#define _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERER_H_
#include <decaf/lang/exceptions/InterruptedException.h>
#include <decaf/util/concurrent/TimeoutException.h>
-namespace decaf{
-namespace util{
-namespace concurrent{
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
/**
* Shared internal API for dual stacks and queues.
*/
- template<typename E>
+ template< typename E >
class Transferer {
/**
@@ -44,7 +44,7 @@
* @throws InterruptedException if the thread was interrupted while
* waiting for the consumer to accept the item offered.
*/
- virtual void transfer( E e, bool timed, long long nanos )
+ virtual void transfer( E* e, bool timed, long long nanos )
throw( decaf::util::concurrent::TimeoutException,
decaf::lang::exceptions::InterruptedException ) = 0;
@@ -61,12 +61,12 @@
* @throws InterruptedException if the thread was interrupted while
* waiting for the producer to offer an item.
*/
- virtual E transfer( bool timed, long long nanos )
+ virtual E* transfer( bool timed, long long nanos )
throw( decaf::util::concurrent::TimeoutException,
decaf::lang::exceptions::InterruptedException ) = 0;
};
-}}}
+}}}}
#endif /* _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERER_H_ */
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/Makefile.am?rev=883703&r1=883702&r2=883703&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/Makefile.am Tue Nov 24 14:31:31 2009
@@ -80,6 +80,8 @@
decaf/internal/nio/ShortArrayBufferTest.cpp \
decaf/internal/util/ByteArrayAdapterTest.cpp \
decaf/internal/util/TimerTaskHeapTest.cpp \
+ decaf/internal/util/concurrent/TransferQueueTest.cpp \
+ decaf/internal/util/concurrent/TransferStackTest.cpp \
decaf/io/BufferedInputStreamTest.cpp \
decaf/io/BufferedOutputStreamTest.cpp \
decaf/io/ByteArrayInputStreamTest.cpp \
@@ -208,6 +210,8 @@
decaf/internal/nio/ShortArrayBufferTest.h \
decaf/internal/util/ByteArrayAdapterTest.h \
decaf/internal/util/TimerTaskHeapTest.h \
+ decaf/internal/util/concurrent/TransferQueueTest.h \
+ decaf/internal/util/concurrent/TransferStackTest.h \
decaf/io/BufferedInputStreamTest.h \
decaf/io/BufferedOutputStreamTest.h \
decaf/io/ByteArrayInputStreamTest.h \
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp Tue Nov 24 14:31:31 2009
@@ -0,0 +1,39 @@
+/*
+ * 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 "TransferQueueTest.h"
+
+#include <decaf/internal/util/concurrent/TransferQueue.h>
+
+using namespace decaf;
+using namespace decaf::internal;
+using namespace decaf::internal::util;
+using namespace decaf::internal::util::concurrent;
+
+////////////////////////////////////////////////////////////////////////////////
+TransferQueueTest::TransferQueueTest() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+TransferQueueTest::~TransferQueueTest() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void TransferQueueTest::test() {
+
+ TransferQueue<int> queue;
+}
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h Tue Nov 24 14:31:31 2009
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUETEST_H_
+#define _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUETEST_H_
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <decaf/util/Config.h>
+
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
+
+ class TransferQueueTest : public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE( TransferQueueTest );
+ CPPUNIT_TEST( test );
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+
+ TransferQueueTest();
+ virtual ~TransferQueueTest();
+
+ void test();
+
+ };
+
+}}}}
+
+#endif /* _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERQUEUETEST_H_ */
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferQueueTest.h
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp Tue Nov 24 14:31:31 2009
@@ -0,0 +1,40 @@
+/*
+ * 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 "TransferStackTest.h"
+
+#include <decaf/internal/util/concurrent/TransferStack.h>
+
+using namespace decaf;
+using namespace decaf::internal;
+using namespace decaf::internal::util;
+using namespace decaf::internal::util::concurrent;
+
+////////////////////////////////////////////////////////////////////////////////
+TransferStackTest::TransferStackTest() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+TransferStackTest::~TransferStackTest() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void TransferStackTest::test() {
+
+ TransferStack<int> stack;
+
+}
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h?rev=883703&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h Tue Nov 24 14:31:31 2009
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACKTEST_H_
+#define _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACKTEST_H_
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <decaf/internal/util/ByteArrayAdapter.h>
+#include <decaf/util/Config.h>
+
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
+
+ class TransferStackTest : public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE( TransferStackTest );
+ CPPUNIT_TEST( test );
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+
+ TransferStackTest();
+ virtual ~TransferStackTest();
+
+ void test();
+
+ };
+
+}}}}
+
+#endif /* _DECAF_INTERNAL_UTIL_CONCURRENT_TRANSFERSTACKTEST_H_ */
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/internal/util/concurrent/TransferStackTest.h
------------------------------------------------------------------------------
svn:eol-style = native