Luke Pulverenti пре 9 година
родитељ
комит
dc1c69ea7b

+ 1 - 0
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1953,6 +1953,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             await service.CreateTimerAsync(info, cancellationToken).ConfigureAwait(false);
             _lastRecordingRefreshTime = DateTime.MinValue;
+            _logger.Info("New recording scheduled");
         }
 
         public async Task CreateSeriesTimer(SeriesTimerInfoDto timer, CancellationToken cancellationToken)

+ 1 - 1
MediaBrowser.ServerApplication/MainStartup.cs

@@ -218,7 +218,7 @@ namespace MediaBrowser.ServerApplication
             var fileSystem = new WindowsFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")));
             fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
 
-            var nativeApp = new WindowsApp(fileSystem)
+            var nativeApp = new WindowsApp(fileSystem, _logger)
             {
                 IsRunningAsService = runService
             };

+ 4 - 2
MediaBrowser.ServerApplication/Native/WindowsApp.cs

@@ -13,10 +13,12 @@ namespace MediaBrowser.ServerApplication.Native
     public class WindowsApp : INativeApp
     {
         private readonly IFileSystem _fileSystem;
+        private readonly ILogger _logger;
 
-        public WindowsApp(IFileSystem fileSystem)
+        public WindowsApp(IFileSystem fileSystem, ILogger logger)
         {
             _fileSystem = fileSystem;
+            _logger = logger;
         }
 
         public List<Assembly> GetAssembliesWithParts()
@@ -121,7 +123,7 @@ namespace MediaBrowser.ServerApplication.Native
 
         public IPowerManagement GetPowerManagement()
         {
-            return new WindowsPowerManagement();
+            return new WindowsPowerManagement(_logger);
         }
     }
 }

+ 65 - 12
MediaBrowser.ServerApplication/Native/WindowsPowerManagement.cs

@@ -3,6 +3,7 @@ using System.ComponentModel;
 using System.Runtime.InteropServices;
 using System.Threading;
 using MediaBrowser.Controller.Power;
+using MediaBrowser.Model.Logging;
 using Microsoft.Win32.SafeHandles;
 
 namespace MediaBrowser.ServerApplication.Native
@@ -10,31 +11,83 @@ namespace MediaBrowser.ServerApplication.Native
     public class WindowsPowerManagement : IPowerManagement
     {
         [DllImport("kernel32.dll")]
-        public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);
+        public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes,
+                                                                  bool bManualReset,
+                                                                string lpTimerName);
 
         [DllImport("kernel32.dll", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In] ref long pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, bool fResume);
+        public static extern bool SetWaitableTimer(SafeWaitHandle hTimer,
+                                                    [In] ref long pDueTime,
+                                                              int lPeriod,
+                                                           IntPtr pfnCompletionRoutine,
+                                                           IntPtr lpArgToCompletionRoutine,
+                                                             bool fResume);
+
+        private BackgroundWorker _bgWorker;
+        private readonly ILogger _logger;
+        private readonly object _initLock = new object();
+
+        public WindowsPowerManagement(ILogger logger)
+        {
+            _logger = logger;
+        }
 
         public void ScheduleWake(DateTime utcTime)
         {
-            long duetime = utcTime.ToFileTime();
+            Initialize();
+            _bgWorker.RunWorkerAsync(utcTime.ToFileTime());
+        }
 
-            using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer"))
+        private void Initialize()
+        {
+            lock (_initLock)
             {
-                if (SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true))
+                if (_bgWorker == null)
                 {
-                    using (EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset))
-                    {
-                        wh.SafeWaitHandle = handle;
-                        wh.WaitOne();
-                    }
+                    _bgWorker = new BackgroundWorker();
+
+                    _bgWorker.DoWork += bgWorker_DoWork;
+                    _bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
                 }
-                else
+            }
+        }
+
+        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            //if (Woken != null)
+            //{
+            //    Woken(this, new EventArgs());
+            //}
+        }
+
+        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
+        {
+            try
+            {
+                long waketime = (long)e.Argument;
+
+                using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, GetType().Assembly.GetName().Name + "Timer"))
                 {
-                    throw new Win32Exception(Marshal.GetLastWin32Error());
+                    if (SetWaitableTimer(handle, ref waketime, 0, IntPtr.Zero, IntPtr.Zero, true))
+                    {
+                        using (EventWaitHandle wh = new EventWaitHandle(false,
+                                                               EventResetMode.AutoReset))
+                        {
+                            wh.SafeWaitHandle = handle;
+                            wh.WaitOne();
+                        }
+                    }
+                    else
+                    {
+                        throw new Win32Exception(Marshal.GetLastWin32Error());
+                    }
                 }
             }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Error scheduling wake timer", ex);
+            }
         }
     }
 }