Skip to content

Commit

Permalink
Fix Memory Leak and major memory cleanup (string.Intern large dupe st…
Browse files Browse the repository at this point in the history
…rings)
  • Loading branch information
da3dsoul committed Jun 14, 2017
1 parent f21e7a9 commit 64f3d8f
Show file tree
Hide file tree
Showing 17 changed files with 304 additions and 127 deletions.
21 changes: 12 additions & 9 deletions Shoko.Desktop/MainWindow.xaml.cs
Expand Up @@ -78,11 +78,14 @@ private enum TAB_UTILITY
Rankings
};

public static readonly int TAB_Settings_Essential = 0;
public static readonly int TAB_Settings_AniDB = 1;
public static readonly int TAB_Settings_TvDB = 2;
public static readonly int TAB_Settings_WebCache = 3;
public static readonly int TAB_Settings_Display = 4;
public enum TAB_Settings
{
Essential = 0,
AniDB,
TvDB,
WebCache,
Display
}

private static System.Timers.Timer postStartTimer = null;

Expand Down Expand Up @@ -849,7 +852,7 @@ void tabSettingsChild_SelectionChanged(object sender, SelectionChangedEventArgs
if (e.Source is TabControl)
{
TabControl tab = e.Source as TabControl;
if (tab.SelectedIndex == TAB_Settings_Display)
if (tab.SelectedIndex == (int) TAB_Settings.Display)
{
if (VM_ShokoServer.Instance.SelectedLanguages.Count == 0) VM_ShokoServer.Instance.RefreshNamingLanguages();
}
Expand Down Expand Up @@ -1346,7 +1349,7 @@ private void RefreshView()
private void CommandBinding_EditTraktCredentials(object sender, ExecutedRoutedEventArgs e)
{
tabControl1.SelectedIndex = (int) TAB_MAIN.Settings;
tabSettingsChild.SelectedIndex = TAB_Settings_TvDB;
tabSettingsChild.SelectedIndex = (int) TAB_Settings.TvDB;
}

public void ShowPinnedFileAvDump(VM_VideoLocal vid)
Expand Down Expand Up @@ -2027,9 +2030,9 @@ private void CommandBinding_Search(object sender, ExecutedRoutedEventArgs e)
// move to all groups
VM_MainListHelper.Instance.ShowAllGroups();

if (e.Parameter is CL_AnimeTag)
if (e.Parameter is VM_AnimeTag)
{
CL_AnimeTag obj = e.Parameter as CL_AnimeTag;
VM_AnimeTag obj = e.Parameter as VM_AnimeTag;
txtGroupSearch.Text = obj.TagName;
}

Expand Down
1 change: 1 addition & 0 deletions Shoko.Desktop/Shoko.Desktop.csproj
Expand Up @@ -289,6 +289,7 @@
<Compile Include="Enums\DashWatchNextStyle.cs" />
<Compile Include="Utilities\ObservableCollectionEx.cs" />
<Compile Include="Utilities\ObservableListDictionary.cs" />
<Compile Include="ViewModel\Server\VM_AnimeTag.cs" />
<Compile Include="ViewModel\Server\VM_GroupVideoQuality.cs" />
<Compile Include="ViewModel\VM_AvailableEpisodeTypeContainer.cs" />
<Compile Include="ViewModel\VM_WatchedStatusContainer.cs" />
Expand Down
125 changes: 62 additions & 63 deletions Shoko.Desktop/UserControls/AnimeSeries.xaml.cs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Shoko.Desktop/ViewModel/Server/VM_AniDB_Anime.cs
Expand Up @@ -36,7 +36,7 @@ public string DescriptionFormatted
{
if (string.IsNullOrEmpty(Description))
return Shoko.Commons.Properties.Resources.Recommendation_NoOverview;
return Description;
return string.Intern(Description);
}
}

Expand Down
34 changes: 17 additions & 17 deletions Shoko.Desktop/ViewModel/Server/VM_AniDB_AnimeCrossRefs.cs
Expand Up @@ -22,7 +22,7 @@ public class VM_AniDB_AnimeCrossRefs : CL_AniDB_AnimeCrossRefs, INotifyPropertyC
private VM_AniDB_Anime anime;
public new int AnimeID
{
get { return base.AnimeID; }
get => base.AnimeID;
set
{
base.AnimeID = value;
Expand All @@ -45,14 +45,14 @@ public void NotifyPropertyChanged(string propname)
#region TvDB

[ScriptIgnore, JsonIgnore, XmlIgnore]
public bool TvDBCrossRefExists => !(Obs_CrossRef_AniDB_TvDB.Count == 0);
public bool TvDBCrossRefExists => Obs_CrossRef_AniDB_TvDB.Count != 0;

[ScriptIgnore, JsonIgnore, XmlIgnore]
public bool TvDBCrossRefMissing => (Obs_CrossRef_AniDB_TvDB.Count == 0);
public bool TvDBCrossRefMissing => Obs_CrossRef_AniDB_TvDB.Count == 0;

public new List<VM_TvDB_Series> TvDBSeries
{
get { return base.TvDBSeries.CastList<VM_TvDB_Series>(); }
get => base.TvDBSeries.CastList<VM_TvDB_Series>();
set
{
this.SetField(()=>base.TvDBSeries, (r)=>base.TvDBSeries=r, value.CastList<TvDB_Series>(), () => TvDBSeries, () => TvDBCrossRefExists, () => TvDBCrossRefMissing);
Expand Down Expand Up @@ -85,12 +85,12 @@ public ObservableCollectionEx<VM_CrossRef_AniDB_TvDBV2> Obs_CrossRef_AniDB_TvDB

public new List<VM_TvDB_Episode> TvDBEpisodes
{
get { return base.TvDBEpisodes.CastList<VM_TvDB_Episode>(); }
get => base.TvDBEpisodes.CastList<VM_TvDB_Episode>();
set { this.SetField(()=>base.TvDBEpisodes, (r)=>base.TvDBEpisodes=r, value.CastList<TvDB_Episode>(),()=>TvDBEpisodes); }
}
public new List<VM_TvDB_ImageFanart> TvDBImageFanarts
{
get { return base.TvDBImageFanarts.CastList<VM_TvDB_ImageFanart>(); }
get => base.TvDBImageFanarts.CastList<VM_TvDB_ImageFanart>();
set
{
foreach (VM_TvDB_ImageFanart contract in value)
Expand All @@ -104,7 +104,7 @@ public new List<VM_TvDB_ImageFanart> TvDBImageFanarts
}
public new List<VM_TvDB_ImagePoster> TvDBImagePosters
{
get { return base.TvDBImagePosters.CastList<VM_TvDB_ImagePoster>(); }
get => base.TvDBImagePosters.CastList<VM_TvDB_ImagePoster>();
set
{
foreach (VM_TvDB_ImagePoster contract in value)
Expand All @@ -118,7 +118,7 @@ public new List<VM_TvDB_ImagePoster> TvDBImagePosters
}
public new List<VM_TvDB_ImageWideBanner> TvDBImageWideBanners
{
get { return base.TvDBImageWideBanners.CastList<VM_TvDB_ImageWideBanner>(); }
get => base.TvDBImageWideBanners.CastList<VM_TvDB_ImageWideBanner>();
set
{
foreach (VM_TvDB_ImageWideBanner contract in value)
Expand All @@ -143,7 +143,7 @@ public new List<VM_TvDB_ImageWideBanner> TvDBImageWideBanners

public new VM_MovieDB_Movie MovieDBMovie
{
get { return (VM_MovieDB_Movie)base.MovieDBMovie; }
get => (VM_MovieDB_Movie)base.MovieDBMovie;
set
{
this.SetField(()=>base.MovieDBMovie, (r)=>base.MovieDBMovie=r, value, ()=>MovieDBMovie, () => MovieDBCrossRefExists, () => MovieDBCrossRefMissing);
Expand All @@ -152,7 +152,7 @@ public new VM_MovieDB_Movie MovieDBMovie

public new CrossRef_AniDB_Other CrossRef_AniDB_MovieDB
{
get { return base.CrossRef_AniDB_MovieDB; }
get => base.CrossRef_AniDB_MovieDB;
set
{
this.SetField(()=>base.CrossRef_AniDB_MovieDB,(r)=> base.CrossRef_AniDB_MovieDB = r, value, () => CrossRef_AniDB_MovieDB, () => MovieDBCrossRefExists, ()=>MovieDBCrossRefMissing);
Expand All @@ -161,7 +161,7 @@ public new CrossRef_AniDB_Other CrossRef_AniDB_MovieDB

public new List<VM_MovieDB_Fanart> MovieDBFanarts
{
get { return base.MovieDBFanarts.CastList<VM_MovieDB_Fanart>(); }
get => base.MovieDBFanarts.CastList<VM_MovieDB_Fanart>();
set
{
foreach (VM_MovieDB_Fanart contract in value)
Expand All @@ -175,7 +175,7 @@ public new List<VM_MovieDB_Fanart> MovieDBFanarts
}
public new List<VM_MovieDB_Poster> MovieDBPosters
{
get { return base.MovieDBPosters.CastList<VM_MovieDB_Poster>(); }
get => base.MovieDBPosters.CastList<VM_MovieDB_Poster>();
set
{
foreach (VM_MovieDB_Poster contract in value)
Expand All @@ -196,7 +196,7 @@ public new List<VM_MovieDB_Poster> MovieDBPosters
[ScriptIgnore, JsonIgnore, XmlIgnore]
public List<VM_PosterContainer> AllPosters
{
get { return allPosters; }
get => allPosters;
set
{
this.SetField(()=>allPosters, value);
Expand All @@ -207,7 +207,7 @@ public List<VM_PosterContainer> AllPosters
[ScriptIgnore, JsonIgnore, XmlIgnore]
public List<VM_FanartContainer> AllFanarts
{
get { return allFanarts; }
get => allFanarts;
set
{
this.SetField(()=>allFanarts, value);
Expand All @@ -222,7 +222,7 @@ public List<VM_FanartContainer> AllFanarts

public new List<VM_Trakt_Show> TraktShows
{
get { return base.TraktShows.CastList<VM_Trakt_Show>(); }
get => base.TraktShows.CastList<VM_Trakt_Show>();
set
{
this.SetField(()=>base.TraktShows,(r)=>base.TraktShows=r, value.CastList<CL_Trakt_Show>(), ()=>TraktShows, () => TraktCrossRefExists, () => TraktCrossRefMissing);
Expand All @@ -231,7 +231,7 @@ public new List<VM_Trakt_Show> TraktShows

public new List<VM_Trakt_ImageFanart> TraktImageFanarts
{
get { return base.TraktImageFanarts.CastList<VM_Trakt_ImageFanart>(); }
get => base.TraktImageFanarts.CastList<VM_Trakt_ImageFanart>();
set
{
foreach (VM_Trakt_ImageFanart contract in value)
Expand All @@ -246,7 +246,7 @@ public new List<VM_Trakt_ImageFanart> TraktImageFanarts

public new List<VM_Trakt_ImagePoster> TraktImagePosters
{
get { return base.TraktImagePosters.CastList<VM_Trakt_ImagePoster>(); }
get => base.TraktImagePosters.CastList<VM_Trakt_ImagePoster>();
set
{
foreach (VM_Trakt_ImagePoster contract in value)
Expand Down
16 changes: 8 additions & 8 deletions Shoko.Desktop/ViewModel/Server/VM_AniDB_AnimeDetailed.cs
Expand Up @@ -45,14 +45,14 @@ public new List<VM_AnimeTitle> AnimeTitles

}
}
public new List<CL_AnimeTag> Tags
public new List<VM_AnimeTag> Tags
{
get { return base.Tags; }
set { base.Tags = value.OrderByDescending(a => a.Weight).ToList(); }
get { return base.Tags.CastList<VM_AnimeTag>(); }
set { base.Tags = value.OrderByDescending(a => a.Weight).ToList().CastList<CL_AnimeTag>(); }
}

[ScriptIgnore, JsonIgnore, XmlIgnore]
public List<CL_AnimeTag> TagsSummary => Tags.Take(5).ToList();
public List<VM_AnimeTag> TagsSummary => Tags.Take(5).ToList();

public new List<CustomTag> CustomTags
{
Expand Down Expand Up @@ -143,10 +143,10 @@ public void Populate(VM_AniDB_AnimeDetailed contract)
{
AniDBAnime = contract.AniDBAnime;
UserVote = contract.UserVote;
Stat_AllVideoQuality =contract.Stat_AllVideoQuality;
Stat_AllVideoQuality_Episodes = contract.Stat_AllVideoQuality_Episodes;
Stat_AudioLanguages = contract.Stat_AudioLanguages;
Stat_SubtitleLanguages = contract.Stat_SubtitleLanguages;
Stat_AllVideoQuality =contract.Stat_AllVideoQuality;
Stat_AllVideoQuality_Episodes = contract.Stat_AllVideoQuality_Episodes;
Stat_AudioLanguages = contract.Stat_AudioLanguages;
Stat_SubtitleLanguages = contract.Stat_SubtitleLanguages;
Tags = contract.Tags;
CustomTags = contract.CustomTags;
AnimeTitles = contract.AnimeTitles;
Expand Down
47 changes: 41 additions & 6 deletions Shoko.Desktop/ViewModel/Server/VM_AniDB_Character.cs
@@ -1,4 +1,5 @@
using System.ComponentModel;
using System;
using System.ComponentModel;
using System.IO;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
Expand Down Expand Up @@ -32,31 +33,65 @@ public new VM_AniDB_Seiyuu Seiyuu


[ScriptIgnore, JsonIgnore, XmlIgnore]
public string ImagePathPlain => Path.Combine(Utils.GetAniDBCharacterImagePath(CharID), PicName);
public string ImagePathPlain => string.Intern(Path.Combine(Utils.GetAniDBCharacterImagePath(CharID), PicName));

[ScriptIgnore, JsonIgnore, XmlIgnore]
public string CharNameShort => CharName.Length <= 25 ? CharName : CharName.Substring(0, 24) + "...";
public string CharNameShort => CharName.Length <= 25 ? CharName : string.Intern(CharName.Substring(0, 24) + "...");

[ScriptIgnore, JsonIgnore, XmlIgnore]
public string ImagePath
{
get
{
string fileName = Path.Combine(Utils.GetAniDBCharacterImagePath(CharID), PicName);
string fileName = string.Intern(Path.Combine(Utils.GetAniDBCharacterImagePath(CharID), PicName));

if (!File.Exists(fileName))
{
ImageDownloadRequest req = new ImageDownloadRequest(ImageEntityType.AniDB_Character, this, false);
MainWindow.imageHelper.DownloadImage(req);
if (File.Exists(fileName)) return fileName;

string packUriBlank = $"pack://application:,,,/{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name};component/Images/blankposter.png";
string packUriBlank = string.Intern($"pack://application:,,,/{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name};component/Images/blankposter.png");
return packUriBlank;
}
return fileName;
}
}

public new string PicName
{
get => base.PicName == null ? null : string.Intern(base.PicName);
set => base.PicName = value == null ? null : string.Intern(value);
}

public new string CreatorListRaw
{
get => base.CreatorListRaw == null ? null : string.Intern(base.CreatorListRaw);
set => base.CreatorListRaw = value == null ? null : string.Intern(value);
}

public new string CharName
{
get => base.CharName == null ? null : string.Intern(base.CharName);
set => base.CharName = value == null ? null : string.Intern(value);
}

public new string CharKanjiName
{
get => base.CharKanjiName == null ? null : string.Intern(base.CharKanjiName);
set => base.CharKanjiName = value == null ? null : string.Intern(value);
}

public new string CharDescription
{
get => base.CharDescription == null ? null : string.Intern(base.CharDescription);
set => base.CharDescription = value == null ? null : string.Intern(value);
}

public new string CharType
{
get => base.CharType == null ? null : string.Intern(base.CharType);
set => base.CharType = value == null ? null : string.Intern(value);
}
}
}
}
19 changes: 19 additions & 0 deletions Shoko.Desktop/ViewModel/Server/VM_AnimeTag.cs
@@ -0,0 +1,19 @@
using Shoko.Models.Client;

namespace Shoko.Desktop.ViewModel.Server
{
public class VM_AnimeTag : CL_AnimeTag
{
public new string TagName
{
get => base.TagName == null ? null : string.Intern(base.TagName);
set => base.TagName = value == null ? null : string.Intern(value);
}

public new string TagDescription
{
get => base.TagDescription == null ? null : string.Intern(base.TagDescription);
set => base.TagDescription = value == null ? null : string.Intern(value);
}
}
}
22 changes: 20 additions & 2 deletions Shoko.Desktop/ViewModel/Server/VM_AnimeTitle.cs
Expand Up @@ -10,8 +10,26 @@ namespace Shoko.Desktop.ViewModel.Server
public class VM_AnimeTitle : CL_AnimeTitle
{
[ScriptIgnore, JsonIgnore, XmlIgnore]
public string FlagImage => this.GetFlagImage();
public string FlagImage => string.Intern(this.GetFlagImage());
[ScriptIgnore, JsonIgnore, XmlIgnore]
public string LanguageDescription => this.GetLanguageDescription();
public string LanguageDescription => string.Intern(this.GetLanguageDescription());

public new string TitleType
{
get => base.TitleType == null ? null : string.Intern(base.TitleType);
set => base.TitleType = value == null ? null : string.Intern(value);
}

public new string Language
{
get => base.Language == null ? null : string.Intern(base.Language);
set => base.Language = value == null ? null : string.Intern(value);
}

public new string Title
{
get => base.Title == null ? null : string.Intern(base.Title);
set => base.Title = value == null ? null : string.Intern(value);
}
}
}

0 comments on commit 64f3d8f

Please sign in to comment.