From 2a1c6fc96ff03c84723ca1fb7d3a48e0cd3df115 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Tue, 8 Feb 2011 10:14:46 +0000 Subject: if the torrent selection changes as a result of an update, was possible that it would select another item which has no JSON but isn't removed from the model yet. use updateSerial and updateMutex to ignore these. --- src/trg-torrent-tree-view.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/trg-torrent-tree-view.c') diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c index 9fc0a41..43a49db 100644 --- a/src/trg-torrent-tree-view.c +++ b/src/trg-torrent-tree-view.c @@ -60,14 +60,15 @@ static void trg_torrent_tree_view_init(TrgTorrentTreeView * tv) TORRENT_COLUMN_RATIO, -1); } -gint get_first_selected(TrgTorrentTreeView * view, GtkTreeIter * iter, +gint get_first_selected(trg_client *client, TrgTorrentTreeView * view, GtkTreeIter * iter, JsonObject ** json) { GtkTreeModel *model; GtkTreeSelection *selection; GList *selectionList; GList *firstNode; - gint id = -1; + gint64 id = -1; + gint64 updateSerial = -1; model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); @@ -76,9 +77,18 @@ gint get_first_selected(TrgTorrentTreeView * view, GtkTreeIter * iter, if ((firstNode = g_list_first(selectionList)) != NULL) { if (gtk_tree_model_get_iter(model, iter, firstNode->data) == TRUE) { - gtk_tree_model_get(model, iter, + gboolean locked; + gtk_tree_model_get(model, iter, TORRENT_COLUMN_JSON, json, - TORRENT_COLUMN_ID, &id, -1); + TORRENT_COLUMN_ID, &id, + TORRENT_COLUMN_UPDATESERIAL, &updateSerial, -1); + + locked = g_mutex_trylock(client->updateMutex); + if (locked) + g_mutex_unlock(client->updateMutex); + + if (updateSerial < (locked ? client->updateSerial-1 : client->updateSerial)) + id = -1; } } @@ -94,7 +104,7 @@ trg_torrent_model_get_json_id_array_foreach(GtkTreeModel * model, gpointer data) { JsonArray *output = (JsonArray *) data; - gint id; + gint64 id; gtk_tree_model_get(model, iter, TORRENT_COLUMN_ID, &id, -1); json_array_add_int_element(output, id); } -- cgit v1.2.3