poller: Inline the poller into the server struct
This commit is contained in:
parent
3f3bdd41dd
commit
d68c5feaee
5 changed files with 23 additions and 35 deletions
|
@ -122,13 +122,17 @@ struct poller {
|
||||||
* Creates a poller with the best available polling backend. This poller must
|
* Creates a poller with the best available polling backend. This poller must
|
||||||
* be torn down with poller_destroy when it is no longer needed.
|
* be torn down with poller_destroy when it is no longer needed.
|
||||||
*/
|
*/
|
||||||
struct poller *poller_create(void);
|
/**
|
||||||
|
* Initializes the poller. The poller must be torn down with poller_finish when
|
||||||
|
* it is no longer needed.
|
||||||
|
*/
|
||||||
|
void poller_init(struct poller *poller);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys the poller. This destroys all remaining event sources, tears down
|
* De-initializes the poller. This destroys all remaining event sources and
|
||||||
* the poller and frees the structure.
|
* tears down the poller.
|
||||||
*/
|
*/
|
||||||
int poller_destroy(struct poller *poller);
|
int poller_finish(struct poller *poller);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an fd event source with the provided initial parameters. This event
|
* Create an fd event source with the provided initial parameters. This event
|
||||||
|
|
|
@ -10,7 +10,7 @@ struct client;
|
||||||
|
|
||||||
struct server {
|
struct server {
|
||||||
bool running;
|
bool running;
|
||||||
struct poller *poller;
|
struct poller poller;
|
||||||
|
|
||||||
struct list seats;
|
struct list seats;
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,28 +10,20 @@
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "poller.h"
|
#include "poller.h"
|
||||||
|
|
||||||
|
/* Used for signal handling */
|
||||||
struct poller *global_poller = NULL;
|
struct poller *global_poller = NULL;
|
||||||
|
|
||||||
struct poller *poller_create(void) {
|
void poller_init(struct poller *poller) {
|
||||||
if (global_poller != NULL) {
|
assert(global_poller == NULL);
|
||||||
errno = EEXIST;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct poller *poller = calloc(1, sizeof(struct poller));
|
|
||||||
if (poller == NULL) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
list_init(&poller->fds);
|
list_init(&poller->fds);
|
||||||
list_init(&poller->new_fds);
|
list_init(&poller->new_fds);
|
||||||
list_init(&poller->signals);
|
list_init(&poller->signals);
|
||||||
list_init(&poller->new_signals);
|
list_init(&poller->new_signals);
|
||||||
global_poller = poller;
|
global_poller = poller;
|
||||||
return poller;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int poller_destroy(struct poller *poller) {
|
int poller_finish(struct poller *poller) {
|
||||||
for (size_t idx = 0; idx < poller->fds.length; idx++) {
|
for (size_t idx = 0; idx < poller->fds.length; idx++) {
|
||||||
struct event_source_fd *bpfd = poller->fds.items[idx];
|
struct event_source_fd *bpfd = poller->fds.items[idx];
|
||||||
free(bpfd);
|
free(bpfd);
|
||||||
|
|
|
@ -48,7 +48,7 @@ int main(int argc, char *argv[]) {
|
||||||
log_info("seatd started");
|
log_info("seatd started");
|
||||||
|
|
||||||
while (server->running) {
|
while (server->running) {
|
||||||
if (poller_poll(server->poller) == -1) {
|
if (poller_poll(&server->poller) == -1) {
|
||||||
log_errorf("poller failed: %s", strerror(errno));
|
log_errorf("poller failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,23 +27,18 @@ static int server_handle_vt_rel(int signal, void *data);
|
||||||
static int server_handle_kill(int signal, void *data);
|
static int server_handle_kill(int signal, void *data);
|
||||||
|
|
||||||
struct server *server_create(void) {
|
struct server *server_create(void) {
|
||||||
struct poller *poller = poller_create();
|
|
||||||
if (poller == NULL) {
|
|
||||||
log_error("could not create poller");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
struct server *server = calloc(1, sizeof(struct server));
|
struct server *server = calloc(1, sizeof(struct server));
|
||||||
if (server == NULL) {
|
if (server == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
server->poller = poller;
|
poller_init(&server->poller);
|
||||||
|
|
||||||
list_init(&server->seats);
|
list_init(&server->seats);
|
||||||
|
|
||||||
if (poller_add_signal(poller, SIGUSR1, server_handle_vt_rel, server) == NULL ||
|
if (poller_add_signal(&server->poller, SIGUSR1, server_handle_vt_rel, server) == NULL ||
|
||||||
poller_add_signal(poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
poller_add_signal(&server->poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
||||||
poller_add_signal(poller, SIGINT, server_handle_kill, server) == NULL ||
|
poller_add_signal(&server->poller, SIGINT, server_handle_kill, server) == NULL ||
|
||||||
poller_add_signal(poller, SIGTERM, server_handle_kill, server) == NULL) {
|
poller_add_signal(&server->poller, SIGTERM, server_handle_kill, server) == NULL) {
|
||||||
server_destroy(server);
|
server_destroy(server);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -69,10 +64,7 @@ void server_destroy(struct server *server) {
|
||||||
seat_destroy(seat);
|
seat_destroy(seat);
|
||||||
}
|
}
|
||||||
list_free(&server->seats);
|
list_free(&server->seats);
|
||||||
if (server->poller != NULL) {
|
poller_finish(&server->poller);
|
||||||
poller_destroy(server->poller);
|
|
||||||
server->poller = NULL;
|
|
||||||
}
|
|
||||||
free(server);
|
free(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +144,7 @@ static int server_handle_connection(int fd, uint32_t mask, void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct client *client = client_create(server, new_fd);
|
struct client *client = client_create(server, new_fd);
|
||||||
client->event_source = poller_add_fd(server->poller, new_fd, EVENT_READABLE,
|
client->event_source = poller_add_fd(&server->poller, new_fd, EVENT_READABLE,
|
||||||
client_handle_connection, client);
|
client_handle_connection, client);
|
||||||
if (client->event_source == NULL) {
|
if (client->event_source == NULL) {
|
||||||
client_destroy(client);
|
client_destroy(client);
|
||||||
|
@ -174,7 +166,7 @@ int server_add_client(struct server *server, int fd) {
|
||||||
|
|
||||||
struct client *client = client_create(server, fd);
|
struct client *client = client_create(server, fd);
|
||||||
client->event_source =
|
client->event_source =
|
||||||
poller_add_fd(server->poller, fd, EVENT_READABLE, client_handle_connection, client);
|
poller_add_fd(&server->poller, fd, EVENT_READABLE, client_handle_connection, client);
|
||||||
if (client->event_source == NULL) {
|
if (client->event_source == NULL) {
|
||||||
client_destroy(client);
|
client_destroy(client);
|
||||||
log_errorf("could not add client socket to poller: %s", strerror(errno));
|
log_errorf("could not add client socket to poller: %s", strerror(errno));
|
||||||
|
@ -222,7 +214,7 @@ int server_listen(struct server *server, const char *path) {
|
||||||
} else {
|
} else {
|
||||||
log_errorf("could not get video group: %s", strerror(errno));
|
log_errorf("could not get video group: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
if (poller_add_fd(server->poller, fd, EVENT_READABLE, server_handle_connection, server) ==
|
if (poller_add_fd(&server->poller, fd, EVENT_READABLE, server_handle_connection, server) ==
|
||||||
NULL) {
|
NULL) {
|
||||||
log_errorf("could not add socket to poller: %s", strerror(errno));
|
log_errorf("could not add socket to poller: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue