client: Do not leak idle clients on exit
This commit is contained in:
parent
c9ce7c71aa
commit
5b8117f3d4
4 changed files with 11 additions and 1 deletions
|
@ -13,6 +13,7 @@ struct server {
|
||||||
struct poller poller;
|
struct poller poller;
|
||||||
|
|
||||||
struct linked_list seats;
|
struct linked_list seats;
|
||||||
|
struct linked_list idle_clients;
|
||||||
};
|
};
|
||||||
|
|
||||||
int server_init(struct server *server);
|
int server_init(struct server *server);
|
||||||
|
|
|
@ -599,7 +599,7 @@ static struct libseat *builtin_open_seat(struct libseat_seat_listener *listener,
|
||||||
if (poller_poll(&server.poller) == -1) {
|
if (poller_poll(&server.poller) == -1) {
|
||||||
log_errorf("Could not poll server socket: %s", strerror(errno));
|
log_errorf("Could not poll server socket: %s", strerror(errno));
|
||||||
res = 1;
|
res = 1;
|
||||||
goto server_error;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
server_error:
|
server_error:
|
||||||
|
|
|
@ -138,6 +138,7 @@ static int handle_open_seat(struct client *client) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
linked_list_remove(&client->link);
|
||||||
if (seat_add_client(seat, client) == -1) {
|
if (seat_add_client(seat, client) == -1) {
|
||||||
log_errorf("unable to add client to target seat: %s", strerror(errno));
|
log_errorf("unable to add client to target seat: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -174,6 +175,7 @@ static int handle_close_seat(struct client *client) {
|
||||||
log_error("unable to remove client from seat");
|
log_error("unable to remove client from seat");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
linked_list_insert(&client->server->idle_clients, &client->link);
|
||||||
|
|
||||||
struct proto_header header = {
|
struct proto_header header = {
|
||||||
.opcode = SERVER_SEAT_CLOSED,
|
.opcode = SERVER_SEAT_CLOSED,
|
||||||
|
|
|
@ -26,6 +26,7 @@ int server_init(struct server *server) {
|
||||||
poller_init(&server->poller);
|
poller_init(&server->poller);
|
||||||
|
|
||||||
linked_list_init(&server->seats);
|
linked_list_init(&server->seats);
|
||||||
|
linked_list_init(&server->idle_clients);
|
||||||
|
|
||||||
if (poller_add_signal(&server->poller, SIGUSR1, server_handle_vt_rel, server) == NULL ||
|
if (poller_add_signal(&server->poller, SIGUSR1, server_handle_vt_rel, server) == NULL ||
|
||||||
poller_add_signal(&server->poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
poller_add_signal(&server->poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
||||||
|
@ -51,6 +52,11 @@ int server_init(struct server *server) {
|
||||||
|
|
||||||
void server_finish(struct server *server) {
|
void server_finish(struct server *server) {
|
||||||
assert(server);
|
assert(server);
|
||||||
|
while (!linked_list_empty(&server->idle_clients)) {
|
||||||
|
struct client *client = (struct client *)server->idle_clients.next;
|
||||||
|
linked_list_remove(&client->link);
|
||||||
|
client_destroy(client);
|
||||||
|
}
|
||||||
while (!linked_list_empty(&server->seats)) {
|
while (!linked_list_empty(&server->seats)) {
|
||||||
struct seat *seat = (struct seat *)server->seats.next;
|
struct seat *seat = (struct seat *)server->seats.next;
|
||||||
linked_list_remove(&seat->link);
|
linked_list_remove(&seat->link);
|
||||||
|
@ -131,6 +137,7 @@ int server_add_client(struct server *server, int fd) {
|
||||||
}
|
}
|
||||||
log_infof("new client connected (pid: %d, uid: %d, gid: %d)", client->pid, client->uid,
|
log_infof("new client connected (pid: %d, uid: %d, gid: %d)", client->pid, client->uid,
|
||||||
client->gid);
|
client->gid);
|
||||||
|
linked_list_insert(&server->idle_clients, &client->link);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue