We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- namespace System.Threading
- {
- using System.Threading;
- using System;
- using System.Security;
- using System.Security.Permissions;
- using Microsoft.Win32;
- using System.Runtime.CompilerServices;
- using System.Runtime.InteropServices;
- using System.Runtime.ConstrainedExecution;
-
- internal class _TimerCallback
- {
- TimerCallback _timerCallback;
- ExecutionContext _executionContext;
- object _state;
- static internal ContextCallback _ccb = new ContextCallback(TimerCallback_Context);
- static internal void TimerCallback_Context(object state)
- {
- _TimerCallback helper = (_TimerCallback)state;
- helper._timerCallback(helper._state);
-
- }
-
- internal _TimerCallback(TimerCallback timerCallback, object state, ref StackCrawlMark stackMark)
- {
- _timerCallback = timerCallback;
- _state = state;
- if (!ExecutionContext.IsFlowSuppressed()) {
- _executionContext = ExecutionContext.Capture(ref stackMark);
- ExecutionContext.ClearSyncContext(_executionContext);
- }
- }
-
-
- static internal void PerformTimerCallback(object state)
- {
- _TimerCallback helper = (_TimerCallback)state;
-
- BCLDebug.Assert(helper != null, "Null state passed to PerformTimerCallback!");
-
- if (helper._executionContext == null) {
- TimerCallback callback = helper._timerCallback;
- callback(helper._state);
- }
- else {
-
- ExecutionContext.Run(helper._executionContext.CreateCopy(), _ccb, helper);
- }
- }
- }
-
- [System.Runtime.InteropServices.ComVisible(true)]
- public delegate void TimerCallback(object state);
-
- [HostProtection(Synchronization = true, ExternalThreading = true)]
- internal sealed class TimerBase : CriticalFinalizerObject, IDisposable
- {
- #pragma warning disable 169
- private IntPtr timerHandle;
- private IntPtr delegateInfo;
- #pragma warning restore 169
- private int timerDeleted;
- private int m_lock = 0;
-
- ~TimerBase()
- {
-
-
- bool bLockTaken = false;
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- DeleteTimerNative(null);
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- }
-
- internal void AddTimer(TimerCallback callback, object state, UInt32 dueTime, UInt32 period, ref StackCrawlMark stackMark)
- {
- if (callback != null) {
- _TimerCallback callbackHelper = new _TimerCallback(callback, state, ref stackMark);
- state = (object)callbackHelper;
- AddTimerNative(state, dueTime, period, ref stackMark);
- timerDeleted = 0;
- }
- else {
- throw new ArgumentNullException("TimerCallback");
- }
- }
-
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
- internal bool ChangeTimer(UInt32 dueTime, UInt32 period)
- {
- bool status = false;
- bool bLockTaken = false;
-
-
-
-
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- }
- finally {
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- if (timerDeleted != 0)
- throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
- status = ChangeTimerNative(dueTime, period);
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- }
- return status;
-
- }
-
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
- internal bool Dispose(WaitHandle notifyObject)
- {
- bool status = false;
- bool bLockTaken = false;
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- }
- finally {
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- status = DeleteTimerNative(notifyObject.SafeWaitHandle);
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- GC.SuppressFinalize(this);
- }
-
- return status;
- }
-
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
- public void Dispose()
- {
- bool bLockTaken = false;
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- }
- finally {
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- DeleteTimerNative(null);
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- GC.SuppressFinalize(this);
- }
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern void AddTimerNative(object state, UInt32 dueTime, UInt32 period, ref StackCrawlMark stackMark);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern bool ChangeTimerNative(UInt32 dueTime, UInt32 period);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern bool DeleteTimerNative(SafeHandle notifyObject);
-
- }
-
- [HostProtection(Synchronization = true, ExternalThreading = true)]
- [System.Runtime.InteropServices.ComVisible(true)]
- public sealed class Timer : MarshalByRefObject, IDisposable
- {
- private const UInt32 MAX_SUPPORTED_TIMEOUT = (uint)4294967294u;
- private TimerBase timerBase;
-
- public Timer(TimerCallback callback, object state, int dueTime, int period)
- {
- if (dueTime < -1)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (period < -1)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
-
- TimerSetup(callback, state, (UInt32)dueTime, (UInt32)period, ref stackMark);
- }
-
- public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period)
- {
- long dueTm = (long)dueTime.TotalMilliseconds;
- if (dueTm < -1)
- throw new ArgumentOutOfRangeException("dueTm", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (dueTm > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("dueTm", Environment.GetResourceString("ArgumentOutOfRange_TimeoutTooLarge"));
-
- long periodTm = (long)period.TotalMilliseconds;
- if (periodTm < -1)
- throw new ArgumentOutOfRangeException("periodTm", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (periodTm > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("periodTm", Environment.GetResourceString("ArgumentOutOfRange_PeriodTooLarge"));
-
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- TimerSetup(callback, state, (UInt32)dueTm, (UInt32)periodTm, ref stackMark);
- }
-
- [CLSCompliant(false)]
- public Timer(TimerCallback callback, object state, UInt32 dueTime, UInt32 period)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- TimerSetup(callback, state, dueTime, period, ref stackMark);
- }
-
- public Timer(TimerCallback callback, object state, long dueTime, long period)
- {
- if (dueTime < -1)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (period < -1)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (dueTime > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_TimeoutTooLarge"));
- if (period > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_PeriodTooLarge"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- TimerSetup(callback, state, (UInt32)dueTime, (UInt32)period, ref stackMark);
- }
-
- public Timer(TimerCallback callback)
- {
- int dueTime = -1;
-
- int period = -1;
-
-
-
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- TimerSetup(callback, this, (UInt32)dueTime, (UInt32)period, ref stackMark);
- }
-
- private void TimerSetup(TimerCallback callback, object state, UInt32 dueTime, UInt32 period, ref StackCrawlMark stackMark)
- {
- timerBase = new TimerBase();
- timerBase.AddTimer(callback, state, (UInt32)dueTime, (UInt32)period, ref stackMark);
- }
-
- public bool Change(int dueTime, int period)
- {
- if (dueTime < -1)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (period < -1)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
-
- return timerBase.ChangeTimer((UInt32)dueTime, (UInt32)period);
- }
-
- public bool Change(TimeSpan dueTime, TimeSpan period)
- {
- return Change((long)dueTime.TotalMilliseconds, (long)period.TotalMilliseconds);
- }
-
- [CLSCompliant(false)]
- public bool Change(UInt32 dueTime, UInt32 period)
- {
- return timerBase.ChangeTimer(dueTime, period);
- }
-
- public bool Change(long dueTime, long period)
- {
- if (dueTime < -1)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (period < -1)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (dueTime > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("dueTime", Environment.GetResourceString("ArgumentOutOfRange_TimeoutTooLarge"));
- if (period > MAX_SUPPORTED_TIMEOUT)
- throw new ArgumentOutOfRangeException("period", Environment.GetResourceString("ArgumentOutOfRange_PeriodTooLarge"));
-
- return timerBase.ChangeTimer((UInt32)dueTime, (UInt32)period);
- }
-
- public bool Dispose(WaitHandle notifyObject)
- {
- if (notifyObject == null)
- throw new ArgumentNullException("notifyObject");
- return timerBase.Dispose(notifyObject);
- }
-
-
- public void Dispose()
- {
- timerBase.Dispose();
- }
- }
- }