diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-11-20 16:43:14 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-11-20 16:43:14 +0000 |
commit | 3fe98a157ff2b46c9e27cc158ede0cf213badb9b (patch) | |
tree | d1f91726450e1fe1667fd073eb7814bff796aad0 /cs/demo/Ice/async/QueueI.cs | |
parent | Minor changes (diff) | |
download | ice-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.cs | 64 |
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(); } |