Browse Source

ICSharpCode.Core: memory optimization: use common XmlNameTable for all addins being loaded.

pull/15/head
Daniel Grunwald 15 years ago
parent
commit
5990c898ec
  1. 18
      src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs
  2. 2
      src/Main/Core/Project/Src/AddInTree/AddInManager.cs
  3. 3
      src/Main/Core/Project/Src/AddInTree/AddInTree.cs
  4. 6
      src/Main/Core/Project/Src/Services/PropertyService/Properties.cs

18
src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs

@ -227,6 +227,7 @@ namespace ICSharpCode.Core @@ -227,6 +227,7 @@ namespace ICSharpCode.Core
}
string fileName = Path.Combine(hintPath, reader.GetAttribute(0));
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.NameTable = reader.NameTable; // share the name table
xrs.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlReader includeReader = XmlTextReader.Create(fileName, xrs)) {
SetupAddIn(includeReader, addIn, Path.GetDirectoryName(fileName));
@ -260,16 +261,13 @@ namespace ICSharpCode.Core @@ -260,16 +261,13 @@ namespace ICSharpCode.Core
return paths[pathName];
}
public static AddIn Load(TextReader textReader)
{
return Load(textReader, null);
}
public static AddIn Load(TextReader textReader, string hintPath)
public static AddIn Load(TextReader textReader, string hintPath = null, XmlNameTable nameTable = null)
{
if (nameTable == null)
nameTable = new NameTable();
try {
AddIn addIn = new AddIn();
using (XmlTextReader reader = new XmlTextReader(textReader)) {
using (XmlTextReader reader = new XmlTextReader(textReader, nameTable)) {
while (reader.Read()){
if (reader.IsStartElement()) {
switch (reader.LocalName) {
@ -289,14 +287,16 @@ namespace ICSharpCode.Core @@ -289,14 +287,16 @@ namespace ICSharpCode.Core
}
}
public static AddIn Load(string fileName)
public static AddIn Load(string fileName, XmlNameTable nameTable = null)
{
try {
using (TextReader textReader = File.OpenText(fileName)) {
AddIn addIn = Load(textReader, Path.GetDirectoryName(fileName));
AddIn addIn = Load(textReader, Path.GetDirectoryName(fileName), nameTable);
addIn.addInFileName = fileName;
return addIn;
}
} catch (AddInLoadException) {
throw;
} catch (Exception e) {
throw new AddInLoadException("Can't load " + fileName, e);
}

2
src/Main/Core/Project/Src/AddInTree/AddInManager.cs

@ -260,7 +260,7 @@ namespace ICSharpCode.Core @@ -260,7 +260,7 @@ namespace ICSharpCode.Core
/// </summary>
/// <param name="addIns">
/// The list of AddIns to add. (use <see cref="AddIn"/> instances
/// created by <see cref="AddIn.Load(TextReader)"/>).
/// created by <see cref="AddIn.Load(TextReader,string,XmlNameTable)"/>).
/// </param>
public static void AddExternalAddIns(IList<AddIn> addIns)
{

3
src/Main/Core/Project/Src/AddInTree/AddInTree.cs

@ -347,10 +347,11 @@ namespace ICSharpCode.Core @@ -347,10 +347,11 @@ namespace ICSharpCode.Core
List<AddIn> list = new List<AddIn>();
Dictionary<string, Version> dict = new Dictionary<string, Version>();
Dictionary<string, AddIn> addInDict = new Dictionary<string, AddIn>();
var nameTable = new System.Xml.NameTable();
foreach (string fileName in addInFiles) {
AddIn addIn;
try {
addIn = AddIn.Load(fileName);
addIn = AddIn.Load(fileName, nameTable);
} catch (AddInLoadException ex) {
LoggingService.Error(ex);
if (ex.InnerException != null) {

6
src/Main/Core/Project/Src/Services/PropertyService/Properties.cs

@ -151,7 +151,11 @@ namespace ICSharpCode.Core @@ -151,7 +151,11 @@ namespace ICSharpCode.Core
if (reader.HasAttributes) {
for (int i = 0; i < reader.AttributeCount; i++) {
reader.MoveToAttribute(i);
properties[reader.Name] = reader.Value;
// some values are frequently repeated (e.g. type="MenuItem"),
// so we also use the NameTable for attribute values
// (XmlReader itself only uses it for attribute names)
string val = reader.NameTable.Add(reader.Value);
properties[reader.Name] = val;
}
reader.MoveToElement(); //Moves the reader back to the element node.
}

Loading…
Cancel
Save