diff options
author | deva <deva> | 2010-01-06 07:47:58 +0000 |
---|---|---|
committer | deva <deva> | 2010-01-06 07:47:58 +0000 |
commit | 0e819eb42b4d680a99ae7b04702bfc9510495aee (patch) | |
tree | a425aeb98c679a0891a974b6f93090343d51a4e8 /server/src/connectionpool.cc | |
parent | 582913fc18937c87afe7d351e66095dccb435a9e (diff) |
New artefact connection class (to later wrap libartefact). New environment class to hold all global resources. Made ConnectionPool a template class. Split journal code up into two files (class from commit code).
Diffstat (limited to 'server/src/connectionpool.cc')
-rw-r--r-- | server/src/connectionpool.cc | 167 |
1 files changed, 36 insertions, 131 deletions
diff --git a/server/src/connectionpool.cc b/server/src/connectionpool.cc index 9271871..743bb68 100644 --- a/server/src/connectionpool.cc +++ b/server/src/connectionpool.cc @@ -27,104 +27,9 @@ */ #include "connectionpool.h" -ConnectionPool::ConnectionPool() -{ -} - -void ConnectionPool::addDatabase(Database *db) -{ - mutex.lock(); - passivedbs.push_back(db); - semaphore.post(); - mutex.unlock(); -} - -static inline bool contains(std::list<Database *> list, Database *db) -{ - std::list<Database*>::iterator i = list.begin(); - while(i != list.end()) { - if(*i == db) return true; - i++; - } - return false; -} - -void ConnectionPool::removeDatabase(Database *db) -{ - mutex.lock(); - if(contains(passivedbs, db)) { - semaphore.post(); - passivedbs.remove(db); - } - mutex.unlock(); -} - -bool ConnectionPool::testFree(Database *db) -{ - bool testfree = false; - - mutex.lock(); - testfree = contains(passivedbs, db); - mutex.unlock(); - - return testfree; -} - -int ConnectionPool::numFreeDatabases() -{ - int num; - mutex.lock(); - num = passivedbs.size(); - mutex.unlock(); - return num; -} - -Database *ConnectionPool::borrowDatabase() -{ - Database *db = NULL; - - semaphore.wait(); - - mutex.lock(); - - db = passivedbs.front(); - passivedbs.remove(db); - activedbs.push_back(db); - - mutex.unlock(); - - return db; -} - -void ConnectionPool::returnDatabase(Database *db) -{ - mutex.lock(); - - if(contains(activedbs, db)) { - activedbs.remove(db); - passivedbs.push_back(db); - semaphore.post(); - } - - mutex.unlock(); -} - -AutoBorrower::AutoBorrower(ConnectionPool &p) - : pool(p) -{ - _db = pool.borrowDatabase(); -} - -AutoBorrower::~AutoBorrower() -{ - pool.returnDatabase(_db); -} - -Database *AutoBorrower::db() -{ - return _db; -} - +// +// Implementation is in the header file. +// #ifdef TEST_CONNECTIONPOOL //deps: mutex.cc semaphore.cc @@ -136,78 +41,78 @@ Database *AutoBorrower::db() static void* thread_run(void *data) { - ConnectionPool *pool = (ConnectionPool*)data; + ConnectionPool<int> *pool = (ConnectionPool<int>*)data; - Database *db1 = pool->borrowDatabase(); - Database *db2 = pool->borrowDatabase(); - Database *db3 = pool->borrowDatabase(); - Database *db4 = pool->borrowDatabase(); + int db1 = pool->borrow(); + int db2 = pool->borrow(); + int db3 = pool->borrow(); + int db4 = pool->borrow(); usleep(100); - pool->returnDatabase(db1); - pool->returnDatabase(db2); - pool->returnDatabase(db3); - pool->returnDatabase(db4); + pool->giveBack(db1); + pool->giveBack(db2); + pool->giveBack(db3); + pool->giveBack(db4); return NULL; } TEST_BEGIN; -ConnectionPool pool; +ConnectionPool<int> pool; -Database *db1 = (Database*)1; -Database *db2 = (Database*)2; -Database *db3 = (Database*)3; -Database *db4 = (Database*)4; +int db1 = 1; +int db2 = 2; +int db3 = 3; +int db4 = 4; -pool.addDatabase(db1); -pool.addDatabase(db2); -pool.addDatabase(db3); -pool.addDatabase(db4); +pool.add(db1); +pool.add(db2); +pool.add(db3); +pool.add(db4); TEST_TRUE(pool.testFree(db1), "Testing if db1 is free."); TEST_TRUE(pool.testFree(db2), "Testing if db2 is free."); TEST_TRUE(pool.testFree(db3), "Testing if db3 is free."); TEST_TRUE(pool.testFree(db4), "Testing if db4 is free."); -TEST_EQUAL(pool.numFreeDatabases(), 4, "Testing number of free databases."); +TEST_EQUAL(pool.numFree(), 4, "Testing number of free databases."); -Database *b_db1 = pool.borrowDatabase(); +int b_db1 = pool.borrow(); TEST_FALSE(pool.testFree(b_db1), "Testing if borrowed db is free."); -Database *b_db2 = pool.borrowDatabase(); +int b_db2 = pool.borrow(); TEST_NOTEQUAL(b_db1, b_db2, "Testing if borrowed db is unique."); -pool.returnDatabase(b_db1); +pool.giveBack(b_db1); TEST_TRUE(pool.testFree(b_db1), "Testing if returned db is free."); -pool.returnDatabase(b_db2); +pool.giveBack(b_db2); -TEST_EQUAL(pool.numFreeDatabases(), 4, "Testing number of free databases."); +TEST_EQUAL(pool.numFree(), 4, "Testing number of free databases."); pthread_attr_t attr; pthread_t tid; pthread_attr_init(&attr); pthread_create(&tid, &attr, thread_run, &pool); -while(pool.numFreeDatabases() > 0) { usleep(10); } +while(pool.numFree() > 0) { usleep(10); } -Database *b_db3 = pool.borrowDatabase(); +int b_db3 = pool.borrow(); TEST_FALSE(pool.testFree(b_db3), "Testing if returned db is free (semaphore test)."); -pool.returnDatabase(db3); +pool.giveBack(db3); pthread_join(tid, NULL); pthread_attr_destroy(&attr); -TEST_EQUAL(pool.numFreeDatabases(), 4, "Testing if all database are now available again"); +TEST_EQUAL(pool.numFree(), 4, "Testing if all database are now available again"); { - TEST_EQUAL(pool.numFreeDatabases(), 4, "Testing if autoborrower has not yet borrowed a db."); - AutoBorrower b(pool); - TEST_EQUAL(pool.numFreeDatabases(), 3, "Testing if autoborrower has borrowed a db."); - TEST_FALSE(pool.testFree(b.db()), "Testing if the autoborrowed db is actually taken."); + TEST_EQUAL(pool.numFree(), 4, "Testing if autoborrower has not yet borrowed a db."); + AutoBorrower<int> b(pool); + TEST_EQUAL(pool.numFree(), 3, "Testing if autoborrower has borrowed a db."); + TEST_FALSE(pool.testFree(b.get()), "Testing if the autoborrowed db is actually taken."); } -TEST_EQUAL(pool.numFreeDatabases(), 4, "Testing if autoborrower has returned the db."); +TEST_EQUAL(pool.numFree(), 4, "Testing if autoborrower has returned the db."); TEST_END; |