Add code to test join of single threads or groups
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 7 Oct 2005 13:56:02 +0000 (13:56 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 7 Oct 2005 13:56:02 +0000 (13:56 +0000)
src/Makefile.am
src/test_boost_threads.cpp

index 8e09b58..269edad 100644 (file)
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.8 2005-10-07 11:42:04 adam Exp $
+## $Id: Makefile.am,v 1.9 2005-10-07 13:56:02 adam Exp $
 
 AM_CXXFLAGS = $(YAZPPINC) $(XSLT_CFLAGS)
 
@@ -29,4 +29,5 @@ p2_SOURCES=p2_frontend.cpp p2_msg.cpp p2.cpp p2_frontend.h \
 LDADD= $(YAZPPLALIB) $(XSLT_LIBS)
 
 test_filter1_LDADD = $(LDADD) -lboost_unit_test_framework
+test_boost_threads_LDADD = $(LDADD) -lboost_unit_test_framework
 
index 08af856..850aaf0 100644 (file)
@@ -1,92 +1,92 @@
 
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/thread.hpp>
+
+#define BOOST_AUTO_TEST_MAIN
+#include <boost/test/auto_unit_test.hpp>
+
 #include <list>
 #include <iostream>
 
-boost::mutex io_mutex; // The iostreams are not guaranteed to be thread-safe!
-
 class counter
 {
    public:
       counter() : count(0) { }
       
-      int increment() {
-         boost::mutex::scoped_lock scoped_lock(mutex);
-         return ++count;
-      }
-      
-   private:
-      boost::mutex mutex;
-      int count;
+    int increment() {
+        boost::mutex::scoped_lock scoped_lock(mutex);
+        return ++count;
+    }
+    
+private:
+    boost::mutex mutex;
+    int count;
 };
 
 
 counter c;
 
-void change_count()
-{
-   int i = c.increment();
-   boost::mutex::scoped_lock scoped_lock(io_mutex);
-   std::cout << "count == " << i << std::endl;
-}
-
-
 class worker {
 public:
     void operator() (void) {
-        int i = c.increment();
-        
-        i = c.increment();
-        
-        i = c.increment();
-        boost::mutex::scoped_lock scoped_lock(io_mutex);
-        std::cout << "count == " << i << std::endl;
+        c.increment();
     }
-    virtual ~worker() { std::cout << "destroyed\n"; }
 };
 
+#define USE_GROUP 1
 
 
-int main(int, char*[])
+BOOST_AUTO_TEST_CASE( thread_group )
 {
-   try 
-   {
-      const int num_threads = 4;
-      boost::thread_group thrds;
-      
-      std::list<boost::thread *> thread_list;
-      
-      for (int i=0; i < num_threads; ++i)
-      {
-          // thrds.create_thread(&change_count);
-          worker *w = new worker;
+    try 
+    {
+        const int num_threads = 4;
+        boost::thread_group thrds;
+        
+        for (int i=0; i < num_threads; ++i)
+        {
+            worker w;
+            thrds.add_thread(new boost::thread(w));
+        }
+        thrds.join_all();
+    }
+    catch (...) 
+    {
+        BOOST_CHECK(false);
+    }
+    BOOST_CHECK(c.increment() == 5);
+}
 
-          boost::thread *thr = new boost::thread(*w);
 
-          thrds.add_thread(thr);
+BOOST_AUTO_TEST_CASE( thread_list )
+{
+    try 
+    {
+        const int num_threads = 4;
+        std::list<boost::thread *> thread_list;
+        
+        for (int i=0; i < num_threads; ++i)
+        {
+            worker w;
+            thread_list.push_back(new boost::thread(w));
+        }
+        std::list<boost::thread *>::iterator it;
+        for (it = thread_list.begin(); it != thread_list.end(); it++)
+        {
+            (*it)->join();
+            delete *it;
+        }
 
-          thread_list.push_back(thr);
-      }
-      
-      thrds.join_all();
-#if 0
-      std::list<boost::thread *>::iterator it;
-      for (it = thread_list.begin(); it != thread_list.end(); it++)
-      {
-          delete *it;
-          *it = 0;
-      }
-#endif
-   }
-   catch (std::exception &e) 
-   {
-      std::cout << e.what() << "\n";
-      exit(1);
-   }
-   exit(0);
+    }
+    catch (...) 
+    {
+        BOOST_CHECK(false);
+    }
+    BOOST_CHECK(c.increment() == 10);
 }
 
+
+
 /*
  * Local variables:
  * c-basic-offset: 4