diff options
author | Matthew Newhook <matthew@zeroc.com> | 2006-12-22 18:52:53 +0000 |
---|---|---|
committer | Matthew Newhook <matthew@zeroc.com> | 2006-12-22 18:52:53 +0000 |
commit | 84d9f5c369fceccfa16401ed50783ed2ad209559 (patch) | |
tree | 689d30c8707629f1db8155edadb47ce1bce363ad /cpp/demo/IceGrid/sessionActivation/Client.cpp | |
parent | Added autoflushing of batches (diff) | |
download | ice-84d9f5c369fceccfa16401ed50783ed2ad209559.tar.bz2 ice-84d9f5c369fceccfa16401ed50783ed2ad209559.tar.xz ice-84d9f5c369fceccfa16401ed50783ed2ad209559.zip |
http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=1391.
Diffstat (limited to 'cpp/demo/IceGrid/sessionActivation/Client.cpp')
-rw-r--r-- | cpp/demo/IceGrid/sessionActivation/Client.cpp | 113 |
1 files changed, 82 insertions, 31 deletions
diff --git a/cpp/demo/IceGrid/sessionActivation/Client.cpp b/cpp/demo/IceGrid/sessionActivation/Client.cpp index d8fc48e65dc..b4e9f719f53 100644 --- a/cpp/demo/IceGrid/sessionActivation/Client.cpp +++ b/cpp/demo/IceGrid/sessionActivation/Client.cpp @@ -69,11 +69,17 @@ class HelloClient : public Ice::Application public: virtual int run(int, char*[]); + virtual void interruptCallback(int); private: + void cleanup(); void menu(); string trim(const string&); + + IceUtil::Mutex _mutex; + IceGrid::SessionPrx _session; + SessionKeepAliveThreadPtr _keepAlive; }; int @@ -83,32 +89,17 @@ main(int argc, char* argv[]) return app.main(argc, argv, "config.client"); } -void -HelloClient::menu() -{ - cout << - "usage:\n" - "t: send greeting\n" - "x: exit\n" - "?: help\n"; -} - -string -HelloClient::trim(const string& s) -{ - static const string delims = "\t\r\n "; - string::size_type last = s.find_last_not_of(delims); - if(last != string::npos) - { - return s.substr(s.find_first_not_of(delims), last+1); - } - return s; -} - int HelloClient::run(int argc, char* argv[]) { int status = EXIT_SUCCESS; + + // + // Since this is an interactive demo we want the custom interrupt + // callback to be called when the process is interrupted. + // + userCallbackOnInterrupt(); + IceGrid::RegistryPrx registry = IceGrid::RegistryPrx::checkedCast(communicator()->stringToProxy("DemoIceGrid/Registry")); if(!registry) @@ -117,7 +108,6 @@ HelloClient::run(int argc, char* argv[]) return EXIT_FAILURE; } - IceGrid::SessionPrx session; while(true) { cout << "This demo accepts any user-id / password combination.\n"; @@ -134,7 +124,8 @@ HelloClient::run(int argc, char* argv[]) try { - session = registry->createSession(id, password); + IceUtil::Mutex::Lock sync(_mutex); + _session = registry->createSession(id, password); break; } catch(const IceGrid::PermissionDeniedException& ex) @@ -143,12 +134,15 @@ HelloClient::run(int argc, char* argv[]) } } - SessionKeepAliveThreadPtr keepAlive = new SessionKeepAliveThread(session, registry->getSessionTimeout() / 2); - keepAlive->start(); + { + IceUtil::Mutex::Lock sync(_mutex); + _keepAlive = new SessionKeepAliveThread(_session, registry->getSessionTimeout() / 2); + _keepAlive->start(); + } try { - HelloPrx hello = HelloPrx::checkedCast(session->allocateObjectById(communicator()->stringToIdentity("hello"))); + HelloPrx hello = HelloPrx::checkedCast(_session->allocateObjectById(communicator()->stringToIdentity("hello"))); menu(); @@ -205,15 +199,72 @@ HelloClient::run(int argc, char* argv[]) status = EXIT_FAILURE; } + cleanup(); + + return status; +} + +void +HelloClient::interruptCallback(int) +{ + cleanup(); + + try + { + communicator()->destroy(); + } + catch(const IceUtil::Exception& ex) + { + cerr << appName() << ": " << ex << endl; + } + catch(...) + { + cerr << appName() << ": unknown exception" << endl; + } + exit(EXIT_SUCCESS); +} + +void +HelloClient::cleanup() +{ + IceUtil::Mutex::Lock sync(_mutex); // // Destroy the keepAlive thread and the sesion object otherwise // the session will be kept allocated until the timeout occurs. // Destroying the session will release all allocated objects. // - keepAlive->destroy(); - keepAlive->getThreadControl().join(); - session->destroy(); + if(_keepAlive) + { + _keepAlive->destroy(); + _keepAlive->getThreadControl().join(); + _keepAlive = 0; + } + if(_session) + { + _session->destroy(); + _session = 0; + } +} - return status; +void +HelloClient::menu() +{ + cout << + "usage:\n" + "t: send greeting\n" + "x: exit\n" + "?: help\n"; +} + +string +HelloClient::trim(const string& s) +{ + static const string delims = "\t\r\n "; + string::size_type last = s.find_last_not_of(delims); + if(last != string::npos) + { + return s.substr(s.find_first_not_of(delims), last+1); + } + return s; } |