From 49148af30f42baf101e32581c48acdf4540b6442 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 10 Sep 2010 12:58:24 +0200 Subject: Allow the test to specify max number of connections Use this in common/threads. --- common/threads/driver.cxx | 58 ++++++++++++++++++++++++++++++--------------- libcommon/common/common.cxx | 12 ++++++++-- libcommon/common/common.hxx | 5 ++-- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/common/threads/driver.cxx b/common/threads/driver.cxx index e996dae..539db5f 100644 --- a/common/threads/driver.cxx +++ b/common/threads/driver.cxx @@ -8,6 +8,7 @@ #include #include // std::auto_ptr +#include // std::size_t #include #include @@ -109,35 +110,54 @@ struct task unsigned long n_; }; - -int -main (int argc, char* argv[]) +void +test (int argc, char* argv[], size_t max_connections) { - try + auto_ptr db (create_database (argc, argv, max_connections)); + + vector > threads; + vector > tasks; + + for (unsigned long i (0); i < thread_count; ++i) { - auto_ptr db (create_database (argc, argv)); + details::shared_ptr t (new (details::shared) task (*db, i)); + tasks.push_back (t); - vector > threads; - vector > tasks; + threads.push_back ( + details::shared_ptr ( + new (details::shared) details::thread (&task::execute, t.get ()))); + } - for (unsigned long i (0); i < thread_count; ++i) - { - details::shared_ptr t (new (details::shared) task (*db, i)); - tasks.push_back (t); + for (unsigned long i (0); i < thread_count; ++i) + threads[i]->join (); - threads.push_back ( - details::shared_ptr ( - new (details::shared) details::thread (&task::execute, t.get ()))); - } + { + typedef odb::result result; + + transaction t (db->begin_transaction ()); + result r (db->query ()); + r.cache (); - for (unsigned long i (0); i < thread_count; ++i) - threads[i]->join (); + for (result::iterator i (r.begin ()); i != r.end (); ++i) + db->erase (i->id_); + + t.commit (); + } +} + +int +main (int argc, char* argv[]) +{ + try + { + test (argc, argv, 0); + test (argc, argv, thread_count - 1); + test (argc, argv, thread_count / 2); + test (argc, argv, thread_count / 4); } catch (const odb::exception& e) { cerr << e.what () << endl; return 1; } - - // pthread_exit (0); } diff --git a/libcommon/common/common.cxx b/libcommon/common/common.cxx index d68d579..960a946 100644 --- a/libcommon/common/common.cxx +++ b/libcommon/common/common.cxx @@ -12,6 +12,7 @@ #ifdef DB_ID_MYSQL # include +# include #endif #include @@ -21,7 +22,7 @@ using namespace std; using namespace odb; auto_ptr -create_database (int argc, char* argv[]) +create_database (int argc, char* argv[], size_t max_connections) { #ifdef DB_ID_MYSQL cli::argv_file_scanner scan (argc, argv, "--options-file"); @@ -35,6 +36,11 @@ create_database (int argc, char* argv[]) exit (0); } + auto_ptr f; + + if (max_connections != 0) + f.reset (new mysql::connection_pool_factory (max_connections)); + return auto_ptr ( new mysql::database ( ops.user (), @@ -42,7 +48,9 @@ create_database (int argc, char* argv[]) ops.db_name (), ops.host (), ops.port (), - ops.socket_specified () ? &ops.socket () : 0)); + ops.socket_specified () ? &ops.socket () : 0, + 0, + f)); #else return auto_ptr (0); #endif diff --git a/libcommon/common/common.hxx b/libcommon/common/common.hxx index 87b08f0..57069dc 100644 --- a/libcommon/common/common.hxx +++ b/libcommon/common/common.hxx @@ -6,13 +6,14 @@ #ifndef LIBCOMMON_COMMON_COMMON_HXX #define LIBCOMMON_COMMON_COMMON_HXX -#include // std::auto_ptr +#include // std::auto_ptr +#include // std::size_t #include #include LIBCOMMON_EXPORT std::auto_ptr -create_database (int argc, char* argv[]); +create_database (int argc, char* argv[], std::size_t max_connections = 0); #endif // LIBCOMMON_COMMON_COMMON_HXX -- cgit v1.1