|
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------
namespace System.ServiceModel.Discovery
{
using System;
using System.Runtime;
using SR2 = System.ServiceModel.Discovery.SR;
public class DiscoveryMessageSequenceGenerator
{
static readonly DateTime DT1970 = new DateTime(1970, 1, 1);
long instanceId;
Uri sequenceId;
[Fx.Tag.SynchronizationObject(Blocking = false, Kind = Fx.Tag.SynchronizationKind.InterlockedNoSpin)]
long messageNumber;
public DiscoveryMessageSequenceGenerator()
: this(CreateInstanceId(), null)
{
}
[Fx.Tag.Throws(typeof(ArgumentOutOfRangeException), "instanceId")]
public DiscoveryMessageSequenceGenerator(long instanceId, Uri sequenceId)
{
if (instanceId < 0 || instanceId > UInt32.MaxValue)
{
throw FxTrace.Exception.ArgumentOutOfRange("instanceId", instanceId, SR2.DiscoveryAppSequenceInstanceIdOutOfRange);
}
this.instanceId = instanceId;
this.sequenceId = sequenceId;
}
static long CreateInstanceId()
{
return (long)DateTime.Now.Subtract(DT1970).TotalSeconds;
}
[Fx.Tag.InheritThrows(From = "DiscoveryMessageSequenceGenerator", FromDeclaringType = typeof(DiscoveryMessageSequenceGenerator))]
public DiscoveryMessageSequence Next()
{
return new DiscoveryMessageSequence(this.instanceId, this.sequenceId, Threading.Interlocked.Increment(ref this.messageNumber));
}
}
}
|