Index: gcc/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/sequence.cc |
diff --git a/gcc/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/sequence.cc b/gcc/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/sequence.cc |
deleted file mode 100644 |
index 19118c952772f7ec9a815ef11516e33adf193298..0000000000000000000000000000000000000000 |
--- a/gcc/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/sequence.cc |
+++ /dev/null |
@@ -1,247 +0,0 @@ |
-// Copyright (C) 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc. |
-// |
-// This file is part of the GNU ISO C++ Library. This library is free |
-// software; you can redistribute it and/or modify it under the |
-// terms of the GNU General Public License as published by the |
-// Free Software Foundation; either version 3, or (at your option) |
-// any later version. |
- |
-// This library is distributed in the hope that it will be useful, |
-// but WITHOUT ANY WARRANTY; without even the implied warranty of |
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-// GNU General Public License for more details. |
- |
-// You should have received a copy of the GNU General Public License along |
-// with this library; see the file COPYING3. If not see |
-// <http://www.gnu.org/licenses/>. |
- |
- |
-#include <testsuite_performance.h> |
- |
-typedef int test_type; |
- |
-// The number of iterations to be performed. |
-int iterations = 1000; |
- |
-// TODO - restore Stefan's comment? i don't understand it. -- fwy |
-int insert_values = 128; |
- |
-class Lock |
-{ |
-public: |
- Lock() {pthread_mutex_init(&mutex, 0);} |
- ~Lock() {pthread_mutex_destroy(&mutex);} |
- |
-public: |
- inline pthread_mutex_t* operator&() {return &mutex;} |
- |
-public: |
- inline void lock() {pthread_mutex_lock(&mutex);} |
- inline void unlock() {pthread_mutex_unlock(&mutex);} |
- |
-private: |
- Lock(const Lock&); |
- Lock& operator=(Lock&); |
- |
-private: |
- pthread_mutex_t mutex; |
-}; |
- |
-class AutoLock |
-{ |
-public: |
- AutoLock(Lock& _lock) |
- : lock(_lock) |
- {lock.lock();} |
- |
- ~AutoLock() {lock.unlock();} |
- |
-private: |
- AutoLock(AutoLock&); |
- AutoLock& operator=(AutoLock&); |
- |
-private: |
- Lock& lock; |
-}; |
- |
-template<typename Container> |
- class Queue |
- { |
- public: |
- Queue() {pthread_cond_init(&condition, 0);} |
- ~Queue() {pthread_cond_destroy(&condition);} |
- |
- public: |
- void push_back(const typename Container::value_type& x); |
- void swap(Container& container); |
- |
- private: |
- pthread_cond_t condition; |
- Lock lock; |
- Container queue; |
- }; |
- |
-template<typename Container> |
- void |
- Queue<Container>::push_back(const typename Container::value_type& value) |
- { |
- AutoLock auto_lock(lock); |
- const bool signal = queue.empty(); |
- queue.insert(queue.end(), value); |
- if (signal) pthread_cond_signal(&condition); |
- } |
- |
-template<typename Container> |
- void |
- Queue<Container>::swap(Container& container) |
- { |
- AutoLock auto_lock(lock); |
- while (queue.empty()) pthread_cond_wait(&condition, &lock); |
- queue.swap(container); |
- } |
- |
-class Thread |
-{ |
- // NB: Make this the last data member of an object defining operator()(). |
-public: |
- class Attributes |
- { |
- public: |
- Attributes(int state = PTHREAD_CREATE_JOINABLE); |
- ~Attributes() {pthread_attr_destroy(&attributes);} |
- |
- public: |
- inline pthread_attr_t* operator&() {return &attributes;} |
- |
- private: |
- pthread_attr_t attributes; |
- }; |
- |
-public: |
- Thread() {thread = pthread_self();} |
- ~Thread(); |
- |
-public: |
- template <typename ThreadOwner> |
- void create(ThreadOwner* owner); |
- |
-private: |
- pthread_t thread; |
-}; |
- |
-Thread::Attributes::Attributes(int state) |
-{ |
- pthread_attr_init(&attributes); |
- pthread_attr_setdetachstate(&attributes, state); |
-} |
- |
-Thread::~Thread() |
-{ |
- if (!pthread_equal(thread, pthread_self())) |
- pthread_join(thread, 0); |
-} |
- |
-template<typename ThreadOwner> |
- void* |
- create_thread(void* _this) |
- { |
- ThreadOwner* owner = static_cast<ThreadOwner*>(_this); |
- (*owner)(); |
- return 0; |
- } |
- |
-template<typename ThreadOwner> |
- void |
- Thread::create(ThreadOwner* owner) |
- { |
- Thread::Attributes attributes; |
- pthread_create(&thread, &attributes, create_thread<ThreadOwner>, owner); |
- } |
- |
-template<typename Container> |
- class Consumer |
- { |
- public: |
- Consumer(Queue<Container>& _queue) |
- : queue(_queue) |
- {thread.create(this);} |
- |
- public: |
- void operator()(); |
- |
- private: |
- Queue<Container>& queue; |
- Thread thread; |
- }; |
- |
-template<typename Container> |
- void |
- Consumer<Container>::operator()() |
- { |
- for (int j = insert_values * iterations; j > 0;) |
- { |
- Container container; |
- queue.swap(container); |
- j -= container.size(); |
- } |
- } |
- |
-template<typename TestType> |
- struct Value : public std::pair<TestType, TestType> |
- { |
- Value() |
- : std::pair<TestType, TestType>(0, 0) |
- { } |
- |
- inline Value operator++() {return ++this->first, *this;} |
- inline operator TestType() const {return this->first;} |
- }; |
- |
-template<typename Container> |
- class ProducerConsumer : private Queue<Container> |
- { |
- public: |
- ProducerConsumer() {thread.create(this);} |
- |
- public: |
- void operator()(); |
- |
- private: |
- Thread thread; |
- }; |
- |
-template<typename Container> |
- void |
- ProducerConsumer<Container>::operator()() |
- { |
- Consumer<Container> consumer(*this); |
- Value<test_type> test_value; |
- for (int j = insert_values * iterations; j-- > 0;) |
- this->push_back(++test_value); |
- } |
- |
-template<typename Container, int Iter> |
- void |
- do_loop() |
- { |
- ProducerConsumer<Container> pc1; |
- ProducerConsumer<Container> pc2; |
- } |
- |
-int |
-main() |
-{ |
-#ifdef TEST_T1 |
-#define thread_type true |
-#endif |
- |
- using __gnu_test::sequence_containers; |
- typedef sequence_containers<test_type, thread_type>::type container_types; |
- |
- typedef test_sequence<thread_type> test_type; |
- test_type test("producer_consumer_sequence"); |
- __gnu_cxx::typelist::apply(test, container_types()); |
- |
- return 0; |
-} |
- |