예제 #1
0
파일: Channel.cs 프로젝트: szzfstgit/grpc-1
        /// <summary>
        /// Returned tasks completes once channel state has become different from
        /// given lastObservedState.
        /// If deadline is reached or and error occurs, returned task is cancelled.
        /// </summary>
        public Task WaitForStateChangedAsync(ChannelState lastObservedState, DateTime?deadline = null)
        {
            GrpcPreconditions.CheckArgument(lastObservedState != ChannelState.Shutdown,
                                            "Shutdown is a terminal state. No further state changes can occur.");
            var tcs = new TaskCompletionSource <object>();
            var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;

            // pass "tcs" as "state" for WatchConnectivityStateHandler.
            handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs);
            return(tcs.Task);
        }
예제 #2
0
 public void FromDateTime_OutOfTimespecRange()
 {
     // we can only get overflow in Timespec on 32-bit
     if (IntPtr.Size == 4)
     {
         Assert.AreEqual(Timespec.InfFuture, Timespec.FromDateTime(new DateTime(2040, 1, 1, 0, 0, 0, DateTimeKind.Utc)));
         Assert.AreEqual(Timespec.InfPast, Timespec.FromDateTime(new DateTime(1800, 1, 1, 0, 0, 0, DateTimeKind.Utc)));
     }
     else
     {
         Console.WriteLine("Test cannot be run on this platform, skipping the test.");
     }
 }
예제 #3
0
        /// <summary>
        /// Returned tasks completes once channel state has become different from
        /// given lastObservedState.
        /// If deadline is reached or and error occurs, returned task is cancelled.
        /// </summary>
        public IObservable <bool> WaitForStateChangedAsync(ChannelState lastObservedState, DateTime?deadline = null)
        {
            GrpcPreconditions.CheckArgument(lastObservedState != ChannelState.Shutdown,
                                            "Shutdown is a terminal state. No further state changes can occur.");
            var subject          = new AsyncSubject <bool>();
            var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;
            var handler          = new BatchCompletionDelegate((success, ctx) =>
            {
                subject.OnNext(success);
                subject.OnCompleted();
            });

            handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, handler);
            return(subject);
        }
예제 #4
0
        /// <summary>
        /// Returned tasks completes once channel state has become different from
        /// given lastObservedState.
        /// If deadline is reached or and error occurs, returned task is cancelled.
        /// </summary>
        public Task WaitForStateChangedAsync(ChannelState lastObservedState, DateTime?deadline = null)
        {
            Preconditions.CheckArgument(lastObservedState != ChannelState.FatalFailure,
                                        "FatalFailure is a terminal state. No further state changes can occur.");
            var tcs = new TaskCompletionSource <object>();
            var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;
            var handler          = new BatchCompletionDelegate((success, ctx) =>
            {
                if (success)
                {
                    tcs.SetResult(null);
                }
                else
                {
                    tcs.SetCanceled();
                }
            });

            handle.WatchConnectivityState(lastObservedState, deadlineTimespec, environment.CompletionQueue, environment.CompletionRegistry, handler);
            return(tcs.Task);
        }
예제 #5
0
        /// <summary>
        /// Returned tasks completes once channel state has become different from
        /// given lastObservedState (<c>true</c> is returned) or if the wait has timed out (<c>false</c> is returned).
        /// </summary>
        public Task <bool> TryWaitForStateChangedAsync(ChannelState lastObservedState, DateTime?deadline = null)
        {
            GrpcPreconditions.CheckArgument(lastObservedState != ChannelState.Shutdown,
                                            "Shutdown is a terminal state. No further state changes can occur.");
            var tcs = new TaskCompletionSource <bool>();
            var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;

            lock (myLock)
            {
                if (handle.IsClosed)
                {
                    // If channel has been already shutdown and handle was disposed, we would end up with
                    // an abandoned completion added to the completion registry. Instead, we make sure we fail early.
                    throw new ObjectDisposedException(nameof(handle), "Channel handle has already been disposed.");
                }
                else
                {
                    // pass "tcs" as "state" for WatchConnectivityStateHandler.
                    handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs);
                }
            }
            return(tcs.Task);
        }
예제 #6
0
        public void FromDateTime()
        {
            Assert.AreEqual(new Timespec(0, 0),
                            Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)));

            Assert.AreEqual(new Timespec(10, 5000),
                            Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 10, DateTimeKind.Utc).AddTicks(50)));

            Assert.AreEqual(new Timespec(1437452508, 0),
                            Timespec.FromDateTime(new DateTime(2015, 7, 21, 4, 21, 48, DateTimeKind.Utc)));

            // before epoch
            Assert.AreEqual(new Timespec(-5, 1000),
                            Timespec.FromDateTime(new DateTime(1969, 12, 31, 23, 59, 55, DateTimeKind.Utc).AddTicks(10)));

            // infinity
            Assert.AreEqual(Timespec.InfFuture, Timespec.FromDateTime(DateTime.MaxValue));
            Assert.AreEqual(Timespec.InfPast, Timespec.FromDateTime(DateTime.MinValue));

            // illegal inputs
            Assert.Throws(typeof(ArgumentException),
                          () => Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Unspecified)));
        }