1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
|
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace Ice
{
namespace ami
{
public class TestI : Test.TestIntfDisp_
{
protected static void test(bool b)
{
if(!b)
{
Debug.Assert(false);
throw new System.Exception();
}
}
public TestI()
{
}
override public void
op(Ice.Current current)
{
}
override public int
opWithResult(Ice.Current current)
{
return 15;
}
override public void
opWithUE(Ice.Current current)
{
throw new Test.TestIntfException();
}
override public void
opWithPayload(byte[] seq, Ice.Current current)
{
}
override public void
opBatch(Ice.Current current)
{
lock(this)
{
++_batchCount;
Monitor.Pulse(this);
}
}
override public int
opBatchCount(Ice.Current current)
{
lock(this)
{
return _batchCount;
}
}
override public bool
waitForBatch(int count, Ice.Current current)
{
lock(this)
{
while(_batchCount < count)
{
test(Monitor.Wait(this, 10000));
}
bool result = count == _batchCount;
_batchCount = 0;
return result;
}
}
override public void
close(Test.CloseMode mode, Ice.Current current)
{
current.con.close((Ice.ConnectionClose)((int)mode));
}
override public void
sleep(int ms, Ice.Current current)
{
Thread.Sleep(ms);
}
override public void
shutdown(Ice.Current current)
{
lock(this)
{
_shutdown = true;
if(_pending != null)
{
_pending.SetResult(null);
_pending = null;
}
current.adapter.getCommunicator().shutdown();
}
}
override public bool
supportsAMD(Ice.Current current)
{
return true;
}
override public bool
supportsFunctionalTests(Ice.Current current)
{
return false;
}
override public async Task
opAsyncDispatchAsync(Ice.Current current)
{
await Task.Delay(10);
}
override public async Task<int>
opWithResultAsyncDispatchAsync(Ice.Current current)
{
await Task.Delay(10);
test(Thread.CurrentThread.Name.Contains("Ice.ThreadPool.Server"));
var r = await self(current).opWithResultAsync();
test(Thread.CurrentThread.Name.Contains("Ice.ThreadPool.Server"));
return r;
}
override public async Task
opWithUEAsyncDispatchAsync(Ice.Current current)
{
test(Thread.CurrentThread.Name.Contains("Ice.ThreadPool.Server"));
await Task.Delay(10);
test(Thread.CurrentThread.Name.Contains("Ice.ThreadPool.Server"));
await self(current).opWithUEAsync();
}
override public void
pingBiDir(Test.PingReplyPrx reply, Ice.Current current)
{
reply = Test.PingReplyPrxHelper.uncheckedCast(reply.ice_fixed(current.con));
Thread dispatchThread = Thread.CurrentThread;
reply.replyAsync().ContinueWith(
(t) =>
{
Thread callbackThread = Thread.CurrentThread;
test(dispatchThread != callbackThread);
test(callbackThread.Name.Contains("Ice.ThreadPool.Server"));
},
reply.ice_scheduler()).Wait();
}
Test.TestIntfPrx
self(Ice.Current current)
{
return Test.TestIntfPrxHelper.uncheckedCast(current.adapter.createProxy(current.id));
}
override public Task
startDispatchAsync(Ice.Current current)
{
lock(this)
{
if(_shutdown)
{
// Ignore, this can occur with the forcefull connection close test, shutdown can be dispatch
// before start dispatch.
var v = new TaskCompletionSource<object>();
v.SetResult(null);
return v.Task;
}
else if(_pending != null)
{
_pending.SetResult(null);
}
_pending = new TaskCompletionSource<object>();
return _pending.Task;
}
}
override public void
finishDispatch(Ice.Current current)
{
lock(this)
{
if(_shutdown)
{
return;
}
else if(_pending != null) // Pending might not be set yet if startDispatch is dispatch out-of-order
{
_pending.SetResult(null);
_pending = null;
}
}
}
private int _batchCount;
private bool _shutdown;
private TaskCompletionSource<object> _pending = null;
}
public class TestII : Test.Outer.Inner.TestIntfDisp_
{
override public int
op(int i, out int j, Ice.Current current)
{
j = i;
return i;
}
}
public class TestControllerI : Test.TestIntfControllerDisp_
{
override public void
holdAdapter(Ice.Current current)
{
_adapter.hold();
}
override public void
resumeAdapter(Ice.Current current)
{
_adapter.activate();
}
public
TestControllerI(Ice.ObjectAdapter adapter)
{
_adapter = adapter;
}
private Ice.ObjectAdapter _adapter;
}
}
}
|