From e0750fbbc76732b3e8aa83ce786c28fcbf24374d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 18 Aug 2010 17:57:38 +0200 Subject: Add multi-threading test --- common/threads/driver.cxx | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 common/threads/driver.cxx (limited to 'common/threads/driver.cxx') diff --git a/common/threads/driver.cxx b/common/threads/driver.cxx new file mode 100644 index 0000000..9ae5b50 --- /dev/null +++ b/common/threads/driver.cxx @@ -0,0 +1,146 @@ +// file : common/threads/driver.cxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +// Test operations in a multi-threaded environment. +// + +#include +#include // std::auto_ptr +#include +#include + +#include +#include + +#include +#include + +#include + +#include "test.hxx" +#include "test-odb.hxx" + +using namespace std; +using namespace odb; + +using odb::shared_ptr; +using odb::details::thread; + +const size_t thread_count = 32; +const size_t iteration_count = 100; + +struct task +{ + task (database& db, size_t n) + : db_ (db), n_ (n) + { + } + + void + execute () + { + try + { + for (size_t i (0); i < iteration_count; ++i) + { + unsigned long id ((n_ * iteration_count + i) * 3); + + { + object o1 (id, "frist object"); + object o2 (id + 1, "second object"); + object o3 (id + 2, "third object"); + + transaction t (db_.begin_transaction ()); + db_.persist (o1); + db_.persist (o2); + db_.persist (o3); + t.commit (); + } + + { + transaction t (db_.begin_transaction ()); + auto_ptr o (db_.load (id)); + assert (o->str_ == "frist object"); + o->str_ = "another value"; + db_.store (*o); + t.commit (); + } + + { + typedef odb::query query; + typedef odb::result result; + + transaction t (db_.begin_transaction ()); + result r (db_.query (query::str == "another value")); + + bool found (false); + for (result::iterator i (r.begin ()); i != r.end (); ++i) + { + if (i->id_ == id) + { + found = true; + break; + } + } + assert (found); + t.commit (); + } + + { + transaction t (db_.begin_transaction ()); + db_.erase (id); + t.commit (); + } + } + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + } + } + + static void* + execute (void* arg) + { + static_cast (arg)->execute (); + return 0; + } + + database& db_; + size_t n_; +}; + + +int +main (int argc, char* argv[]) +{ + try + { + auto_ptr db (create_database (argc, argv)); + + vector > threads; + vector > tasks; + + for (size_t i (0); i < thread_count; ++i) + { + shared_ptr t (new (shared) task (*db, i)); + tasks.push_back (t); + + threads.push_back ( + shared_ptr ( + new (shared) thread (&task::execute, t.get ()))); + } + + for (size_t i (0); i < thread_count; ++i) + threads[i]->join (); + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + return 1; + } + + // pthread_exit (0); +} -- cgit v1.1