module: remove ready_fd

All modules are expected to handle a call to content() after having
been instantiated.

I.e. modules *cannot* even expect run() to have started running.
This commit is contained in:
Daniel Eklöf 2019-01-13 15:25:39 +01:00
parent 65cfcfb2de
commit acdeff3b6e
14 changed files with 27 additions and 66 deletions

20
bar.c
View file

@ -537,14 +537,10 @@ run(struct bar_run_context *run_ctx)
struct module_run_context run_ctx_center[bar->center.count];
struct module_run_context run_ctx_right[bar->right.count];
int ready_fd = eventfd(0, EFD_CLOEXEC | EFD_SEMAPHORE);
assert(ready_fd != -1);
for (size_t i = 0; i < bar->left.count; i++) {
struct module_run_context *ctx = &run_ctx_left[i];
ctx->module = bar->left.mods[i];
ctx->ready_fd = ready_fd;
ctx->abort_fd = run_ctx->abort_fd;
thrd_create(&thrd_left[i], (int (*)(void *))bar->left.mods[i]->run, ctx);
@ -553,7 +549,6 @@ run(struct bar_run_context *run_ctx)
struct module_run_context *ctx = &run_ctx_center[i];
ctx->module = bar->center.mods[i];
ctx->ready_fd = ready_fd;
ctx->abort_fd = run_ctx->abort_fd;
thrd_create(&thrd_center[i], (int (*)(void *))bar->center.mods[i]->run, ctx);
@ -562,26 +557,13 @@ run(struct bar_run_context *run_ctx)
struct module_run_context *ctx = &run_ctx_right[i];
ctx->module = bar->right.mods[i];
ctx->ready_fd = ready_fd;
ctx->abort_fd = run_ctx->abort_fd;
thrd_create(&thrd_right[i], (int (*)(void *))bar->right.mods[i]->run, ctx);
}
LOG_DBG("waiting for modules to become ready");
for (size_t i = 0; i < (bar->left.count +
bar->center.count +
bar->right.count); i++) {
uint64_t b;
read(ready_fd, &b, sizeof(b));
}
close(ready_fd);
LOG_DBG("all modules started");
refresh(_bar);
int fd = xcb_get_file_descriptor(bar->conn);
while (true) {
@ -646,6 +628,8 @@ run(struct bar_run_context *run_ctx)
}
}
LOG_DBG("shutting down");
/* Wait for modules to terminate */
int ret = 0;
int mod_ret;

View file

