From 2fdca28dd4311dc4cb55dfd2bce10b4fe92aa66d Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Mon, 19 Nov 2007 15:07:04 +0000
Subject: hopefully resolve mantis issue #10 by locking correcty around terrain
 methods

---
 .../MonoSqliteDataStore.cs                         | 104 +++++++++++----------
 1 file changed, 54 insertions(+), 50 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
index a9fb869..fc6f59c 100644
--- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
+++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
@@ -262,70 +262,74 @@ namespace OpenSim.DataStore.MonoSqlite
 
         public void StoreTerrain(double[,] ter, LLUUID regionID)
         {
-            int revision = Util.UnixTimeSinceEpoch();
-
-            // the following is an work around for .NET.  The perf
-            // issues associated with it aren't as bad as you think.
-            SqliteConnection conn = new SqliteConnection(m_connectionString);
-            conn.Open();
-            MainLog.Instance.Verbose("DATASTORE", "Storing terrain revision r" + revision.ToString());
-            String sql = "insert into terrain(RegionUUID, Revision, Heightfield)" +
-                " values(:RegionUUID, :Revision, :Heightfield)";
-
-            using(SqliteCommand cmd = new SqliteCommand(sql, conn))
-            {
-                cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
-                cmd.Parameters.Add(new SqliteParameter(":Revision", revision));
-                cmd.Parameters.Add(new SqliteParameter(":Heightfield", serializeTerrain(ter)));
-                cmd.ExecuteNonQuery();
+            lock (ds) {
+                int revision = Util.UnixTimeSinceEpoch();
+                
+                // the following is an work around for .NET.  The perf
+                // issues associated with it aren't as bad as you think.
+                SqliteConnection conn = new SqliteConnection(m_connectionString);
+                conn.Open();
+                MainLog.Instance.Verbose("DATASTORE", "Storing terrain revision r" + revision.ToString());
+                String sql = "insert into terrain(RegionUUID, Revision, Heightfield)" +
+                    " values(:RegionUUID, :Revision, :Heightfield)";
+
+                using(SqliteCommand cmd = new SqliteCommand(sql, conn))
+                {
+                    cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
+                    cmd.Parameters.Add(new SqliteParameter(":Revision", revision));
+                    cmd.Parameters.Add(new SqliteParameter(":Heightfield", serializeTerrain(ter)));
+                    cmd.ExecuteNonQuery();
+                }
+                conn.Close();
             }
-            conn.Close();
         }
 
         public double[,] LoadTerrain(LLUUID regionID)
         {
-            double[,] terret = new double[256,256];
-            terret.Initialize();
-            // the following is an work around for .NET.  The perf
-            // issues associated with it aren't as bad as you think.
-            SqliteConnection conn = new SqliteConnection(m_connectionString);
-            conn.Open();
-            String sql = "select RegionUUID, Revision, Heightfield from terrain" + 
-              " where RegionUUID=:RegionUUID order by Revision desc";
-
-            
-            using (SqliteCommand cmd = new SqliteCommand(sql, conn))
-            {
-                cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
-
-                using (IDataReader row = cmd.ExecuteReader())
+            lock (ds) {
+                double[,] terret = new double[256,256];
+                terret.Initialize();
+                // the following is an work around for .NET.  The perf
+                // issues associated with it aren't as bad as you think.
+                SqliteConnection conn = new SqliteConnection(m_connectionString);
+                conn.Open();
+                String sql = "select RegionUUID, Revision, Heightfield from terrain" + 
+                    " where RegionUUID=:RegionUUID order by Revision desc";
+                
+                
+                using (SqliteCommand cmd = new SqliteCommand(sql, conn))
                 {
-                    int rev = 0;
-                    if (row.Read())
+                    cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
+                    
+                    using (IDataReader row = cmd.ExecuteReader())
                     {
-                        // TODO: put this into a function
-                        byte[] heightmap = (byte[]) row["Heightfield"];
-                        for (int x = 0; x < 256; x++)
+                        int rev = 0;
+                        if (row.Read())
                         {
-                            for (int y = 0; y < 256; y++)
+                            // TODO: put this into a function
+                            byte[] heightmap = (byte[]) row["Heightfield"];
+                            for (int x = 0; x < 256; x++)
                             {
-                                terret[x, y] = BitConverter.ToDouble(heightmap, ((x*256) + y)*8);
+                                for (int y = 0; y < 256; y++)
+                                {
+                                    terret[x, y] = BitConverter.ToDouble(heightmap, ((x*256) + y)*8);
+                                }
                             }
+                            rev = (int)row["Revision"];
                         }
-                        rev = (int)row["Revision"];
-                    }
-                    else
-                    {
-                        MainLog.Instance.Verbose("DATASTORE", "No terrain found for region");
-                        conn.Close();
-                        return null;
+                        else
+                        {
+                            MainLog.Instance.Verbose("DATASTORE", "No terrain found for region");
+                            conn.Close();
+                            return null;
+                        }
+                        
+                        MainLog.Instance.Verbose("DATASTORE", "Loaded terrain revision r" + rev.ToString());
                     }
-                    
-                    MainLog.Instance.Verbose("DATASTORE", "Loaded terrain revision r" + rev.ToString());
                 }
+                conn.Close();
+                return terret;
             }
-            conn.Close();
-            return terret;
         }
 
         public void RemoveLandObject(uint id)
-- 
cgit v1.1