From 18aadc43169cd9bb6ee63b0bcff39512bba214a1 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 3 Sep 2021 08:34:26 +0200
Subject: [PATCH] sumcontainer: lock table when adding columns

---
 .../OutputData/SummaryDataContainer.cs        | 44 ++++++++++++-------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 9103018aca..23a0d82b00 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -340,8 +340,10 @@ namespace TUGraz.VectoCore.OutputData
 			} else {
 				if (runData.ElectricMachinesData.Count > 0) {
 					if (!Table.Columns.Contains(Fields.ElectricEnergyConsumptionPerKm)) {
-						var col = Table.Columns.Add(Fields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI));
-						col.SetOrdinal(Table.Columns[Fields.CO2_KM].Ordinal);
+						lock (_tableLock) {
+							var col = Table.Columns.Add(Fields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI));
+							col.SetOrdinal(Table.Columns[Fields.CO2_KM].Ordinal);
+						}
 					}
 
 					row[Fields.ElectricEnergyConsumptionPerKm] =
@@ -522,10 +524,12 @@ namespace TUGraz.VectoCore.OutputData
 				}
 
 				if (!Table.Columns.Contains(colName)) {
-					var col = Table.Columns.Add(colName, typeof(ConvertedSI));
+					lock (_tableLock) {
+						var col = Table.Columns.Add(colName, typeof(ConvertedSI));
 
-					// move the new column to correct position
-					col.SetOrdinal(Table.Columns[Fields.E_AUX].Ordinal);
+						// move the new column to correct position
+						col.SetOrdinal(Table.Columns[Fields.E_AUX].Ordinal);
+					}
 				}
 
 				row[colName] = modData.AuxiliaryWork(aux.Value).ConvertToKiloWattHour();
@@ -545,7 +549,9 @@ namespace TUGraz.VectoCore.OutputData
 			for (uint i = 0; i <= gearCount; i++) {
 				var colName = string.Format(Fields.TIME_SHARE_PER_GEAR_FORMAT, i);
 				if (!Table.Columns.Contains(colName)) {
-					Table.Columns.Add(colName, typeof(ConvertedSI));
+					lock (_tableLock) {
+						Table.Columns.Add(colName, typeof(ConvertedSI));
+					}
 				}
 				row[colName] = (ConvertedSI)timeSharePerGear[i];
 			}
@@ -704,8 +710,10 @@ namespace TUGraz.VectoCore.OutputData
 				foreach (var entry in emColumns) {
 					var colName = string.Format(entry.Item1, em.Item1.GetName());
 					if (!Table.Columns.Contains(colName)) {
-						var col = Table.Columns.Add(colName, typeof(ConvertedSI));
-						col.SetOrdinal(Table.Columns[Fields.E_GRAD].Ordinal + 1);
+						lock (_tableLock) {
+							var col = Table.Columns.Add(colName, typeof(ConvertedSI));
+							col.SetOrdinal(Table.Columns[Fields.E_GRAD].Ordinal + 1);
+						}
 					}
 					row[colName] = entry.Item2;
 				}
@@ -717,8 +725,10 @@ namespace TUGraz.VectoCore.OutputData
 						continue;
 					}
 
-					var col = Table.Columns.Add(field, typeof(double));
-					col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal);
+					lock (_tableLock) {
+						var col = Table.Columns.Add(field, typeof(double));
+						col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal);
+					}
 				}
 
 				foreach (var field in new[] {
@@ -729,8 +739,10 @@ namespace TUGraz.VectoCore.OutputData
 						continue;
 					}
 
-					var col = Table.Columns.Add(field, typeof(ConvertedSI));
-					col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal);
+					lock (_tableLock) {
+						var col = Table.Columns.Add(field, typeof(ConvertedSI));
+						col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal);
+					}
 				}
 				row[Fields.E_REESS_LOSS] = modData.REESSLoss().ConvertToKiloWattHour();
 				row[Fields.E_REESS_T_chg] = modData.WorkREESSChargeTerminal().ConvertToKiloWattHour();
@@ -909,10 +921,12 @@ namespace TUGraz.VectoCore.OutputData
 				var colName = string.Format(Fields.AUX_TECH_FORMAT, aux.ID);
 
 				if (!Table.Columns.Contains(colName)) {
-					var col = Table.Columns.Add(colName, typeof(string));
+					lock (_tableLock) {
+						var col = Table.Columns.Add(colName, typeof(string));
 
-					// move the new column to correct position
-					col.SetOrdinal(Table.Columns[Fields.CARGO_VOLUME].Ordinal);
+						// move the new column to correct position
+						col.SetOrdinal(Table.Columns[Fields.CARGO_VOLUME].Ordinal);
+					}
 				}
 
 				row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
-- 
GitLab