diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-09-21 22:23:47 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-09-21 22:23:47 (GMT) |
commit | 76fb13178cf6be94b8e01675b37f7cb1b92f7709 (patch) | |
tree | a6e6bbc6dde169add608097ceb5658fcb904bd08 /src/glibext/bufferview.c | |
parent | dfe76faf21e254c02c86a1b0b1f8ca8fc07fe027 (diff) |
Defined lock mechanism for buffer caches.
Diffstat (limited to 'src/glibext/bufferview.c')
-rw-r--r-- | src/glibext/bufferview.c | 110 |
1 files changed, 69 insertions, 41 deletions
diff --git a/src/glibext/bufferview.c b/src/glibext/bufferview.c index 7ac6718..72740b1 100644 --- a/src/glibext/bufferview.c +++ b/src/glibext/bufferview.c @@ -81,13 +81,13 @@ static void on_buffer_cache_line_updated(const GBufferCache *, size_t, GBufferVi /* Calcule la position idéale de curseur pour un point donné. */ static bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); +/* Fournit la ligne présente à une ordonnée donnée. */ +static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); + /* Déplace le curseur au sein d'une vue de tampon. */ static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *); -/* Fournit la ligne présente à une ordonnée donnée. */ -static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); - @@ -449,6 +449,8 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * if (view->tracker != NULL) g_object_unref(G_OBJECT(view->tracker)); + g_buffer_cache_rlock(view->cache); + if (view->unrestricted) { view->first = 0; @@ -475,6 +477,8 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * } + g_buffer_cache_runlock(view->cache); + } } @@ -643,6 +647,8 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G result = false; + g_buffer_cache_rlock(view->cache); + /* Détermination de la ligne courante */ lheight = g_buffer_cache_get_line_height(view->cache); @@ -665,6 +671,8 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G gbvccf_done: + g_buffer_cache_runlock(view->cache); + return result; } @@ -814,6 +822,48 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line /****************************************************************************** * * +* Paramètres : view = visualisation à consulter. * +* y = ordonnée comprise dans la ligne recherchée. * +* idx = indice de la ligne trouvée ou NULL. [OUT] * +* * +* Description : Fournit la ligne présente à une ordonnée donnée. * +* * +* Retour : Ligne retrouvée ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx) +{ + GBufferLine *result; /* Ligne trouvée à retourner */ + gint lheight; /* Hauteur d'une ligne */ + size_t index; /* Indice attendu */ + + /** + * Le verrou sur le tampon est déjà posé. + */ + + lheight = g_buffer_cache_get_line_height(view->cache); + index = y / lheight; + + index += view->first; + + if (index <= view->last) + result = g_buffer_cache_find_line_by_index(view->cache, index); + else + result = NULL; + + if (result != NULL && idx != NULL) + *idx = index; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : view = vue de tampon à mettre à jour. * * ctrl = indique la demande d'un parcours rapide. * * dir = direction du parcours. * @@ -842,6 +892,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d result = false; + g_buffer_cache_rlock(view->cache); + line = g_buffer_view_find_line_at(view, caret->y, &index); if (line == NULL) goto gbvmc_done; @@ -945,6 +997,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d gbvmc_done: + g_buffer_cache_runlock(view->cache); + return result; } @@ -981,6 +1035,8 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDi result = NULL; + g_buffer_cache_rlock(view->cache); + /* Zone d'intervention bornée ! */ text_pos = g_buffer_cache_get_text_position(view->cache); @@ -1013,6 +1069,8 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDi gbvfc_done: + g_buffer_cache_runlock(view->cache); + return result; } @@ -1080,6 +1138,8 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G /* Zone d'intervention bornée ! */ + g_buffer_cache_rlock(view->cache); + text_pos = g_buffer_cache_get_text_position(view->cache); if (x < text_pos) @@ -1121,6 +1181,8 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G gbvhs_done: + g_buffer_cache_runlock(view->cache); + return result; } @@ -1209,44 +1271,6 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const -/****************************************************************************** -* * -* Paramètres : view = visualisation à consulter. * -* y = ordonnée comprise dans la ligne recherchée. * -* idx = indice de la ligne trouvée ou NULL. [OUT] * -* * -* Description : Fournit la ligne présente à une ordonnée donnée. * -* * -* Retour : Ligne retrouvée ou NULL si aucune. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx) -{ - GBufferLine *result; /* Ligne trouvée à retourner */ - gint lheight; /* Hauteur d'une ligne */ - size_t index; /* Indice attendu */ - - lheight = g_buffer_cache_get_line_height(view->cache); - index = y / lheight; - - index += view->first; - - if (index <= view->last) - result = g_buffer_cache_find_line_by_index(view->cache, index); - else - result = NULL; - - if (result != NULL && idx != NULL) - *idx = index; - - return result; - -} - - @@ -1280,8 +1304,12 @@ bool g_buffer_view_get_cursor_coordinates(GBufferView *view, const GLineCursor * { bool result; /* Bilan à retourner */ + g_buffer_cache_rlock(view->cache); + result = g_buffer_cache_get_cursor_coordinates(view->cache, cursor, view->first, view->last, code, x, y); + g_buffer_cache_runlock(view->cache); + return result; } |