controller: fix some crashes due to simultaneous thread access on repo list
This commit is contained in:
parent
3e285bf580
commit
4f3c9b9757
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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++;
|
||||
|
||||
|
|
Loading…
Reference in a new issue