controller: fix some crashes due to simultaneous thread access on repo list

This commit is contained in:
Hylke Bons 2012-03-29 17:05:18 +01:00
parent 3e285bf580
commit 4f3c9b9757
3 changed files with 24 additions and 20 deletions

View file

@ -32,7 +32,18 @@ namespace SparkleShare {
public abstract class SparkleControllerBase {
public List<SparkleRepoBase> Repositories = new List<SparkleRepoBase> ();
public SparkleRepoBase [] Repositories {
get {
lock (this.repo_lock) {
SparkleRepoBase [] repositories =
this.repositories.GetRange (0, this.repositories.Count).ToArray ();
return repositories;
}
}
}
public List<SparkleRepoBase> repositories = new List<SparkleRepoBase> ();
public readonly string SparklePath = SparkleConfig.DefaultConfig.FoldersPath;
public double ProgressPercentage = 0.0;
@ -632,7 +643,7 @@ namespace SparkleShare {
lock (this.repo_lock) {
Repositories.Add (repo);
this.repositories.Add (repo);
}
repo.Initialize ();
@ -646,12 +657,12 @@ namespace SparkleShare {
string folder_name = Path.GetFileName (folder_path);
lock (this.repo_lock) {
for (int i = 0; i < Repositories.Count; i++) {
SparkleRepoBase repo = Repositories [i];
for (int i = 0; i < this.repositories.Count; i++) {
SparkleRepoBase repo = this.repositories [i];
if (repo.Name.Equals (folder_name)) {
repo.Dispose ();
Repositories.Remove (repo);
this.repositories.Remove (repo);
repo = null;
break;
}

View file

@ -241,12 +241,6 @@ namespace SparkleShare {
}
public void StartupItemChanged (bool create_startup_item)
{
this.create_startup_item = create_startup_item;
}
public void HistoryItemChanged (bool fetch_prior_history)
{
this.fetch_prior_history = fetch_prior_history;
@ -305,6 +299,12 @@ namespace SparkleShare {
}
public void StartupItemChanged (bool create_startup_item)
{
this.create_startup_item = create_startup_item;
}
public void CheckAddPage (string address, string remote_path, int selected_plugin)
{
address = address.Trim ();

View file

@ -81,12 +81,8 @@ namespace SparkleShare {
get {
double size = 0;
foreach (SparkleRepoBase repo in
Program.Controller.Repositories.GetRange (
0, Program.Controller.Repositories.Count)) {
foreach (SparkleRepoBase repo in Program.Controller.Repositories)
size += repo.Size + repo.HistorySize;
}
if (size == 0)
return "";
@ -167,10 +163,7 @@ namespace SparkleShare {
int repos_syncing_up = 0;
int repos_syncing_down = 0;
foreach (SparkleRepoBase repo in
Program.Controller.Repositories.GetRange (
0, Program.Controller.Repositories.Count)) {
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
if (repo.Status == SyncStatus.SyncUp)
repos_syncing_up++;