summaryrefslogtreecommitdiff
path: root/cpp/demo/Ice/async/QueueI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/demo/Ice/async/QueueI.cpp')
-rw-r--r--cpp/demo/Ice/async/QueueI.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/cpp/demo/Ice/async/QueueI.cpp b/cpp/demo/Ice/async/QueueI.cpp
index a2255c3d83f..c071a6b1267 100644
--- a/cpp/demo/Ice/async/QueueI.cpp
+++ b/cpp/demo/Ice/async/QueueI.cpp
@@ -12,7 +12,7 @@
using namespace std;
void
-QueueI::get_async(const Demo::AMD_Queue_getPtr& getCB, const Ice::Current&)
+QueueI::get_async(const Demo::AMD_Queue_getPtr& getCB, const string& id, const Ice::Current&)
{
IceUtil::Mutex::Lock lock(*this);
@@ -35,12 +35,15 @@ QueueI::get_async(const Demo::AMD_Queue_getPtr& getCB, const Ice::Current&)
}
else
{
- _requestQueue.push_back(getCB);
+ Request request;
+ request.id = id;
+ request.request = getCB;
+ _requestQueue.push_back(request);
}
}
void
-QueueI::add(const ::std::string& message, const Ice::Current&)
+QueueI::add(const string& message, const Ice::Current&)
{
IceUtil::Mutex::Lock lock(*this);
@@ -53,7 +56,7 @@ QueueI::add(const ::std::string& message, const Ice::Current&)
{
try
{
- _requestQueue.front()->ice_response(message);
+ _requestQueue.front().request->ice_response(message);
}
catch(const Ice::Exception& ex)
{
@@ -67,3 +70,40 @@ QueueI::add(const ::std::string& message, const Ice::Current&)
_messageQueue.push_back(message);
}
}
+
+void
+QueueI::cancel_async(const Demo::AMD_Queue_cancelPtr& cb, const vector<string>& ids, const Ice::Current&)
+{
+ //
+ // We send immediate response so that later call to ice_exception
+ // on queued requests will not cause deadlocks.
+ //
+ cb->ice_response();
+
+ IceUtil::Mutex::Lock lock(*this);
+
+ for(vector<string>::const_iterator p = ids.begin(); p != ids.end(); ++p)
+ {
+ for(list<Request>::iterator q = _requestQueue.begin(); q != _requestQueue.end(); )
+ {
+ if((*q).id == *p)
+ {
+ try
+ {
+ (*q).request->ice_exception(Demo::RequestCanceledException());
+ }
+ catch(const Ice::Exception&)
+ {
+ // Ignore
+ }
+ list<Request>::iterator erase = q++;
+ _requestQueue.erase(erase);
+ }
+ else
+ {
+ ++q;
+ }
+
+ }
+ }
+}