895d076624
Signed-off-by: Matej Marusak <mmarusak@redhat.com>
300 lines
9.3 KiB
Diff
300 lines
9.3 KiB
Diff
From 21bdee77727417b6b16feed7b466953873319b58 Mon Sep 17 00:00:00 2001
|
|
From: Ernestas Kulik <ekulik@redhat.com>
|
|
Date: Tue, 8 Jan 2019 14:26:15 +0100
|
|
Subject: [PATCH] dbus: task: Use modern GLib type macros
|
|
|
|
Signed-off-by: Ernestas Kulik <ekulik@redhat.com>
|
|
---
|
|
src/dbus/abrt_problems2_task.c | 111 ++++++++++++++++++++++++---------
|
|
src/dbus/abrt_problems2_task.h | 26 +-------
|
|
2 files changed, 82 insertions(+), 55 deletions(-)
|
|
|
|
diff --git a/src/dbus/abrt_problems2_task.c b/src/dbus/abrt_problems2_task.c
|
|
index f40381f6..cba6b469 100644
|
|
--- a/src/dbus/abrt_problems2_task.c
|
|
+++ b/src/dbus/abrt_problems2_task.c
|
|
@@ -25,6 +25,15 @@ enum {
|
|
|
|
static guint s_signals[SN_LAST_SIGNAL] = { 0 };
|
|
|
|
+struct _AbrtP2TaskPrivate
|
|
+{
|
|
+ gint32 p2t_status;
|
|
+ GVariant *p2t_details;
|
|
+ GVariant *p2t_results;
|
|
+ gint32 p2t_code;
|
|
+ GCancellable *p2t_cancellable;
|
|
+};
|
|
+
|
|
G_DEFINE_TYPE_WITH_PRIVATE(AbrtP2Task, abrt_p2_task, G_TYPE_OBJECT)
|
|
|
|
static void abrt_p2_task_finalize(GObject *gobject)
|
|
@@ -74,17 +83,24 @@ static void abrt_p2_task_class_init(AbrtP2TaskClass *klass)
|
|
|
|
static void abrt_p2_task_init(AbrtP2Task *self)
|
|
{
|
|
- self->pv = abrt_p2_task_get_instance_private(self);
|
|
- self->pv->p2t_details = g_variant_new("a{sv}", NULL);
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(self);
|
|
+
|
|
+ pv->p2t_details = g_variant_new("a{sv}", NULL);
|
|
}
|
|
|
|
static void abrt_p2_task_change_status(AbrtP2Task *task,
|
|
AbrtP2TaskStatus status)
|
|
{
|
|
- if (task->pv->p2t_status == status)
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ if (pv->p2t_status == status)
|
|
return;
|
|
|
|
- task->pv->p2t_status = status;
|
|
+ pv->p2t_status = status;
|
|
|
|
g_signal_emit(task,
|
|
s_signals[SN_STATUS_CHANGED],
|
|
@@ -94,53 +110,77 @@ static void abrt_p2_task_change_status(AbrtP2Task *task,
|
|
|
|
AbrtP2TaskStatus abrt_p2_task_status(AbrtP2Task *task)
|
|
{
|
|
- return task->pv->p2t_status;
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ return pv->p2t_status;
|
|
}
|
|
|
|
GVariant *abrt_p2_task_details(AbrtP2Task *task)
|
|
{
|
|
- return g_variant_ref(task->pv->p2t_details);
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ return g_variant_ref(pv->p2t_details);
|
|
}
|
|
|
|
void abrt_p2_task_add_detail(AbrtP2Task *task,
|
|
const char *key,
|
|
GVariant *value)
|
|
{
|
|
+ AbrtP2TaskPrivate *pv;
|
|
GVariantDict dict;
|
|
- g_variant_dict_init(&dict, task->pv->p2t_details);
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ g_variant_dict_init(&dict, pv->p2t_details);
|
|
g_variant_dict_insert(&dict, key, "v", value);
|
|
|
|
- if (task->pv->p2t_details)
|
|
- g_variant_unref(task->pv->p2t_details);
|
|
+ if (pv->p2t_details)
|
|
+ g_variant_unref(pv->p2t_details);
|
|
|
|
- task->pv->p2t_details = g_variant_dict_end(&dict);
|
|
+ pv->p2t_details = g_variant_dict_end(&dict);
|
|
}
|
|
|
|
void abrt_p2_task_set_response(AbrtP2Task *task,
|
|
GVariant *response)
|
|
{
|
|
- if (task->pv->p2t_results != NULL)
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ if (pv->p2t_results != NULL)
|
|
log_warning("Task already has response assigned");
|
|
|
|
- task->pv->p2t_results = response;
|
|
+ pv->p2t_results = response;
|
|
}
|
|
|
|
bool abrt_p2_task_is_cancelled(AbrtP2Task *task)
|
|
{
|
|
- return (task->pv->p2t_cancellable
|
|
- && g_cancellable_is_cancelled(task->pv->p2t_cancellable))
|
|
- || task->pv->p2t_status == ABRT_P2_TASK_STATUS_CANCELED;
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ return (pv->p2t_cancellable
|
|
+ && g_cancellable_is_cancelled(pv->p2t_cancellable))
|
|
+ || pv->p2t_status == ABRT_P2_TASK_STATUS_CANCELED;
|
|
}
|
|
|
|
void abrt_p2_task_cancel(AbrtP2Task *task,
|
|
GError **error)
|
|
{
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
if (abrt_p2_task_is_cancelled(task))
|
|
return;
|
|
|
|
- if (task->pv->p2t_status == ABRT_P2_TASK_STATUS_RUNNING)
|
|
- g_cancellable_cancel(task->pv->p2t_cancellable);
|
|
- else if (task->pv->p2t_status == ABRT_P2_TASK_STATUS_STOPPED)
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ if (pv->p2t_status == ABRT_P2_TASK_STATUS_RUNNING)
|
|
+ g_cancellable_cancel(pv->p2t_cancellable);
|
|
+ else if (pv->p2t_status == ABRT_P2_TASK_STATUS_STOPPED)
|
|
{
|
|
ABRT_P2_TASK_VIRTUAL_CANCEL(task, error);
|
|
|
|
@@ -157,8 +197,12 @@ void abrt_p2_task_finish(AbrtP2Task *task,
|
|
gint32 *code,
|
|
GError **error)
|
|
{
|
|
- if ( task->pv->p2t_status != ABRT_P2_TASK_STATUS_DONE
|
|
- && task->pv->p2t_status != ABRT_P2_TASK_STATUS_FAILED)
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ if ( pv->p2t_status != ABRT_P2_TASK_STATUS_DONE
|
|
+ && pv->p2t_status != ABRT_P2_TASK_STATUS_FAILED)
|
|
{
|
|
g_set_error(error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
|
|
"Cannot finalize undone task");
|
|
@@ -170,12 +214,12 @@ void abrt_p2_task_finish(AbrtP2Task *task,
|
|
if (*error != NULL)
|
|
return;
|
|
|
|
- if (task->pv->p2t_results)
|
|
- *result = g_variant_ref(task->pv->p2t_results);
|
|
+ if (pv->p2t_results)
|
|
+ *result = g_variant_ref(pv->p2t_results);
|
|
else
|
|
*result = g_variant_new("a{sv}", NULL);
|
|
|
|
- *code = task->pv->p2t_code;
|
|
+ *code = pv->p2t_code;
|
|
}
|
|
|
|
static void abrt_p2_task_finish_gtask(GObject *source_object,
|
|
@@ -183,6 +227,7 @@ static void abrt_p2_task_finish_gtask(GObject *source_object,
|
|
gpointer user_data)
|
|
{
|
|
AbrtP2Task *task = ABRT_P2_TASK(source_object);
|
|
+ AbrtP2TaskPrivate *pv;
|
|
|
|
if (!g_task_is_valid(result, task))
|
|
{
|
|
@@ -190,6 +235,8 @@ static void abrt_p2_task_finish_gtask(GObject *source_object,
|
|
return;
|
|
}
|
|
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
GError *error = NULL;
|
|
const gint32 code = g_task_propagate_int(G_TASK(result), &error);
|
|
|
|
@@ -203,7 +250,7 @@ static void abrt_p2_task_finish_gtask(GObject *source_object,
|
|
{
|
|
log_debug("Task done");
|
|
|
|
- task->pv->p2t_code = code - ABRT_P2_TASK_CODE_DONE;
|
|
+ pv->p2t_code = code - ABRT_P2_TASK_CODE_DONE;
|
|
abrt_p2_task_change_status(task, ABRT_P2_TASK_STATUS_DONE);
|
|
}
|
|
else if (abrt_p2_task_is_cancelled(task))
|
|
@@ -263,8 +310,8 @@ static void abrt_p2_task_finish_gtask(GObject *source_object,
|
|
abrt_p2_task_change_status(task, ABRT_P2_TASK_STATUS_FAILED);
|
|
}
|
|
|
|
- g_object_unref(task->pv->p2t_cancellable);
|
|
- task->pv->p2t_cancellable = NULL;
|
|
+ g_object_unref(pv->p2t_cancellable);
|
|
+ pv->p2t_cancellable = NULL;
|
|
}
|
|
|
|
static void abrt_p2_task_thread(GTask *task,
|
|
@@ -289,8 +336,12 @@ void abrt_p2_task_start(AbrtP2Task *task,
|
|
GVariant *options,
|
|
GError **error)
|
|
{
|
|
- if ( task->pv->p2t_status != ABRT_P2_TASK_STATUS_NEW
|
|
- && task->pv->p2t_status != ABRT_P2_TASK_STATUS_STOPPED)
|
|
+ AbrtP2TaskPrivate *pv;
|
|
+
|
|
+ pv = abrt_p2_task_get_instance_private(task);
|
|
+
|
|
+ if ( pv->p2t_status != ABRT_P2_TASK_STATUS_NEW
|
|
+ && pv->p2t_status != ABRT_P2_TASK_STATUS_STOPPED)
|
|
{
|
|
g_set_error(error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
|
|
"Cannot start task that is not new or stopped");
|
|
@@ -302,9 +353,9 @@ void abrt_p2_task_start(AbrtP2Task *task,
|
|
if (*error != NULL)
|
|
return;
|
|
|
|
- task->pv->p2t_cancellable = g_cancellable_new();
|
|
+ pv->p2t_cancellable = g_cancellable_new();
|
|
GTask *gtask = g_task_new(task,
|
|
- task->pv->p2t_cancellable,
|
|
+ pv->p2t_cancellable,
|
|
abrt_p2_task_finish_gtask,
|
|
NULL);
|
|
|
|
diff --git a/src/dbus/abrt_problems2_task.h b/src/dbus/abrt_problems2_task.h
|
|
index 71f765d9..717af47b 100644
|
|
--- a/src/dbus/abrt_problems2_task.h
|
|
+++ b/src/dbus/abrt_problems2_task.h
|
|
@@ -45,21 +45,12 @@ G_BEGIN_DECLS
|
|
GType abrt_p2_task_get_type (void);
|
|
|
|
#define ABRT_TYPE_P2_TASK (abrt_p2_task_get_type ())
|
|
-#define ABRT_P2_TASK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ABRT_TYPE_P2_TASK, AbrtP2Task))
|
|
-#define ABRT_P2_TASK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ABRT_TYPE_P2_TASK, AbrtP2TaskClass))
|
|
-#define ABRT_IS_P2_TASK(obj)(G_TYPE_CHECK_INSTANCE_TYPE ((obj), ABRT_TYPE_P2_TASK))
|
|
-#define ABRT_IS_P2_TASK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ABRT_TYPE_P2_TASK))
|
|
-#define ABRT_P2_TASK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ABRT_TYPE_P2_TASK, AbrtP2TaskClass))
|
|
+G_DECLARE_DERIVABLE_TYPE(AbrtP2Task, abrt_p2_task, ABRT, P2_TASK, GObject)
|
|
|
|
typedef struct _AbrtP2Task AbrtP2Task;
|
|
typedef struct _AbrtP2TaskClass AbrtP2TaskClass;
|
|
typedef struct _AbrtP2TaskPrivate AbrtP2TaskPrivate;
|
|
|
|
-static inline void glib_autoptr_cleanup_AbrtP2Task(AbrtP2Task **task)
|
|
-{
|
|
- glib_autoptr_cleanup_GObject((GObject **)task);
|
|
-}
|
|
-
|
|
typedef enum {
|
|
ABRT_P2_TASK_STATUS_NEW,
|
|
ABRT_P2_TASK_STATUS_RUNNING,
|
|
@@ -96,21 +87,6 @@ struct _AbrtP2TaskClass
|
|
gpointer padding[12];
|
|
};
|
|
|
|
-struct _AbrtP2TaskPrivate
|
|
-{
|
|
- gint32 p2t_status;
|
|
- GVariant *p2t_details;
|
|
- GVariant *p2t_results;
|
|
- gint32 p2t_code;
|
|
- GCancellable *p2t_cancellable;
|
|
-};
|
|
-
|
|
-struct _AbrtP2Task
|
|
-{
|
|
- GObject parent_instance;
|
|
- AbrtP2TaskPrivate *pv;
|
|
-};
|
|
-
|
|
AbrtP2TaskStatus abrt_p2_task_status(AbrtP2Task *task);
|
|
|
|
/* Returns task details in form of key-value entries.
|
|
--
|
|
2.20.1
|
|
|