gem-graph-client/libide/threading/ide-task.h

202 lines
10 KiB
C

/* ide-task.h
*
* Copyright 2018 Christian Hergert
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#if !defined (IDE_THREADING_INSIDE) && !defined (IDE_THREADING_COMPILATION)
# error "Only <libide-threading.h> can be included directly."
#endif
#include <gio/gio.h>
G_BEGIN_DECLS
#define IDE_TYPE_TASK (ide_task_get_type())
IDE_AVAILABLE_IN_3_32
G_DECLARE_DERIVABLE_TYPE (IdeTask, ide_task, IDE, TASK, GObject)
typedef void (*IdeTaskThreadFunc) (IdeTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable);
typedef enum
{
IDE_TASK_KIND_DEFAULT,
IDE_TASK_KIND_COMPILER,
IDE_TASK_KIND_INDEXER,
IDE_TASK_KIND_IO,
IDE_TASK_KIND_LAST
} IdeTaskKind;
struct _IdeTaskClass
{
GObjectClass parent;
gpointer _reserved[16];
};
IDE_AVAILABLE_IN_3_32
IdeTask *ide_task_new (gpointer source_object,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
IDE_AVAILABLE_IN_3_32
void ide_task_chain (IdeTask *self,
IdeTask *other_task);
IDE_AVAILABLE_IN_3_32
GCancellable *ide_task_get_cancellable (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_get_completed (IdeTask *self);
IDE_AVAILABLE_IN_3_32
IdeTaskKind ide_task_get_kind (IdeTask *self);
IDE_AVAILABLE_IN_3_32
const gchar *ide_task_get_name (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gint ide_task_get_priority (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gint ide_task_get_complete_priority (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_get_source_object (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_get_source_tag (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_get_task_data (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_had_error (IdeTask *self);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_is_valid (gpointer self,
gpointer source_object);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_propagate_boolean (IdeTask *self,
GError **error);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_propagate_boxed (IdeTask *self,
GError **error);
IDE_AVAILABLE_IN_3_32
gssize ide_task_propagate_int (IdeTask *self,
GError **error);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_propagate_object (IdeTask *self,
GError **error);
IDE_AVAILABLE_IN_3_32
gpointer ide_task_propagate_pointer (IdeTask *self,
GError **error);
IDE_AVAILABLE_IN_3_32
void ide_task_return_boolean (IdeTask *self,
gboolean result);
IDE_AVAILABLE_IN_3_32
void ide_task_return_boxed (IdeTask *self,
GType result_type,
gpointer result);
IDE_AVAILABLE_IN_3_32
void ide_task_return_error (IdeTask *self,
GError *error);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_return_error_if_cancelled (IdeTask *self);
IDE_AVAILABLE_IN_3_32
void ide_task_return_int (IdeTask *self,
gssize result);
IDE_AVAILABLE_IN_3_32
gboolean ide_task_get_return_on_cancel (IdeTask *self);
IDE_AVAILABLE_IN_3_32
void ide_task_return_new_error (IdeTask *self,
GQuark error_domain,
gint error_code,
const gchar *format,
...) G_GNUC_PRINTF (4, 5);
IDE_AVAILABLE_IN_3_32
void ide_task_return_object (IdeTask *self,
gpointer instance);
IDE_AVAILABLE_IN_3_32
void ide_task_return_pointer (IdeTask *self,
gpointer data,
GDestroyNotify destroy);
IDE_AVAILABLE_IN_3_32
void ide_task_run_in_thread (IdeTask *self,
IdeTaskThreadFunc thread_func);
IDE_AVAILABLE_IN_3_32
void ide_task_set_check_cancellable (IdeTask *self,
gboolean check_cancellable);
IDE_AVAILABLE_IN_3_32
void ide_task_set_kind (IdeTask *self,
IdeTaskKind kind);
IDE_AVAILABLE_IN_3_32
void ide_task_set_name (IdeTask *self,
const gchar *name);
IDE_AVAILABLE_IN_3_32
void ide_task_set_priority (IdeTask *self,
gint priority);
IDE_AVAILABLE_IN_3_32
void ide_task_set_complete_priority (IdeTask *self,
gint complete_priority);
IDE_AVAILABLE_IN_3_32
void ide_task_set_release_on_propagate (IdeTask *self,
gboolean release_on_propagate);
IDE_AVAILABLE_IN_3_32
void ide_task_set_return_on_cancel (IdeTask *self,
gboolean return_on_cancel);
IDE_AVAILABLE_IN_3_32
void ide_task_set_source_tag (IdeTask *self,
gpointer source_tag);
IDE_AVAILABLE_IN_3_32
void ide_task_set_task_data (IdeTask *self,
gpointer task_data,
GDestroyNotify task_data_destroy);
IDE_AVAILABLE_IN_3_32
void ide_task_report_new_error (gpointer source_object,
GAsyncReadyCallback callback,
gpointer callback_data,
gpointer source_tag,
GQuark domain,
gint code,
const gchar *format,
...) G_GNUC_PRINTF (7, 8);
#ifdef __GNUC__
# define ide_task_new(self, cancellable, callback, user_data) \
({ \
IdeTask *__ide_task = (ide_task_new) (self, cancellable, callback, user_data); \
ide_task_set_name (__ide_task, g_intern_static_string (G_STRLOC)); \
__ide_task; \
})
# define ide_task_set_task_data(t,d,n) \
G_STMT_START { \
__typeof__((d)) __task_data = (d); \
(ide_task_set_task_data) ((t), \
__task_data, \
0 ? (((n) (__task_data)), (GDestroyNotify)NULL) \
: ((GDestroyNotify)(n))); \
} G_STMT_END
# define ide_task_return_pointer(t,d,n) \
G_STMT_START { \
__typeof__((d)) __task_return = (d); \
if ((n) != NULL) \
(ide_task_return_pointer) ((t), \
__task_return, \
0 ? (((n) (__task_return)), (GDestroyNotify)NULL) \
: ((GDestroyNotify)(n))); \
else \
(ide_task_return_pointer) ((t), __task_return, NULL); \
} G_STMT_END
#endif
G_END_DECLS