1 // AsyncEvaluationTracker.cs
4 // Lluis Sanchez Gual <lluis@novell.com>
6 // Copyright (c) 2008 Novell, Inc (http://www.novell.com)
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 using System
.Collections
.Generic
;
30 using Mono
.Debugging
.Client
;
31 using Mono
.Debugging
.Backend
;
33 namespace DebuggerServer
35 public delegate ObjectValue
ObjectEvaluatorDelegate ();
37 public class AsyncEvaluationTracker
: RemoteFrameObject
, IObjectValueUpdater
39 Dictionary
<string, UpdateCallback
> asyncCallbacks
= new Dictionary
<string, UpdateCallback
> ();
40 Dictionary
<string, ObjectValue
> asyncResults
= new Dictionary
<string, ObjectValue
> ();
42 int cancelTimestamp
= 0;
43 TimedEvaluator runner
= new TimedEvaluator ();
45 public ObjectValue
Run (string name
, ObjectValueFlags flags
, ObjectEvaluatorDelegate evaluator
)
49 lock (asyncCallbacks
) {
54 ObjectValue val
= null;
55 bool done
= runner
.Run (delegate {
56 if (tid
>= cancelTimestamp
)
60 if (tid
>= cancelTimestamp
)
61 OnEvaluationDone (id
, val
);
67 return ObjectValue
.CreateEvaluating (this, new ObjectPath (id
, name
), flags
);
72 lock (asyncCallbacks
) {
73 cancelTimestamp
= asyncCounter
;
75 asyncCallbacks
.Clear ();
76 asyncResults
.Clear ();
80 public void WaitForStopped ()
82 runner
.WaitForStopped ();
85 void OnEvaluationDone (string id
, ObjectValue val
)
88 val
= ObjectValue
.CreateUnknown (null);
89 UpdateCallback cb
= null;
90 lock (asyncCallbacks
) {
91 if (asyncCallbacks
.TryGetValue (id
, out cb
)) {
93 asyncCallbacks
.Remove (id
);
96 asyncResults
[id
] = val
;
100 void IObjectValueUpdater
.RegisterUpdateCallbacks (UpdateCallback
[] callbacks
)
102 foreach (UpdateCallback c
in callbacks
) {
103 lock (asyncCallbacks
) {
105 string id
= c
.Path
[0];
106 if (asyncResults
.TryGetValue (id
, out val
)) {
108 asyncResults
.Remove (id
);
110 asyncCallbacks
[id
] = c
;