// 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 details::shared; using details::shared_ptr; using 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); }