@ -27,12 +27,6 @@ module_default_destroy(struct module *mod)
free(mod);
}
void
module_signal_ready(struct module_run_context *ctx)
{
write(ctx->ready_fd, &(uint64_t){1}, sizeof(uint64_t));
}
struct exposable *
module_begin_expose(struct module *mod)
{

View file

@ -24,7 +24,6 @@ struct module_info {
struct module_run_context {
struct module *module;
int ready_fd;
int abort_fd;
};
@ -54,6 +53,4 @@ struct module {
struct module *module_common_new(void);
void module_default_destroy(struct module *mod);
void module_signal_ready(struct module_run_context *ctx);
struct exposable *module_begin_expose(struct module *mod);

View file

@ -179,8 +179,6 @@ run(struct module_run_context *ctx)
struct module *mod = ctx->module;
struct private *m = mod->private;
module_signal_ready(ctx);
snd_mixer_t *handle;
snd_mixer_open(&handle, 0);
snd_mixer_attach(handle, m->card);
@ -219,6 +217,8 @@ run(struct module_run_context *ctx)
m->card, m->mixer, m->vol_min, m->vol_max, m->vol_cur,
m->muted ? ", muted" : "");
mod->bar->refresh(mod->bar);
while (true) {
int fd_count = snd_mixer_poll_descriptors_count(handle);
assert(fd_count >= 1);

View file

@ -144,8 +144,6 @@ run(struct module_run_context *ctx)
struct private *m = ctx->module->private;
int current_fd = initialize(m);
module_signal_ready(ctx);
if (current_fd == -1)
return 1;
@ -165,6 +163,8 @@ run(struct module_run_context *ctx)
udev_monitor_filter_add_match_subsystem_devtype(mon, "backlight", NULL);
udev_monitor_enable_receiving(mon);
bar->refresh(bar);
while (true) {
struct pollfd fds[] = {
{.fd = ctx->abort_fd, .events = POLLIN},

View file

@ -248,10 +248,8 @@ run(struct module_run_context *ctx)
struct private *m = ctx->module->private;
int base_dir_fd = initialize(m);
if (base_dir_fd == -1) {
module_signal_ready(ctx);
if (base_dir_fd == -1)
return -1;
}
LOG_INFO("%s: %s %s (at %.1f%% of original capacity)",
m->battery, m->manufacturer, m->model,
@ -269,7 +267,6 @@ run(struct module_run_context *ctx)
if (status_fd == -1 || capacity_fd == -1 || energy_fd == -1 ||
power_fd == -1 || udev == NULL || mon == NULL)
{
module_signal_ready(ctx);
goto out;
}
@ -277,7 +274,7 @@ run(struct module_run_context *ctx)
udev_monitor_enable_receiving(mon);
update_status(ctx->module, capacity_fd, energy_fd, power_fd, status_fd);
module_signal_ready(ctx);
bar->refresh(bar);
while (true) {
struct pollfd fds[] = {

View file

@ -54,8 +54,7 @@ static int
run(struct module_run_context *ctx)
{
const struct bar *bar = ctx->module->bar;
module_signal_ready(ctx);
bar->refresh(bar);
while (true) {
time_t now = time(NULL);

View file

@ -376,7 +376,6 @@ run(struct module_run_context *ctx)
FILE *out = popen("i3 --get-socketpath", "r");
if (out == NULL) {
LOG_ERRNO("failed to execute 'i3 --get-socketpath'");
module_signal_ready(ctx);
return 1;
}
@ -392,7 +391,6 @@ run(struct module_run_context *ctx)
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock == -1) {
LOG_ERRNO("failed to create UNIX socket");
module_signal_ready(ctx);
return 1;
}
@ -400,7 +398,6 @@ run(struct module_run_context *ctx)
if (r == -1) {
LOG_ERRNO("failed to connect to i3 socket");
close(sock);
module_signal_ready(ctx);
return 1;
}
@ -408,8 +405,6 @@ run(struct module_run_context *ctx)
send_pkg(sock, I3_IPC_MESSAGE_TYPE_GET_WORKSPACES, NULL);
send_pkg(sock, I3_IPC_MESSAGE_TYPE_SUBSCRIBE, "[\"workspace\"]");
module_signal_ready(ctx);
char buf[1 * 1024 * 1024]; /* Some replies are *big*. TODO: grow dynamically */
size_t buf_idx = 0;

View file

@ -29,7 +29,6 @@ content(struct module *mod)
static int
run(struct module_run_context *ctx)
{
module_signal_ready(ctx);
return 0;
}

View file

@ -260,8 +260,6 @@ update_status(struct module *mod)
static int
run(struct module_run_context *ctx)
{
module_signal_ready(ctx);
struct module *mod = ctx->module;
const struct bar *bar = mod->bar;
struct private *m = mod->private;

View file

@ -459,8 +459,6 @@ run(struct module_run_context *ctx)
struct module *mod = ctx->module;
struct private *m = mod->private;
module_signal_ready(ctx);
m->nl_sock = netlink_connect();
if (m->nl_sock == -1)
return 1;

View file

@ -450,8 +450,6 @@ run(struct module_run_context *ctx)
struct module *mod = ctx->module;
struct private *m = mod->private;
module_signal_ready(ctx);
struct udev *udev = udev_new();
struct udev_monitor *dev_mon = udev_monitor_new_from_netlink(udev, "udev");

View file

@ -288,7 +288,8 @@ static bool
event_loop(struct module_run_context *ctx, xcb_connection_t *conn,
int xkb_event_base)
{
struct private *m = ctx->module->private;
struct module *mod = ctx->module;
struct private *m = mod->private;
const struct bar *bar = ctx->module->bar;
bool ret = false;
@ -352,13 +353,17 @@ event_loop(struct module_run_context *ctx, xcb_connection_t *conn,
}
if (current < layouts.count) {
mtx_lock(&mod->lock);
free_layouts(m->layouts);
m->layouts = layouts;
m->current = current;
mtx_unlock(&mod->lock);
bar->refresh(bar);
} else {
/* Can happen while transitioning to a new map */
mtx_lock(&mod->lock);
free_layouts(layouts);
mtx_unlock(&mod->lock);
}
break;
@ -369,7 +374,9 @@ event_loop(struct module_run_context *ctx, xcb_connection_t *conn,
(const xcb_xkb_state_notify_event_t *)_evt;
if (evt->changed & XCB_XKB_STATE_PART_GROUP_STATE) {
mtx_lock(&mod->lock);
m->current = evt->group;
mtx_unlock(&mod->lock);
bar->refresh(bar);
}
@ -398,38 +405,36 @@ talk_to_xkb(struct module_run_context *ctx, xcb_connection_t *conn)
struct private *m = ctx->module->private;
if (!xkb_enable(conn))
goto err;
return false;
if (!register_for_events(conn))
goto err;
return false;
int xkb_event_base = get_xkb_event_base(conn);
if (xkb_event_base == -1)
goto err;
return false;
int current = get_current_layout(conn);
if (current == -1)
goto err;
return false;
struct layouts layouts = get_layouts(conn);
if (layouts.count == -1)
goto err;
return false;
if (current >= layouts.count) {
LOG_ERR("current layout index: %d >= %zd", current, layouts.count);
free_layouts(layouts);
goto err;
return false;
}
mtx_lock(&ctx->module->lock);
m->layouts = layouts;
m->current = current;
mtx_unlock(&ctx->module->lock);
ctx->module->bar->refresh(ctx->module->bar);
module_signal_ready(ctx);
return event_loop(ctx, conn, xkb_event_base);
err:
module_signal_ready(ctx);
return false;
}
static int
@ -438,7 +443,6 @@ run(struct module_run_context *ctx)
xcb_connection_t *conn = xcb_connect(NULL, NULL);
if (conn == NULL) {
LOG_ERR("failed to connect to X server");
module_signal_ready(ctx);
return EXIT_FAILURE;
}

View file

@ -189,7 +189,6 @@ run(struct module_run_context *ctx)
m->conn = xcb_connect(NULL, NULL);
if (m->conn == NULL) {
LOG_ERR("failed to connect to X");
module_signal_ready(ctx);
return 1;
}
@ -218,8 +217,7 @@ run(struct module_run_context *ctx)
update_active_window(m);
update_application(mod);
update_title(mod);
module_signal_ready(ctx);
mod->bar->refresh(mod->bar);
int xcb_fd = xcb_get_file_descriptor(m->conn);
while (true) {