summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Freeze/Map.h4
-rw-r--r--cpp/src/Freeze/BackgroundSaveEvictorI.cpp6
-rw-r--r--cpp/src/Freeze/MapI.cpp47
-rw-r--r--cpp/src/Freeze/MapI.h16
-rw-r--r--cpp/src/Freeze/ObjectStore.cpp5
-rw-r--r--cpp/src/Freeze/TransactionalEvictorI.cpp5
-rw-r--r--cpp/test/Freeze/dbmap/Client.cpp144
-rw-r--r--cpp/test/Freeze/evictor/Client.cpp2
8 files changed, 186 insertions, 43 deletions
diff --git a/cpp/include/Freeze/Map.h b/cpp/include/Freeze/Map.h
index c2083948ee9..630197581d5 100644
--- a/cpp/include/Freeze/Map.h
+++ b/cpp/include/Freeze/Map.h
@@ -158,7 +158,7 @@ public:
create(const MapHelper& m, bool readOnly);
virtual
- ~IteratorHelper() = 0;
+ ~IteratorHelper() ICE_NOEXCEPT_FALSE = 0;
virtual IteratorHelper*
clone() const = 0;
@@ -265,7 +265,7 @@ public:
return *this;
}
- ~Iterator()
+ ~Iterator() ICE_NOEXCEPT_FALSE
{
}
diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp
index 7b2215f7341..c06b6a660fa 100644
--- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp
+++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp
@@ -1434,15 +1434,11 @@ Freeze::BackgroundSaveEvictorElement::BackgroundSaveEvictorElement(ObjectStore<B
}
Freeze::BackgroundSaveEvictorElement::~BackgroundSaveEvictorElement()
-
{
}
-// COMPILERFIX: Required to build with C++ Builder 2007
-typedef ObjectStore<BackgroundSaveEvictorElement>::Position BackgroundSaveEvictorElementPosition;
-
void
-Freeze::BackgroundSaveEvictorElement::init(BackgroundSaveEvictorElementPosition p)
+Freeze::BackgroundSaveEvictorElement::init(ObjectStore<BackgroundSaveEvictorElement>::Position p)
{
stale = false;
cachePosition = p;
diff --git a/cpp/src/Freeze/MapI.cpp b/cpp/src/Freeze/MapI.cpp
index bede240647b..cd2d4127629 100644
--- a/cpp/src/Freeze/MapI.cpp
+++ b/cpp/src/Freeze/MapI.cpp
@@ -338,7 +338,7 @@ Freeze::IteratorHelper::create(const MapHelper& m, bool readOnly)
}
-Freeze::IteratorHelper::~IteratorHelper()
+Freeze::IteratorHelper::~IteratorHelper() ICE_NOEXCEPT_FALSE
{
}
@@ -373,7 +373,11 @@ Freeze::IteratorHelperI::IteratorHelperI(const MapHelperI& m, bool readOnly,
//
// Need to start a transaction
//
- _tx = new Tx(_map);
+#ifdef ICE_CPP11
+ _tx.reset(new Tx(_map));
+#else
+ _tx = new Tx(_map);
+#endif
txn = _tx->getTxn();
}
@@ -427,7 +431,7 @@ Freeze::IteratorHelperI::IteratorHelperI(const IteratorHelperI& it) :
_map._iteratorList.push_back(this);
}
-Freeze::IteratorHelperI::~IteratorHelperI()
+Freeze::IteratorHelperI::~IteratorHelperI() ICE_NOEXCEPT_FALSE
{
close();
}
@@ -888,14 +892,7 @@ Freeze::IteratorHelperI::close()
}
catch(const ::DbDeadlockException& dx)
{
- bool raiseException = (_tx == 0);
- cleanup();
- if(raiseException)
- {
- DeadlockException ex(__FILE__, __LINE__);
- ex.message = dx.what();
- throw ex;
- }
+ // Ignored - it's unclear if this can ever occur
}
catch(const ::DbException& dx)
{
@@ -913,7 +910,14 @@ Freeze::IteratorHelperI::cleanup()
{
_dbc = 0;
_map._iteratorList.remove(this);
+
+ // this can raise an exception when committing the transaction
+ // (only for read/write iterators)
+#ifdef ICE_CPP11
+ _tx.reset();
+#else
_tx = 0;
+#endif
}
@@ -945,7 +949,7 @@ Freeze::IteratorHelperI::Tx::Tx(const MapHelperI& m) :
}
-Freeze::IteratorHelperI::Tx::~Tx()
+Freeze::IteratorHelperI::Tx::~Tx() ICE_NOEXCEPT_FALSE
{
if(_dead)
{
@@ -1039,7 +1043,15 @@ Freeze::MapHelperI::MapHelperI(const ConnectionIPtr& connection,
Freeze::MapHelperI::~MapHelperI()
{
- close();
+ try
+ {
+ close();
+ }
+ catch(const DatabaseException& ex)
+ {
+ Ice::Error error(_connection->getCommunicator()->getLogger());
+ error << "Freeze: closing map " << _dbName << " raised: " << ex;
+ }
}
Freeze::IteratorHelper*
@@ -1702,7 +1714,14 @@ Freeze::MapIndexI::MapIndexI(const ConnectionIPtr& connection, MapDb& db,
Freeze::MapIndexI::~MapIndexI()
{
- _db->close(0);
+ try
+ {
+ _db->close(0);
+ }
+ catch(const DbException&)
+ {
+ // Ignored
+ }
}
diff --git a/cpp/src/Freeze/MapI.h b/cpp/src/Freeze/MapI.h
index dc1e421d97a..f6d3e7ded81 100644
--- a/cpp/src/Freeze/MapI.h
+++ b/cpp/src/Freeze/MapI.h
@@ -12,6 +12,9 @@
#include <Freeze/Map.h>
#include <Freeze/ConnectionI.h>
+#ifdef ICE_CPP11
+# include <memory>
+#endif
namespace Freeze
{
@@ -28,7 +31,7 @@ public:
IteratorHelperI(const IteratorHelperI&);
virtual
- ~IteratorHelperI();
+ ~IteratorHelperI() ICE_NOEXCEPT_FALSE;
bool
find(const Key& k) const;
@@ -62,12 +65,15 @@ public:
void
close();
- class Tx : public IceUtil::SimpleShared
+ class Tx
+#ifndef ICE_CPP11
+ : public IceUtil::SimpleShared
+#endif
{
public:
Tx(const MapHelperI&);
- ~Tx();
+ ~Tx() ICE_NOEXCEPT_FALSE;
void dead();
@@ -82,7 +88,11 @@ public:
bool _dead;
};
+#ifdef ICE_CPP11
+ typedef std::shared_ptr<Tx> TxPtr;
+#else
typedef IceUtil::Handle<Tx> TxPtr;
+#endif
const TxPtr&
tx() const;
diff --git a/cpp/src/Freeze/ObjectStore.cpp b/cpp/src/Freeze/ObjectStore.cpp
index 99a09af7b98..e8801a1b3c7 100644
--- a/cpp/src/Freeze/ObjectStore.cpp
+++ b/cpp/src/Freeze/ObjectStore.cpp
@@ -214,9 +214,8 @@ Freeze::ObjectStoreBase::~ObjectStoreBase()
}
catch(const DbException& dx)
{
- DatabaseException ex(__FILE__, __LINE__);
- ex.message = dx.what();
- throw ex;
+ Ice::Error error(_communicator->getLogger());
+ error << "Freeze: closing ObjectStore " << _dbName << " raised DbException: " << dx.what();
}
}
diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp
index 594d8f1a599..e24c5006111 100644
--- a/cpp/src/Freeze/TransactionalEvictorI.cpp
+++ b/cpp/src/Freeze/TransactionalEvictorI.cpp
@@ -840,11 +840,8 @@ Freeze::TransactionalEvictorElement::~TransactionalEvictorElement()
{
}
-// COMPILERFIX: Required to build with C++ Builder 2007
-typedef ObjectStore<TransactionalEvictorElement>::Position TransactionalEvictorElementPosition;
-
void
-Freeze::TransactionalEvictorElement::init(TransactionalEvictorElementPosition p)
+Freeze::TransactionalEvictorElement::init(ObjectStore<TransactionalEvictorElement>::Position p)
{
_stale = false;
_cachePosition = p;
diff --git a/cpp/test/Freeze/dbmap/Client.cpp b/cpp/test/Freeze/dbmap/Client.cpp
index 0aa4daa4e82..1c4525123c5 100644
--- a/cpp/test/Freeze/dbmap/Client.cpp
+++ b/cpp/test/Freeze/dbmap/Client.cpp
@@ -26,6 +26,8 @@ using namespace Test;
// #define SHOW_EXCEPTIONS 1
+#define CONCURRENT_TIME 3
+
#ifdef __SUNPRO_CC
extern
@@ -95,14 +97,17 @@ public:
ReadThread(const CommunicatorPtr& communicator, const string& envName, const string& dbName) :
_connection(createConnection(communicator, envName)),
- _map(_connection, dbName)
+ _map(_connection, dbName),
+ _done(false)
{
}
virtual void
run()
{
- for(int i = 0; i < 10; ++i)
+ bool more = false;
+
+ do
{
for(;;)
{
@@ -110,7 +115,7 @@ public:
{
for(ByteIntMap::iterator p = _map.begin(); p != _map.end(); ++p)
{
- test(p->first == p->second + 'a');
+ test((p->first == p->second + 'a') || (p->first == p->second + 'A'));
IceUtil::ThreadControl::yield();
}
break; // for(;;)
@@ -132,15 +137,31 @@ public:
break;
}
}
- }
+
+ {
+ IceUtil::Mutex::Lock lock(_doneMutex);
+ more = !_done;
+ }
+
+ } while(more);
+ }
+
+ void stop()
+ {
+ IceUtil::Mutex::Lock lock(_doneMutex);
+ _done = true;
}
private:
Freeze::ConnectionPtr _connection;
ByteIntMap _map;
+ bool _done;
+ IceUtil::Mutex _doneMutex;
};
+typedef IceUtil::Handle<ReadThread> ReadThreadPtr;
+
class WriteThread : public IceUtil::Thread
{
@@ -148,17 +169,20 @@ public:
WriteThread(const CommunicatorPtr& communicator, const string& envName, const string& dbName) :
_connection(createConnection(communicator, envName)),
- _map(_connection, dbName)
+ _map(_connection, dbName),
+ _done(false)
{
}
virtual void
run()
{
+ bool more = false;
+
//
// Delete an recreate each object
//
- for(int i = 0; i < 4; ++i)
+ do
{
for(;;)
{
@@ -170,8 +194,8 @@ public:
p.set(p->second + 1);
_map.erase(p);
}
- break; // for(;;)
txHolder.commit();
+ break; // for (;;)
}
catch(const DeadlockException&)
{
@@ -191,15 +215,94 @@ public:
}
}
populateDB(_connection, _map);
- }
+
+
+ //
+ // Now update without a transaction
+ //
+
+ for(char c = 'a'; c != 'd'; ++c)
+ {
+ for(;;)
+ {
+ bool thrownBySet = false;
+ try
+ {
+ ByteIntMap::iterator p = _map.find(c);
+ try
+ {
+ if(p != _map.end())
+ {
+ if(p->first == p->second + 'a')
+ {
+ p.set(p->first - 'A');
+ }
+ else
+ {
+ p.set(p->first - 'a');
+ }
+ }
+ }
+ catch(const DeadlockException&)
+ {
+ thrownBySet = true;
+ throw;
+ }
+ break; // for (;;)
+ }
+ catch(const DeadlockException&)
+ {
+ if(!thrownBySet)
+ {
+ cerr << "DeadlockException thrown by destructor!" << endl;
+ test(false);
+ }
+
+#ifdef SHOW_EXCEPTIONS
+ if(thrownBySet)
+ {
+ cerr << "S" << flush;
+ }
+ else
+ {
+ cerr << "D" << flush;
+ }
+#endif
+ // Try again
+ }
+ catch(const InvalidPositionException&)
+ {
+#ifdef SHOW_EXCEPTIONS
+ cerr << "I" << flush;
+#endif
+ break;
+ }
+ }
+ }
+
+ {
+ IceUtil::Mutex::Lock lock(_doneMutex);
+ more = !_done;
+ }
+ } while(more);
+ }
+
+ void stop()
+ {
+ IceUtil::Mutex::Lock lock(_doneMutex);
+ _done = true;
}
private:
Freeze::ConnectionPtr _connection;
ByteIntMap _map;
+ bool _done;
+ IceUtil::Mutex _doneMutex;
};
+typedef IceUtil::Handle<WriteThread> WriteThreadPtr;
+
int
run(const CommunicatorPtr& communicator, const string& envName)
@@ -589,7 +692,7 @@ run(const CommunicatorPtr& communicator, const string& envName)
test(count == 4);
cout << "ok " << endl;
- cout << "Testing unreferenced connection+transaction... " << flush;
+ cout << "testing unreferenced connection+transaction... " << flush;
{
Freeze::ConnectionPtr c2 = createConnection(communicator, envName);
ByteIntMap m2(c2, dbName);
@@ -619,13 +722,32 @@ run(const CommunicatorPtr& communicator, const string& envName)
populateDB(connection, m);
vector<IceUtil::ThreadControl> controls;
+ vector<ReadThreadPtr> readThreads;
+ vector<WriteThreadPtr> writeThreads;
+
for(int i = 0; i < 5; ++i)
{
- IceUtil::ThreadPtr rt = new ReadThread(communicator, envName, dbName);
+ ReadThreadPtr rt = new ReadThread(communicator, envName, dbName);
controls.push_back(rt->start());
- IceUtil::ThreadPtr wt = new WriteThread(communicator, envName, dbName);
+ readThreads.push_back(rt);
+
+ WriteThreadPtr wt = new WriteThread(communicator, envName, dbName);
controls.push_back(wt->start());
+ writeThreads.push_back(wt);
}
+
+ IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(CONCURRENT_TIME));
+
+ for(vector<WriteThreadPtr>::iterator q = writeThreads.begin(); q != writeThreads.end(); ++q)
+ {
+ (*q)->stop();
+ }
+
+ for(vector<ReadThreadPtr>::iterator q = readThreads.begin(); q != readThreads.end(); ++q)
+ {
+ (*q)->stop();
+ }
+
for(vector<IceUtil::ThreadControl>::iterator q = controls.begin(); q != controls.end(); ++q)
{
q->join();
diff --git a/cpp/test/Freeze/evictor/Client.cpp b/cpp/test/Freeze/evictor/Client.cpp
index 433636aad25..1dc38845e76 100644
--- a/cpp/test/Freeze/evictor/Client.cpp
+++ b/cpp/test/Freeze/evictor/Client.cpp
@@ -613,7 +613,7 @@ run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator, bool trans
//
try
{
- int balance = Test::AccountPrx::uncheckedCast(servants[0])->getBalance();
+ Test::AccountPrx::uncheckedCast(servants[0])->getBalance();
test(false);
}
catch(const Ice::OperationNotExistException&)