varlink: add exit-on-idle logic for Varlink server

This adds a logic that if enabled ensures sd_event_exit() is called
whenever the varlink connection count hits zero.

This is useful for implementing pure Varlink services (i.e. services
whose only job is to serve Varlink requests), that shall run only as
long as needed, i.e. as long as at least one request is being served.
This commit is contained in:
Lennart Poettering
2023-10-06 11:49:38 +02:00
parent faec54ad34
commit 4772334013
2 changed files with 21 additions and 1 deletions
+19 -1
View File
@@ -234,6 +234,8 @@ struct VarlinkServer {
unsigned connections_max;
unsigned connections_per_uid_max;
bool exit_on_idle;
};
static const char* const varlink_state_table[_VARLINK_STATE_MAX] = {
@@ -273,6 +275,7 @@ DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(varlink_state, VarlinkState);
log_debug("%s: " fmt, varlink_server_description(s), ##__VA_ARGS__)
static int varlink_format_queue(Varlink *v);
static void varlink_server_test_exit_on_idle(VarlinkServer *s);
static const char *varlink_description(Varlink *v) {
return (v ? v->description : NULL) ?: "varlink";
@@ -1654,6 +1657,7 @@ static void varlink_detach_server(Varlink *v) {
if (saved_server->disconnect_callback)
saved_server->disconnect_callback(saved_server, v, saved_server->userdata);
varlink_server_test_exit_on_idle(saved_server);
varlink_server_unref(saved_server);
varlink_unref(v);
}
@@ -3098,9 +3102,23 @@ int varlink_server_shutdown(VarlinkServer *s) {
return 0;
}
static void varlink_server_test_exit_on_idle(VarlinkServer *s) {
assert(s);
if (s->exit_on_idle && s->event && s->n_connections == 0)
(void) sd_event_exit(s->event, 0);
}
int varlink_server_set_exit_on_idle(VarlinkServer *s, bool b) {
assert_return(s, -EINVAL);
s->exit_on_idle = b;
varlink_server_test_exit_on_idle(s);
return 0;
}
static int varlink_server_add_socket_event_source(VarlinkServer *s, VarlinkServerSocket *ss, int64_t priority) {
_cleanup_(sd_event_source_unrefp) sd_event_source *es = NULL;
int r;
assert(s);
+2
View File
@@ -170,6 +170,8 @@ sd_event *varlink_server_get_event(VarlinkServer *v);
int varlink_server_shutdown(VarlinkServer *server);
int varlink_server_set_exit_on_idle(VarlinkServer *s, bool b);
unsigned varlink_server_connections_max(VarlinkServer *s);
unsigned varlink_server_connections_per_uid_max(VarlinkServer *s);