|
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.
|