summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>2019-05-27 09:13:18 +0000
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>2019-05-27 09:13:18 +0000
commitd8a35df8fff2f1321c0ceaffb3fd8e0f903d5997 (patch)
treec8a9791c23b6e191575aa0a230b3fec8736a9ae4
parent407909b6e6527ea22d6483568316240f8c0c5c3c (diff)
parentfb141c206318cc9c100c1f6ff563e7e3d176fb39 (diff)
downloadactivationd-d8a35df8fff2f1321c0ceaffb3fd8e0f903d5997.tar.gz
activationd-d8a35df8fff2f1321c0ceaffb3fd8e0f903d5997.tar.bz2
activationd-d8a35df8fff2f1321c0ceaffb3fd8e0f903d5997.zip
Merge "unit_start: Make unit actions asynchronous" into tizen
-rw-r--r--include/systemd_dbus.h13
-rw-r--r--src/action/unit_start.c22
-rw-r--r--src/util/systemd_dbus.c32
3 files changed, 65 insertions, 2 deletions
diff --git a/include/systemd_dbus.h b/include/systemd_dbus.h
index ae079e9..96741b8 100644
--- a/include/systemd_dbus.h
+++ b/include/systemd_dbus.h
@@ -42,6 +42,19 @@ int epc_dbus_call(char *service, char *obj, char *interface, char *method,
epc_dbus_call_simple(SYSTEMD_SERVICE, OBJ, INTF, METHOD, \
ARGS, ##__VA_ARGS__)
+typedef sd_bus_message_handler_t epc_dbus_handler_t;
+
+int epc_dbus_call_async(char *service, char *obj, char *interface, char *method,
+ sd_bus_error *error, epc_dbus_handler_t cb,
+ void *user_data, char *args, ...);
+
+#define epc_dbus_call_simple_async(SRV, OBJ, INTF, METHOD, CB, DATA, ARGS, ...) \
+ epc_dbus_call_async(SRV, OBJ, INTF, METHOD, NULL, CB, DATA, ARGS, ##__VA_ARGS__)
+
+#define epc_dbus_call_systemd_simple_async(OBJ, INTF, METHOD, CB, DATA, ARGS, ...) \
+ epc_dbus_call_simple_async(SYSTEMD_SERVICE, OBJ, INTF, METHOD, CB, DATA, \
+ ARGS, ##__VA_ARGS__)
+
int epc_acquire_systemd_bus(sd_bus **bus);
void epc_set_systemd_private(bool);
diff --git a/src/action/unit_start.c b/src/action/unit_start.c
index 837b70b..b06ac4d 100644
--- a/src/action/unit_start.c
+++ b/src/action/unit_start.c
@@ -23,6 +23,21 @@
#include "systemd_dbus.h"
#include "common.h"
+static int unit_action_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error)
+{
+ struct action_executed_event *exe_info = userdata;
+ int ret;
+
+ if (!exe_info)
+ return -EINVAL;
+
+ exe_info->result = 0;
+ ret = event_processor_report_event(&exe_info->event);
+ epc_event_unref(&exe_info->event);
+
+ return ret;
+}
+
static int start_unit(struct epc_action *action,
struct action_executed_event *exe_info)
{
@@ -66,9 +81,11 @@ static int start_unit(struct epc_action *action,
return 0;
}
- ret = epc_dbus_call_systemd_simple(SYSTEMD_OBJ,
+ ret = epc_dbus_call_systemd_simple_async(SYSTEMD_OBJ,
SYSTEMD_MANAGER_INTERFACE,
unit_action,
+ unit_action_handler,
+ exe_info,
"ss",
unit_name,
"replace");
@@ -78,7 +95,8 @@ static int start_unit(struct epc_action *action,
else
log_kmsg("Starting unit: %s", unit_name);
- exe_info->result = ret;
+ exe_info->result = -EPROBE_DEFER;
+ epc_event_ref(&exe_info->event);
return 0;
}
diff --git a/src/util/systemd_dbus.c b/src/util/systemd_dbus.c
index 37154b6..712ac33 100644
--- a/src/util/systemd_dbus.c
+++ b/src/util/systemd_dbus.c
@@ -29,6 +29,38 @@
static sd_bus *systemd_bus = NULL;
static bool epc_systemd_private = false;
+int epc_dbus_call_async(char *service, char *obj, char *interface, char *method,
+ sd_bus_error *error, epc_dbus_handler_t cb,
+ void *user_data, char *types, ...)
+{
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ int ret;
+
+ ret = epc_acquire_systemd_bus(&bus);
+ if (ret < 0)
+ return ret;
+
+ ret = sd_bus_message_new_method_call(bus, &m, service, obj, interface, method);
+ if (ret < 0)
+ goto fail;
+
+ if (types) {
+ va_list args;
+
+ va_start(args, types);
+ ret = sd_bus_message_appendv(m, types, args);
+ va_end(args);
+ if (ret < 0)
+ goto fail;
+ }
+
+ return sd_bus_call_async(bus, NULL, m, cb, user_data, 0);
+
+fail:
+ return ret;
+}
+
int epc_dbus_call(char *service, char *obj, char *interface, char *method,
sd_bus_error *error, sd_bus_message **out_msg,
char *types, ...)