[gnome-builder] bufmgr: be assertive about main thread use
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] bufmgr: be assertive about main thread use
- Date: Fri, 5 Jan 2018 01:33:14 +0000 (UTC)
commit 2972c19f3fd73fecaccee047c2e19f3c29e71e98
Author: Christian Hergert <chergert redhat com>
Date: Thu Jan 4 17:32:24 2018 -0800
bufmgr: be assertive about main thread use
This didn't catch anything, but I want to start being more
explicit when it makes sense that we are being used correctly
thread wise. Especially for components that touch user edited
files.
src/libide/buffers/ide-buffer-manager.c | 104 ++++++++++++++++++++++++++-----
1 files changed, 87 insertions(+), 17 deletions(-)
---
diff --git a/src/libide/buffers/ide-buffer-manager.c b/src/libide/buffers/ide-buffer-manager.c
index dfcbcf6..0875641 100644
--- a/src/libide/buffers/ide-buffer-manager.c
+++ b/src/libide/buffers/ide-buffer-manager.c
@@ -26,6 +26,7 @@
#include "ide-debug.h"
#include "ide-global.h"
+#include "application/ide-application.h"
#include "buffers/ide-buffer-manager.h"
#include "buffers/ide-buffer.h"
#include "buffers/ide-buffer-private.h"
@@ -142,6 +143,8 @@ edit_state_free (gpointer data)
{
EditState *state = data;
+ g_assert (IDE_IS_MAIN_THREAD ());
+
if (state != NULL)
{
g_clear_pointer (&state->edits, g_ptr_array_unref);
@@ -155,6 +158,8 @@ save_state_free (gpointer data)
{
SaveState *state = data;
+ g_assert (IDE_IS_MAIN_THREAD ());
+
if (state)
{
g_clear_object (&state->buffer);
@@ -169,6 +174,8 @@ load_state_free (gpointer data)
{
LoadState *state = data;
+ g_assert (IDE_IS_MAIN_THREAD ());
+
if (state)
{
g_clear_object (&state->buffer);
@@ -196,6 +203,7 @@ unref_if_non_null (gpointer data)
guint
ide_buffer_manager_get_auto_save_timeout (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), 0);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), 0);
if (self->auto_save)
@@ -219,6 +227,7 @@ void
ide_buffer_manager_set_auto_save_timeout (IdeBufferManager *self,
guint auto_save_timeout)
{
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
if (!auto_save_timeout)
@@ -246,6 +255,7 @@ ide_buffer_manager_set_auto_save_timeout (IdeBufferManager *self,
gboolean
ide_buffer_manager_get_auto_save (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
return self->auto_save;
@@ -263,6 +273,7 @@ void
ide_buffer_manager_set_auto_save (IdeBufferManager *self,
gboolean auto_save)
{
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
auto_save = !!auto_save;
@@ -301,6 +312,7 @@ ide_buffer_manager_set_auto_save (IdeBufferManager *self,
IdeBuffer *
ide_buffer_manager_get_focus_buffer (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
return self->focus_buffer;
@@ -312,6 +324,7 @@ ide_buffer_manager_set_focus_buffer (IdeBufferManager *self,
{
IdeBuffer *previous;
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (!buffer || IDE_IS_BUFFER (buffer));
@@ -337,7 +350,8 @@ ide_buffer_manager_auto_save_cb (gpointer data)
AutoSave *state = data;
gboolean saved = FALSE;
- g_assert (state);
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (state != NULL);
g_assert (IDE_IS_BUFFER_MANAGER (state->self));
g_assert (IDE_IS_BUFFER (state->buffer));
g_assert (state->source_id > 0);
@@ -370,6 +384,7 @@ static void
ide_buffer_manager_buffer_changed (IdeBufferManager *self,
IdeBuffer *buffer)
{
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (IDE_IS_BUFFER (buffer));
@@ -386,8 +401,9 @@ ide_buffer_manager_track_buffer (IdeBufferManager *self,
{
IDE_ENTRY;
- g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
- g_return_if_fail (IDE_IS_BUFFER (buffer));
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (IDE_IS_BUFFER_MANAGER (self));
+ g_assert (IDE_IS_BUFFER (buffer));
if (self->auto_save)
register_auto_save (self, buffer);
@@ -415,6 +431,7 @@ ide_buffer_manager_save_cursor_position (IdeBufferManager *self,
GFile *gfile;
GtkTextIter iter;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (IDE_IS_BUFFER (buffer));
@@ -447,8 +464,9 @@ ide_buffer_manager_remove_buffer (IdeBufferManager *self,
IDE_ENTRY;
- g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
- g_return_if_fail (IDE_IS_BUFFER (buffer));
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (IDE_IS_BUFFER_MANAGER (self));
+ g_assert (IDE_IS_BUFFER (buffer));
for (guint i = 0; i < self->buffers->len; i++)
{
@@ -546,6 +564,7 @@ ide_buffer_manager_load_file__load_cb (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (G_IS_TASK (task));
g_assert (GTK_SOURCE_IS_FILE_LOADER (loader));
@@ -648,6 +667,7 @@ ide_buffer_manager__load_file_query_info_cb (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (G_IS_FILE (file));
g_assert (G_IS_TASK (task));
@@ -747,12 +767,13 @@ ide_buffer_manager__load_file_read_cb (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (G_IS_FILE (file));
g_assert (G_IS_TASK (task));
state = g_task_get_task_data (task);
- g_assert (state);
+ g_assert (state != NULL);
g_assert (IDE_IS_BUFFER (state->buffer));
source_file = _ide_file_get_source_file (state->file);
@@ -787,6 +808,7 @@ ide_buffer_manager_load_task_completed (IdeBufferManager *self,
{
LoadState *state;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (pspec != NULL);
g_assert (g_strcmp0 ("completed", pspec->name) == 0);
@@ -835,6 +857,7 @@ ide_buffer_manager_load_file_async (IdeBufferManager *self,
if (progress)
*progress = NULL;
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (IDE_IS_FILE (file));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -951,6 +974,7 @@ ide_buffer_manager_load_file_finish (IdeBufferManager *self,
IDE_ENTRY;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
g_return_val_if_fail (G_IS_TASK (result), NULL);
@@ -969,6 +993,9 @@ ide_buffer_manager__buffer_reload_mtime_cb (GObject *object,
g_autoptr(GTask) task = user_data;
SaveState *state;
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (G_IS_FILE (file));
+ g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
state = g_task_get_task_data (task);
@@ -1005,14 +1032,16 @@ ide_buffer_manager_save_file__save_cb (GObject *object,
GFile *old_gfile;
SaveState *state;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (GTK_SOURCE_IS_FILE_SAVER (saver));
+ g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
self = g_task_get_source_object (task);
state = g_task_get_task_data (task);
g_assert (IDE_IS_BUFFER_MANAGER (self));
- g_assert (state);
+ g_assert (state != NULL);
g_assert (IDE_IS_BUFFER (state->buffer));
g_assert (IDE_IS_FILE (state->file));
g_assert (IDE_IS_PROGRESS (state->progress));
@@ -1075,7 +1104,9 @@ ide_buffer_manager_save_file__load_settings_cb (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_FILE (file));
+ g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
source_file = _ide_file_get_source_file (file);
@@ -1190,6 +1221,7 @@ ide_buffer_manager_save_file_async (IdeBufferManager *self,
if (progress)
*progress = NULL;
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (IDE_IS_BUFFER (buffer));
g_return_if_fail (IDE_IS_FILE (file));
@@ -1238,6 +1270,7 @@ ide_buffer_manager_save_file_finish (IdeBufferManager *self,
GAsyncResult *result,
GError **error)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
g_return_val_if_fail (G_IS_TASK (result), FALSE);
@@ -1256,6 +1289,7 @@ ide_buffer_manager_real_buffer_loaded (IdeBufferManager *self,
IdeFile *file;
GFile *gfile;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (IDE_IS_BUFFER (buffer));
@@ -1289,8 +1323,9 @@ ide_buffer_manager_real_create_buffer (IdeBufferManager *self,
{
IdeContext *context;
- g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
- g_return_val_if_fail (IDE_IS_FILE (file), NULL);
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (IDE_IS_BUFFER_MANAGER (self));
+ g_assert (IDE_IS_FILE (file));
context = ide_object_get_context (IDE_OBJECT (self));
@@ -1306,6 +1341,7 @@ ide_buffer_manager_real_buffer_unloaded (IdeBufferManager *self,
{
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (IDE_IS_BUFFER (buffer));
@@ -1343,6 +1379,7 @@ ide_buffer_manager_get_n_items (GListModel *model)
{
IdeBufferManager *self = (IdeBufferManager *)model;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), 0);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), 0);
return self->buffers->len;
@@ -1354,6 +1391,7 @@ ide_buffer_manager_get_item (GListModel *model,
{
IdeBufferManager *self = (IdeBufferManager *)model;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
g_return_val_if_fail (position < self->buffers->len, NULL);
@@ -1373,6 +1411,8 @@ ide_buffer_manager_dispose (GObject *object)
{
IdeBufferManager *self = (IdeBufferManager *)object;
+ g_assert (IDE_IS_MAIN_THREAD ());
+
dzl_clear_weak_pointer (&self->focus_buffer);
while (self->buffers->len)
@@ -1393,6 +1433,8 @@ ide_buffer_manager_finalize (GObject *object)
{
IdeBufferManager *self = (IdeBufferManager *)object;
+ g_assert (IDE_IS_MAIN_THREAD ());
+
if (g_hash_table_size (self->timeouts))
g_warning ("Not all auto save timeouts have been removed.");
@@ -1415,6 +1457,8 @@ ide_buffer_manager_get_property (GObject *object,
{
IdeBufferManager *self = IDE_BUFFER_MANAGER (object);
+ g_assert (IDE_IS_MAIN_THREAD ());
+
switch (prop_id)
{
case PROP_AUTO_SAVE:
@@ -1446,6 +1490,8 @@ ide_buffer_manager_set_property (GObject *object,
{
IdeBufferManager *self = IDE_BUFFER_MANAGER (object);
+ g_assert (IDE_IS_MAIN_THREAD ());
+
switch (prop_id)
{
case PROP_AUTO_SAVE:
@@ -1693,6 +1739,7 @@ static void
register_auto_save (IdeBufferManager *self,
IdeBuffer *buffer)
{
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (IDE_IS_BUFFER (buffer));
g_return_if_fail (!g_hash_table_lookup (self->timeouts, buffer));
@@ -1718,6 +1765,7 @@ unregister_auto_save (IdeBufferManager *self,
{
AutoSave *state;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (IDE_IS_BUFFER (buffer));
@@ -1748,6 +1796,7 @@ ide_buffer_manager_get_buffers (IdeBufferManager *self)
{
g_autoptr(GPtrArray) ret = NULL;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
ret = g_ptr_array_new_with_free_func (g_object_unref);
@@ -1775,6 +1824,7 @@ ide_buffer_manager_get_buffers (IdeBufferManager *self)
GtkSourceCompletionWords *
ide_buffer_manager_get_word_completion (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
return self->word_completion;
@@ -1797,6 +1847,7 @@ ide_buffer_manager_find_buffer (IdeBufferManager *self,
GHashTableIter iter;
gpointer key, value;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
g_return_val_if_fail (G_IS_FILE (file), NULL);
@@ -1839,6 +1890,10 @@ gboolean
ide_buffer_manager_has_file (IdeBufferManager *self,
GFile *file)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
+ g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
+ g_return_val_if_fail (G_IS_FILE (file), FALSE);
+
return !!ide_buffer_manager_find_buffer (self, file);
}
@@ -1856,6 +1911,7 @@ ide_buffer_manager_has_file (IdeBufferManager *self,
gsize
ide_buffer_manager_get_max_file_size (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), 0);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), 0);
return self->max_file_size;
@@ -1872,6 +1928,7 @@ void
ide_buffer_manager_set_max_file_size (IdeBufferManager *self,
gsize max_file_size)
{
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
if (self->max_file_size != max_file_size)
@@ -1900,6 +1957,7 @@ ide_buffer_manager_create_temporary_buffer (IdeBufferManager *self)
GFile *workdir;
guint doc_seq;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), NULL);
context = ide_object_get_context (IDE_OBJECT (self));
@@ -1961,6 +2019,7 @@ _ide_buffer_manager_reclaim (IdeBufferManager *self,
{
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (IDE_IS_BUFFER (buffer));
@@ -1985,6 +2044,7 @@ _ide_buffer_manager_reclaim (IdeBufferManager *self,
guint
ide_buffer_manager_get_n_buffers (IdeBufferManager *self)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), 0);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), 0);
return self->buffers->len;
@@ -1997,17 +2057,21 @@ ide_buffer_manager_save_all__save_file_cb (GObject *object,
{
IdeBufferManager *self = (IdeBufferManager *)object;
g_autoptr(GTask) task = user_data;
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
guint *count;
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (IDE_IS_BUFFER_MANAGER (self));
+ g_assert (G_IS_ASYNC_RESULT (result));
+ g_assert (G_IS_TASK (task));
+
if (!ide_buffer_manager_save_file_finish (self, result, &error))
- {
- g_warning ("%s", error->message);
- g_clear_error (&error);
- }
+ g_warning ("%s", error->message);
count = g_task_get_task_data (task);
- if (--(*count) == 0)
+ (*count)--;
+
+ if (*count == 0)
g_task_return_boolean (task, TRUE);
}
@@ -2018,9 +2082,9 @@ ide_buffer_manager_save_all_async (IdeBufferManager *self,
gpointer user_data)
{
g_autoptr(GTask) task = NULL;
- gsize i;
guint *count;
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -2030,7 +2094,7 @@ ide_buffer_manager_save_all_async (IdeBufferManager *self,
*count = self->buffers->len;
g_task_set_task_data (task, count, g_free);
- for (i = 0; i < self->buffers->len; i++)
+ for (guint i = 0; i < self->buffers->len; i++)
{
IdeBuffer *buffer;
@@ -2061,6 +2125,7 @@ ide_buffer_manager_save_all_finish (IdeBufferManager *self,
GAsyncResult *result,
GError **error)
{
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
g_return_val_if_fail (G_IS_TASK (result), FALSE);
@@ -2074,6 +2139,7 @@ ide_buffer_manager_do_apply_edits (IdeBufferManager *self,
{
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (buffers != NULL);
g_assert (edits != NULL);
@@ -2157,6 +2223,7 @@ ide_buffer_manager_apply_edits_save_cb (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
@@ -2182,6 +2249,7 @@ ide_buffer_manager_apply_edits_buffer_loaded (GObject *object,
IDE_ENTRY;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_BUFFER_MANAGER (self));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
@@ -2245,6 +2313,7 @@ ide_buffer_manager_apply_edits_async (IdeBufferManager *self,
IDE_ENTRY;
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
g_return_if_fail (edits != NULL);
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -2325,6 +2394,7 @@ ide_buffer_manager_apply_edits_finish (IdeBufferManager *self,
IDE_ENTRY;
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
g_return_val_if_fail (G_IS_TASK (result), FALSE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]