Merge pull request #2620 from ludovic-henry/referencesource-waithandle
[mono.git] / mcs / class / corlib / System.Threading / Timer.cs
index 5d41f2388b99ae7df25e1e3c22cf0c96547df37e..d1546a8bfcaa80632664c766dd64e69f70977b22 100644 (file)
@@ -29,7 +29,9 @@
 //
 
 using System.Runtime.InteropServices;
+using System.Collections.Generic;
 using System.Collections;
+using System.Runtime.CompilerServices;
 
 namespace System.Threading
 {
@@ -152,7 +154,7 @@ namespace System.Threading
                                        return true;
                                }
                        } else {
-                               nr = dueTime * TimeSpan.TicksPerMillisecond + DateTime.GetTimeMonotonic ();
+                               nr = dueTime * TimeSpan.TicksPerMillisecond + GetTimeMonotonic ();
                        }
 
                        scheduler.Change (this, nr);
@@ -164,10 +166,19 @@ namespace System.Threading
                        if (notifyObject == null)
                                throw new ArgumentNullException ("notifyObject");
                        Dispose ();
-                       NativeEventCalls.SetEvent_internal (notifyObject.Handle);
+                       NativeEventCalls.SetEvent (notifyObject.SafeWaitHandle);
                        return true;
                }
 
+               // extracted from ../../../../external/referencesource/mscorlib/system/threading/timer.cs
+               internal void KeepRootedWhileScheduled()
+               {
+               }
+
+               // TODO: Environment.TickCount should be enough as is everywhere else
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               static extern long GetTimeMonotonic ();
+
                sealed class TimerComparer : IComparer {
                        public int Compare (object x, object y)
                        {
@@ -310,22 +321,19 @@ namespace System.Threading
                                return idx;
                        }
 
-                       static WaitCallback TimerCaller = new WaitCallback (TimerCB);
                        static void TimerCB (object o)
                        {
                                Timer timer = (Timer) o;
-                               try {
-                                       timer.callback (timer.state);
-                               } catch {}
+                               timer.callback (timer.state);
                        }
 
                        void SchedulerThread ()
                        {
                                Thread.CurrentThread.Name = "Timer-Scheduler";
-                               ArrayList new_time = new ArrayList (512);
+                               var new_time = new List<Timer> (512);
                                while (true) {
                                        int ms_wait = -1;
-                                       long ticks = DateTime.GetTimeMonotonic ();
+                                       long ticks = GetTimeMonotonic ();
                                        lock (this) {
                                                changed.Reset ();
                                                //PrintList ();
@@ -339,14 +347,14 @@ namespace System.Threading
                                                        list.RemoveAt (i);
                                                        count--;
                                                        i--;
-                                                       ThreadPool.UnsafeQueueUserWorkItem (TimerCaller, timer);
+                                                       ThreadPool.UnsafeQueueUserWorkItem (TimerCB, timer);
                                                        long period = timer.period_ms;
                                                        long due_time = timer.due_time_ms;
                                                        bool no_more = (period == -1 || ((period == 0 || period == Timeout.Infinite) && due_time != Timeout.Infinite));
                                                        if (no_more) {
                                                                timer.next_run = Int64.MaxValue;
                                                        } else {
-                                                               timer.next_run = DateTime.GetTimeMonotonic () + TimeSpan.TicksPerMillisecond * timer.period_ms;
+                                                               timer.next_run = GetTimeMonotonic () + TimeSpan.TicksPerMillisecond * timer.period_ms;
                                                                new_time.Add (timer);
                                                        }
                                                }
@@ -354,7 +362,7 @@ namespace System.Threading
                                                // Reschedule timers with a new due time
                                                count = new_time.Count;
                                                for (i = 0; i < count; i++) {
-                                                       Timer timer = (Timer) new_time [i];
+                                                       Timer timer = new_time [i];
                                                        Add (timer);
                                                }
                                                new_time.Clear ();
@@ -373,7 +381,7 @@ namespace System.Threading
                                                //PrintList ();
                                                ms_wait = -1;
                                                if (min_next_run != Int64.MaxValue) {
-                                                       long diff = (min_next_run - DateTime.GetTimeMonotonic ())  / TimeSpan.TicksPerMillisecond;
+                                                       long diff = (min_next_run - GetTimeMonotonic ())  / TimeSpan.TicksPerMillisecond;
                                                        if (diff > Int32.MaxValue)
                                                                ms_wait = Int32.MaxValue - 1;
                                                        else {
@@ -388,7 +396,7 @@ namespace System.Threading
                                }
                        }
 
-                       void ShrinkIfNeeded (ArrayList list, int initial)
+                       void ShrinkIfNeeded (List<Timer> list, int initial)
                        {
                                int capacity = list.Capacity;
                                int count = list.Count;