[geany/geany-plugins] 521f98: Merge branch 'git-changebar/wip'
Colomban Wendling
git-noreply at xxxxx
Thu Jun 25 16:29:45 UTC 2015
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Thu, 25 Jun 2015 16:29:45 UTC
Commit: 521f986d8132dfe165e0f5247bde4c2a954fa2ad
https://github.com/geany/geany-plugins/commit/521f986d8132dfe165e0f5247bde4c2a954fa2ad
Log Message:
-----------
Merge branch 'git-changebar/wip'
* Fix a race condition updating the diff (#244).
Modified Paths:
--------------
git-changebar/src/gcb-plugin.c
Modified: git-changebar/src/gcb-plugin.c
25 lines changed, 17 insertions(+), 8 deletions(-)
===================================================================
@@ -82,6 +82,7 @@ typedef void (*BlobContentsReadyFunc) (const gchar *path,
typedef struct AsyncBlobContentsJob AsyncBlobContentsJob;
struct AsyncBlobContentsJob {
gboolean force;
+ guint tag;
gchar *path;
git_buf buf;
BlobContentsReadyFunc callback;
@@ -140,6 +141,7 @@ static void write_setting_boolean (GKeyFile *kf,
/* cache */
static git_buf G_blob_contents = { 0 };
+static guint G_blob_contents_tag = 0;
/* global state */
static GAsyncQueue *G_queue = NULL;
static GThread *G_thread = NULL;
@@ -213,6 +215,7 @@ clear_cached_blob_contents (void)
git_buf_free (&G_blob_contents);
buf_zero (&G_blob_contents);
}
+ G_blob_contents_tag = 0;
}
/* get the file blob for @relpath at HEAD */
@@ -278,6 +281,7 @@ report_work_in_idle (gpointer data)
/* update cached blob */
clear_cached_blob_contents ();
G_blob_contents = job->buf;
+ G_blob_contents_tag = job->buf.ptr ? job->tag : 0;
job->callback (job->path, job->buf.ptr ? &job->buf : NULL, job->user_data);
@@ -455,16 +459,19 @@ worker_thread (gpointer data)
static void
get_cached_blob_contents_async (const gchar *path,
+ guint tag,
gboolean force,
BlobContentsReadyFunc callback,
gpointer user_data)
{
- if ((! force && G_blob_contents.ptr) || ! path) {
+ if ((! force && G_blob_contents.ptr && tag == G_blob_contents_tag) ||
+ ! path) {
callback (path, &G_blob_contents, user_data);
} else {
AsyncBlobContentsJob *job = g_slice_alloc (sizeof *job);
job->force = force;
+ job->tag = tag;
job->path = g_strdup (path);
job->callback = callback;
job->user_data = user_data;
@@ -801,7 +808,8 @@ on_sci_query_tooltip (GtkWidget *widget,
min_x = scintilla_send_message (sci, SCI_GETMARGINWIDTHN, 0, 0);
max_x = min_x + scintilla_send_message (sci, SCI_GETMARGINWIDTHN, 1, 0);
- if (x >= min_x && x <= max_x && G_blob_contents.ptr) {
+ if (x >= min_x && x <= max_x &&
+ G_blob_contents.ptr && G_blob_contents_tag == doc->id) {
gint pos = scintilla_send_message (sci, SCI_POSITIONFROMPOINT, x, y);
gint line = sci_get_line_from_position (sci, pos);
gint mask = scintilla_send_message (sci, SCI_MARKERGET, line, 0);
@@ -861,7 +869,7 @@ do_update_diff_idle (guint doc_id,
G_source_id = 0;
/* make sure the document is still valid and current */
if (doc && doc->id == doc_id) {
- get_cached_blob_contents_async (doc->real_path, force, update_diff,
+ get_cached_blob_contents_async (doc->real_path, doc_id, force, update_diff,
GUINT_TO_POINTER (doc->id));
}
@@ -1024,8 +1032,8 @@ on_kb_goto_next_hunk (guint kb)
data->line = sci_get_current_line (doc->editor->sci);
data->next_line = -1;
- get_cached_blob_contents_async (doc->real_path, FALSE, goto_next_hunk_cb,
- data);
+ get_cached_blob_contents_async (doc->real_path, doc->id, FALSE,
+ goto_next_hunk_cb, data);
}
}
@@ -1197,9 +1205,10 @@ plugin_init (GeanyData *data)
GeanyKeyGroup *kb_group;
buf_zero (&G_blob_contents);
- G_source_id = 0;
- G_thread = NULL;
- G_queue = NULL;
+ G_blob_contents_tag = 0;
+ G_source_id = 0;
+ G_thread = NULL;
+ G_queue = NULL;
if (git_libgit2_init () < 0) {
const git_error *err = giterr_last ();
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list