Merge pull request #6 from arthurrump/lockfix

Fix "An item with the same key has already been added." race condition
This commit is contained in:
William Bradley 2019-11-10 16:05:25 +13:00 коммит произвёл GitHub
Родитель 4eb225b731 dd253edad2
Коммит 8d2b183ccf
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 35 добавлений и 13 удалений

Просмотреть файл

@ -15,7 +15,7 @@ namespace ColorCode
public CodeColorizerBase(StyleDictionary Styles, ILanguageParser languageParser)
{
this.languageParser = languageParser
?? new LanguageParser(new LanguageCompiler(Languages.CompiledLanguages), Languages.LanguageRepository);
?? new LanguageParser(new LanguageCompiler(Languages.CompiledLanguages, Languages.CompileLock), Languages.LanguageRepository);
this.Styles = Styles ?? StyleDictionary.DefaultLight;
}

Просмотреть файл

@ -15,11 +15,10 @@ namespace ColorCode.Compilation
private readonly Dictionary<string, CompiledLanguage> compiledLanguages;
private readonly ReaderWriterLockSlim compileLock;
public LanguageCompiler(Dictionary<string, CompiledLanguage> compiledLanguages)
public LanguageCompiler(Dictionary<string, CompiledLanguage> compiledLanguages, ReaderWriterLockSlim compileLock)
{
this.compiledLanguages = compiledLanguages;
compileLock = new ReaderWriterLockSlim();
this.compileLock = compileLock;
}
public CompiledLanguage Compile(ILanguage language)

Просмотреть файл

@ -1,6 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
using System.Collections.Generic;
using System.Threading;
using ColorCode.Common;
using ColorCode.Compilation;
using ColorCode.Compilation.Languages;
@ -15,12 +16,14 @@ namespace ColorCode
internal static readonly LanguageRepository LanguageRepository;
internal static readonly Dictionary<string, ILanguage> LoadedLanguages;
internal static Dictionary<string, CompiledLanguage> CompiledLanguages;
internal static ReaderWriterLockSlim CompileLock;
static Languages()
{
LoadedLanguages = new Dictionary<string, ILanguage>();
CompiledLanguages = new Dictionary<string, CompiledLanguage>();
LanguageRepository = new LanguageRepository(LoadedLanguages);
CompileLock = new ReaderWriterLockSlim();
Load<JavaScript>();
Load<Html>();

Просмотреть файл

@ -1,4 +1,6 @@
using System;
using System.Linq;
using System.Threading.Tasks;
namespace ColorCode.BasicTests
{
@ -6,18 +8,36 @@ namespace ColorCode.BasicTests
{
private static void Main(string[] args)
{
var csharpstring = "public void Method()\n{\n}";
var formatter = new HtmlClassFormatter();
var html = formatter.GetHtmlString(csharpstring, Languages.CSharp);
var css = formatter.GetCSSString();
if (args.Contains("--concurrent"))
{
var tasks = new Task[100];
for (int i = 0; i < 100; i++)
{
tasks[i] = Task.Run(() =>
{
var code = "public void Method()\n{\n}";
var formatter = new HtmlFormatter();
var html = formatter.GetHtmlString(code, Languages.CSharp);
Console.WriteLine(html);
});
}
Task.WaitAll(tasks);
}
else
{
var csharpstring = "public void Method()\n{\n}";
var formatter = new HtmlClassFormatter();
var html = formatter.GetHtmlString(csharpstring, Languages.CSharp);
var css = formatter.GetCSSString();
Console.WriteLine("Original:");
Console.WriteLine(csharpstring);
Console.WriteLine("Original:");
Console.WriteLine(csharpstring);
Console.WriteLine("HTML:");
Console.WriteLine(html);
Console.WriteLine("HTML:");
Console.WriteLine(html);
Console.ReadKey();
Console.ReadKey();
}
}
}
}