diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-15 14:45:58 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-15 14:45:58 -0400 |
| commit | 2b8b98b59090ab6d077ac76cf9185da7d6ac126a (patch) | |
| tree | 106a2b646aea6ec8e854d95414c2a2b09265a4e9 /MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs | |
| parent | 3d9b862430f042af1bcb9a7cdffd446ed09f9ef9 (diff) | |
reduce scanning overhead a bit
Diffstat (limited to 'MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs')
| -rw-r--r-- | MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs index 19c42e8d8..a8eb8f4c0 100644 --- a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs +++ b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Common.Events; +using System.Linq; +using System.Threading; +using MediaBrowser.Common.Events; using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; @@ -8,6 +10,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Updates; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Updates; @@ -49,8 +52,33 @@ namespace MediaBrowser.ServerApplication.EntryPoints /// </summary> private readonly IServerApplicationHost _appHost; + /// <summary> + /// The _task manager + /// </summary> private readonly ITaskManager _taskManager; - + + /// <summary> + /// The _library changed sync lock + /// </summary> + private readonly object _libraryChangedSyncLock = new object(); + + /// <summary> + /// Gets or sets the library update info. + /// </summary> + /// <value>The library update info.</value> + private LibraryUpdateInfo LibraryUpdateInfo { get; set; } + + /// <summary> + /// Gets or sets the library update timer. + /// </summary> + /// <value>The library update timer.</value> + private Timer LibraryUpdateTimer { get; set; } + + /// <summary> + /// The library update duration + /// </summary> + private const int LibraryUpdateDuration = 60000; + /// <summary> /// Initializes a new instance of the <see cref="WebSocketEvents" /> class. /// </summary> @@ -145,7 +173,47 @@ namespace MediaBrowser.ServerApplication.EntryPoints /// <param name="e">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param> void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) { - _serverManager.SendWebSocketMessage("LibraryChanged", () => DtoBuilder.GetLibraryUpdateInfo(e)); + lock (_libraryChangedSyncLock) + { + if (LibraryUpdateInfo == null) + { + LibraryUpdateInfo = new LibraryUpdateInfo(); + } + + if (LibraryUpdateTimer == null) + { + LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration, + Timeout.Infinite); + } + else + { + LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite); + } + + LibraryUpdateInfo.Folders.Add(e.Folder.Id); + + LibraryUpdateInfo.ItemsAdded.AddRange(e.ItemsAdded.Select(i => i.Id)); + LibraryUpdateInfo.ItemsUpdated.AddRange(e.ItemsUpdated.Select(i => i.Id)); + LibraryUpdateInfo.ItemsRemoved.AddRange(e.ItemsRemoved.Select(i => i.Id)); + } + } + + /// <summary> + /// Libraries the update timer callback. + /// </summary> + /// <param name="state">The state.</param> + private void LibraryUpdateTimerCallback(object state) + { + lock (_libraryChangedSyncLock) + { + _serverManager.SendWebSocketMessage("LibraryChanged", LibraryUpdateInfo); + + if (LibraryUpdateTimer != null) + { + LibraryUpdateTimer.Dispose(); + LibraryUpdateTimer = null; + } + } } /// <summary> @@ -206,6 +274,12 @@ namespace MediaBrowser.ServerApplication.EntryPoints { if (dispose) { + if (LibraryUpdateTimer != null) + { + LibraryUpdateTimer.Dispose(); + LibraryUpdateTimer = null; + } + _userManager.UserDeleted -= userManager_UserDeleted; _userManager.UserUpdated -= userManager_UserUpdated; |
