From: <ric...@us...> - 2009-12-05 22:14:16
|
Revision: 4894 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4894&view=rev Author: ricbrown Date: 2009-12-05 22:14:08 +0000 (Sat, 05 Dec 2009) Log Message: ----------- Fix NH-2030 (Thread unsafe method in SqlTypeFactory) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/SqlTypes/SqlTypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/SqlTypes/SqlTypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlTypes/SqlTypeFactory.cs 2009-12-02 15:07:16 UTC (rev 4893) +++ trunk/nhibernate/src/NHibernate/SqlTypes/SqlTypeFactory.cs 2009-12-05 22:14:08 UTC (rev 4894) @@ -47,8 +47,14 @@ SqlType result; if (!SqlTypes.TryGetValue(key, out result)) { - result = createDelegate(length); - SqlTypes.Add(key, result); + lock(SqlTypes) + { + if (!SqlTypes.TryGetValue(key, out result)) + { + result = createDelegate(length); + SqlTypes.Add(key, result); + } + } } return (T) result; } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Fixture.cs 2009-12-05 22:14:08 UTC (rev 4894) @@ -0,0 +1,66 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using NHibernate.Dialect; +using NHibernate.SqlTypes; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2030 +{ + [TestFixture] + public class Fixture : BugTestCase + { + + [Test] + public void GetTypeWithLenShouldBeThreadSafe() + { + object sync = new object(); + List<Exception> exceptions = new List<Exception>(); + + ManualResetEvent startEvent = new ManualResetEvent(false); + var action = new ThreadStart + (() => + { + startEvent.WaitOne(); + try + { + for (int i = 0; i < 1000; i++) + { + SqlTypeFactory.GetString(i); + } + } + catch (Exception e) + { + lock (sync) + { + exceptions.Add(e); + } + } + }); + + const int threadCount = 30; + Thread[] threads = new Thread[threadCount]; + for (int i = 0; i < threadCount; i++) + { + threads[i] = new Thread(action); + threads[i].Start(); + } + startEvent.Set(); + foreach (var thread in threads) + { + thread.Join(); + } + + if(exceptions.Count > 0) + { + foreach(var e in exceptions) + Console.WriteLine(e); + + throw exceptions[0]; + } + + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2030/Mappings.hbm.xml 2009-12-05 22:14:08 UTC (rev 4894) @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2030"> +</hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-12-02 15:07:16 UTC (rev 4893) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-12-05 22:14:08 UTC (rev 4894) @@ -674,6 +674,7 @@ <Compile Include="NHSpecificTest\NH2003\Model.cs" /> <Compile Include="NHSpecificTest\NH2011\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2011\Model.cs" /> + <Compile Include="NHSpecificTest\NH2030\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> <Compile Include="NHSpecificTest\NH473\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Parent.cs" /> @@ -2087,6 +2088,7 @@ <EmbeddedResource Include="CfgTest\Loquacious\EntityToCache.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2030\Mappings.hbm.xml" /> <EmbeddedResource Include="Linq\Mappings\Patient.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2011\Mappings.hbm.xml" /> <EmbeddedResource Include="Linq\Mappings\Animal.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |