培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.7 KiB

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Date;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
{
internal class Timeout
{
private long durationMillis;
private long startMillis;
internal Timeout(long durationMillis)
: this(durationMillis, DateTimeUtilities.CurrentUnixMs())
{
}
internal Timeout(long durationMillis, long currentTimeMillis)
{
this.durationMillis = System.Math.Max(0, durationMillis);
this.startMillis = System.Math.Max(0, currentTimeMillis);
}
//internal long RemainingMillis()
//{
// return RemainingMillis(DateTimeUtilities.CurrentUnixMs());
//}
internal long RemainingMillis(long currentTimeMillis)
{
lock (this)
{
// If clock jumped backwards, reset start time
if (startMillis > currentTimeMillis)
{
startMillis = currentTimeMillis;
return durationMillis;
}
long elapsed = currentTimeMillis - startMillis;
long remaining = durationMillis - elapsed;
// Once timeout reached, lock it in
if (remaining <= 0)
return durationMillis = 0L;
return remaining;
}
}
//internal static int ConstrainWaitMillis(int waitMillis, Timeout timeout)
//{
// return constrainWaitMillis(waitMillis, timeout, DateTimeUtilities.CurrentUnixMs());
//}
internal static int ConstrainWaitMillis(int waitMillis, Timeout timeout, long currentTimeMillis)
{
if (waitMillis < 0)
return -1;
int timeoutMillis = GetWaitMillis(timeout, currentTimeMillis);
if (timeoutMillis < 0)
return -1;
if (waitMillis == 0)
return timeoutMillis;
if (timeoutMillis == 0)
return waitMillis;
return System.Math.Min(waitMillis, timeoutMillis);
}
internal static Timeout ForWaitMillis(int waitMillis)
{
return ForWaitMillis(waitMillis, DateTimeUtilities.CurrentUnixMs());
}
internal static Timeout ForWaitMillis(int waitMillis, long currentTimeMillis)
{
if (waitMillis < 0)
throw new ArgumentException("cannot be negative", "waitMillis");
if (waitMillis > 0)
return new Timeout(waitMillis, currentTimeMillis);
return null;
}
//internal static int GetWaitMillis(Timeout timeout)
//{
// return GetWaitMillis(timeout, DateTimeUtilities.CurrentUnixMs());
//}
internal static int GetWaitMillis(Timeout timeout, long currentTimeMillis)
{
if (null == timeout)
return 0;
long remainingMillis = timeout.RemainingMillis(currentTimeMillis);
if (remainingMillis < 1L)
return -1;
if (remainingMillis > int.MaxValue)
return int.MaxValue;
return (int)remainingMillis;
}
internal static bool HasExpired(Timeout timeout)
{
return HasExpired(timeout, DateTimeUtilities.CurrentUnixMs());
}
internal static bool HasExpired(Timeout timeout, long currentTimeMillis)
{
return null != timeout && timeout.RemainingMillis(currentTimeMillis) < 1L;
}
}
}
#pragma warning restore
#endif