diff options
author | Bernard Normier <bernard@zeroc.com> | 2012-10-15 13:26:17 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2012-10-15 13:26:17 -0400 |
commit | e5fa05955bcbb5ecbfbec341d004cfd8821bdafa (patch) | |
tree | 31e863059eca13c850f06872e8067f02009a148a /cpp | |
parent | WinRT fixes (diff) | |
download | ice-e5fa05955bcbb5ecbfbec341d004cfd8821bdafa.tar.bz2 ice-e5fa05955bcbb5ecbfbec341d004cfd8821bdafa.tar.xz ice-e5fa05955bcbb5ecbfbec341d004cfd8821bdafa.zip |
Fixed Freeze destructors for C++11 (ICE-4878)
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Freeze/Map.h | 4 | ||||
-rw-r--r-- | cpp/src/Freeze/BackgroundSaveEvictorI.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Freeze/MapI.cpp | 47 | ||||
-rw-r--r-- | cpp/src/Freeze/MapI.h | 16 | ||||
-rw-r--r-- | cpp/src/Freeze/ObjectStore.cpp | 5 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorI.cpp | 5 | ||||
-rw-r--r-- | cpp/test/Freeze/dbmap/Client.cpp | 144 | ||||
-rw-r--r-- | cpp/test/Freeze/evictor/Client.cpp | 2 |
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&) |