internal long TimeoutTicks(TimeSpan timeout)
{
if (timeout != TimeSpan.Zero)
{
// Note: At the current setting of approximately 2 ticks per second this timer will
// wrap in approximately 2^64/2/60/60/24/365=292,471,208,677.5360162195585996
// (nearly 300 billion) years.
long timeoutTicks = ((timeout.Ticks / TimeSpan.TicksPerMillisecond) >>
TransactionTable.timerInternalExponent) + _ticks;
// The increment of 2 is necessary to account for the half-second that is
// lost due to the right-shift truncation and also for the half-second
// that might be lost because the transaction's AbsoluteTimeout is
// calculated just before this._ticks is incremented.
// This increment by 2 could cause a transaction to last up to 1 second longer than the
// specified timeout, but there are no guarantees that the transaction
// will timeout exactly at the time specified. But we shouldn't timeout
// the transaction earlier than the specified time, which is possible without
// this adjustment.
return timeoutTicks + 2;
}
else
{
return long.MaxValue;
}
}