summaryrefslogtreecommitdiff
path: root/server/src/connectionpool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/connectionpool.cc')
-rw-r--r--server/src/connectionpool.cc167
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;