summaryrefslogtreecommitdiff
path: root/cs/demo/Ice/async/QueueI.cs
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2006-11-20 16:43:14 +0000
committerDwayne Boone <dwayne@zeroc.com>2006-11-20 16:43:14 +0000
commit3fe98a157ff2b46c9e27cc158ede0cf213badb9b (patch)
treed1f91726450e1fe1667fd073eb7814bff796aad0 /cs/demo/Ice/async/QueueI.cs
parentMinor changes (diff)
downloadice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.tar.bz2
ice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.tar.xz
ice-3fe98a157ff2b46c9e27cc158ede0cf213badb9b.zip
Added cancel
Diffstat (limited to 'cs/demo/Ice/async/QueueI.cs')
-rw-r--r--cs/demo/Ice/async/QueueI.cs64
1 files changed, 59 insertions, 5 deletions
diff --git a/cs/demo/Ice/async/QueueI.cs b/cs/demo/Ice/async/QueueI.cs
index 18b6196cb6a..761c78bee92 100644
--- a/cs/demo/Ice/async/QueueI.cs
+++ b/cs/demo/Ice/async/QueueI.cs
@@ -13,15 +13,20 @@ using Demo;
public class QueueI : QueueDisp_
{
- public override void get_async(AMD_Queue_get getCB, Ice.Current current)
+ public override void get_async(AMD_Queue_get cb, string id, Ice.Current current)
{
+ //
+ // If there is already a message in the message queue, send the
+ // response immediately. Otherwise add the callback to the
+ // request queue.
+ //
lock(this)
{
if(_messageQueue.Count != 0)
{
try
{
- getCB.ice_response((string)_messageQueue[0]);
+ cb.ice_response((string)_messageQueue[0]);
_messageQueue.RemoveAt(0);
}
catch(Ice.Exception ex)
@@ -31,21 +36,29 @@ public class QueueI : QueueDisp_
}
else
{
- _requestQueue.Add(getCB);
+ Request request = new Request();
+ request.id = id;
+ request.cb = cb;
+ _requestQueue.Add(request);
}
}
}
public override void add(string message, Ice.Current current)
{
+ //
+ // If there is an outstanding request in the request queue,
+ // send a response. Otherwise add the message to the message
+ // queue.
+ //
lock(this)
{
if(_requestQueue.Count != 0)
{
try
{
- AMD_Queue_get cb = (AMD_Queue_get)_requestQueue[0];
- cb.ice_response(message);
+ Request request = (Request)_requestQueue[0];
+ request.cb.ice_response(message);
}
catch(Ice.Exception ex)
{
@@ -60,6 +73,47 @@ public class QueueI : QueueDisp_
}
}
+ public override void cancel_async(AMD_Queue_cancel cb, string[] ids, Ice.Current current)
+ {
+ //
+ // We send immediate response so that later call to ice_exception
+ // on queued requests will not cause deadlocks.
+ //
+ cb.ice_response();
+
+ for(int i = 0; i < ids.Length; ++i)
+ {
+ ArrayList toRemove = new ArrayList();
+ foreach(Request r in _requestQueue)
+ {
+ if(r.id.Equals(ids[i]))
+ {
+ try
+ {
+ r.cb.ice_exception(new RequestCanceledException());
+ }
+ catch(Ice.Exception ex)
+ {
+ // Ignore
+ }
+ toRemove.Add(r);
+ }
+ }
+
+ foreach(Request r in toRemove)
+ {
+ _requestQueue.Remove(r);
+ }
+ }
+ }
+
+
+ class Request
+ {
+ public string id;
+ public AMD_Queue_get cb;
+ }
+
private ArrayList _messageQueue = new ArrayList();
private ArrayList _requestQueue = new ArrayList();
}