terminal, pty: pass eloop reference on obj creation
There is no reason to pass the eloop reference late at terminal/pty open. If we pass it early on object creation we will always have a valid reference and can remove several code paths. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
9b4c6c5542
commit
da0623c260
50
src/pty.c
50
src/pty.c
@ -37,6 +37,7 @@
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "eloop.h"
|
||||
#include "log.h"
|
||||
#include "pty.h"
|
||||
|
||||
@ -54,8 +55,8 @@ struct kmscon_pty {
|
||||
void *closed_data;
|
||||
};
|
||||
|
||||
int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb,
|
||||
void *data)
|
||||
int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop,
|
||||
kmscon_pty_input_cb input_cb, void *data)
|
||||
{
|
||||
struct kmscon_pty *pty;
|
||||
|
||||
@ -71,9 +72,11 @@ int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb,
|
||||
memset(pty, 0, sizeof(*pty));
|
||||
pty->fd = -1;
|
||||
pty->ref = 1;
|
||||
pty->eloop = loop;
|
||||
pty->input_cb = input_cb;
|
||||
pty->data = data;
|
||||
|
||||
kmscon_eloop_ref(pty->eloop);
|
||||
*out = pty;
|
||||
return 0;
|
||||
}
|
||||
@ -95,6 +98,7 @@ void kmscon_pty_unref(struct kmscon_pty *pty)
|
||||
return;
|
||||
|
||||
kmscon_pty_close(pty);
|
||||
kmscon_eloop_unref(pty->eloop);
|
||||
free(pty);
|
||||
log_debug("pty: destroying pty object\n");
|
||||
}
|
||||
@ -290,38 +294,12 @@ static void pty_input(struct kmscon_fd *fd, int mask, void *data)
|
||||
pty->input_cb(pty, u8, len, pty->data);
|
||||
}
|
||||
|
||||
static int connect_eloop(struct kmscon_pty *pty, struct kmscon_eloop *eloop)
|
||||
int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width,
|
||||
unsigned short height, kmscon_pty_closed_cb closed_cb, void *data)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (pty->eloop)
|
||||
return -EALREADY;
|
||||
|
||||
ret = kmscon_eloop_new_fd(eloop, &pty->efd, pty->fd,
|
||||
KMSCON_READABLE, pty_input, pty);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
kmscon_eloop_ref(eloop);
|
||||
pty->eloop = eloop;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void disconnect_eloop(struct kmscon_pty *pty)
|
||||
{
|
||||
kmscon_eloop_rm_fd(pty->efd);
|
||||
kmscon_eloop_unref(pty->eloop);
|
||||
pty->efd = NULL;
|
||||
pty->eloop = NULL;
|
||||
}
|
||||
|
||||
int kmscon_pty_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop,
|
||||
unsigned short width, unsigned short height,
|
||||
kmscon_pty_closed_cb closed_cb, void *data)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!pty || !eloop)
|
||||
if (!pty)
|
||||
return -EINVAL;
|
||||
|
||||
if (pty->fd >= 0)
|
||||
@ -331,11 +309,8 @@ int kmscon_pty_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = connect_eloop(pty, eloop);
|
||||
if (ret == -EALREADY) {
|
||||
disconnect_eloop(pty);
|
||||
ret = connect_eloop(pty, eloop);
|
||||
}
|
||||
ret = kmscon_eloop_new_fd(pty->eloop, &pty->efd, pty->fd,
|
||||
KMSCON_READABLE, pty_input, pty);
|
||||
if (ret) {
|
||||
close(pty->fd);
|
||||
pty->fd = -1;
|
||||
@ -355,7 +330,8 @@ void kmscon_pty_close(struct kmscon_pty *pty)
|
||||
if (!pty || pty->fd < 0)
|
||||
return;
|
||||
|
||||
disconnect_eloop(pty);
|
||||
kmscon_eloop_rm_fd(pty->efd);
|
||||
pty->efd = NULL;
|
||||
|
||||
close(pty->fd);
|
||||
pty->fd = -1;
|
||||
|
@ -51,14 +51,13 @@ typedef void (*kmscon_pty_input_cb)
|
||||
(struct kmscon_pty *pty, char *u8, size_t len, void *data);
|
||||
typedef void (*kmscon_pty_closed_cb) (struct kmscon_pty *pty, void *data);
|
||||
|
||||
int kmscon_pty_new(struct kmscon_pty **out, kmscon_pty_input_cb input_cb,
|
||||
void *data);
|
||||
int kmscon_pty_new(struct kmscon_pty **out, struct kmscon_eloop *loop,
|
||||
kmscon_pty_input_cb input_cb, void *data);
|
||||
void kmscon_pty_ref(struct kmscon_pty *pty);
|
||||
void kmscon_pty_unref(struct kmscon_pty *pty);
|
||||
|
||||
int kmscon_pty_open(struct kmscon_pty *pty, struct kmscon_eloop *eloop,
|
||||
unsigned short width, unsigned short height,
|
||||
kmscon_pty_closed_cb closed_cb, void *data);
|
||||
int kmscon_pty_open(struct kmscon_pty *pty, unsigned short width,
|
||||
unsigned short height, kmscon_pty_closed_cb closed_cb, void *data);
|
||||
void kmscon_pty_close(struct kmscon_pty *pty);
|
||||
|
||||
void kmscon_pty_write(struct kmscon_pty *pty, const char *u8, size_t len);
|
||||
|
@ -120,7 +120,8 @@ static void pty_input(struct kmscon_pty *pty, char *u8, size_t len, void *data)
|
||||
}
|
||||
|
||||
int kmscon_terminal_new(struct kmscon_terminal **out,
|
||||
struct kmscon_font_factory *ff, struct kmscon_compositor *comp)
|
||||
struct kmscon_eloop *loop, struct kmscon_font_factory *ff,
|
||||
struct kmscon_compositor *comp)
|
||||
{
|
||||
struct kmscon_terminal *term;
|
||||
int ret;
|
||||
@ -136,6 +137,7 @@ int kmscon_terminal_new(struct kmscon_terminal **out,
|
||||
|
||||
memset(term, 0, sizeof(*term));
|
||||
term->ref = 1;
|
||||
term->eloop = loop;
|
||||
term->comp = comp;
|
||||
|
||||
ret = kmscon_idle_new(&term->redraw);
|
||||
@ -151,10 +153,11 @@ int kmscon_terminal_new(struct kmscon_terminal **out,
|
||||
goto err_con;
|
||||
kmscon_vte_bind(term->vte, term->console);
|
||||
|
||||
ret = kmscon_pty_new(&term->pty, pty_input, term);
|
||||
ret = kmscon_pty_new(&term->pty, term->eloop, pty_input, term);
|
||||
if (ret)
|
||||
goto err_vte;
|
||||
|
||||
kmscon_eloop_ref(term->eloop);
|
||||
kmscon_compositor_ref(term->comp);
|
||||
*out = term;
|
||||
|
||||
@ -195,33 +198,11 @@ void kmscon_terminal_unref(struct kmscon_terminal *term)
|
||||
kmscon_console_unref(term->console);
|
||||
kmscon_idle_unref(term->redraw);
|
||||
kmscon_compositor_unref(term->comp);
|
||||
kmscon_eloop_unref(term->eloop);
|
||||
free(term);
|
||||
log_debug("terminal: destroying terminal object\n");
|
||||
}
|
||||
|
||||
int connect_eloop(struct kmscon_terminal *term, struct kmscon_eloop *eloop)
|
||||
{
|
||||
if (!term || !eloop)
|
||||
return -EINVAL;
|
||||
|
||||
if (term->eloop)
|
||||
return -EALREADY;
|
||||
|
||||
kmscon_eloop_ref(eloop);
|
||||
term->eloop = eloop;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void disconnect_eloop(struct kmscon_terminal *term)
|
||||
{
|
||||
if (!term)
|
||||
return;
|
||||
|
||||
kmscon_eloop_unref(term->eloop);
|
||||
term->eloop = NULL;
|
||||
}
|
||||
|
||||
static void pty_closed(struct kmscon_pty *pty, void *data)
|
||||
{
|
||||
struct kmscon_terminal *term = data;
|
||||
@ -229,8 +210,7 @@ static void pty_closed(struct kmscon_pty *pty, void *data)
|
||||
}
|
||||
|
||||
int kmscon_terminal_open(struct kmscon_terminal *term,
|
||||
struct kmscon_eloop *eloop,
|
||||
kmscon_terminal_closed_cb closed_cb, void *data)
|
||||
kmscon_terminal_closed_cb closed_cb, void *data)
|
||||
{
|
||||
int ret;
|
||||
unsigned short width, height;
|
||||
@ -238,21 +218,11 @@ int kmscon_terminal_open(struct kmscon_terminal *term,
|
||||
if (!term)
|
||||
return -EINVAL;
|
||||
|
||||
ret = connect_eloop(term, eloop);
|
||||
if (ret == -EALREADY) {
|
||||
disconnect_eloop(term);
|
||||
ret = connect_eloop(term, eloop);
|
||||
}
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
width = kmscon_console_get_width(term->console);
|
||||
height = kmscon_console_get_height(term->console);
|
||||
ret = kmscon_pty_open(term->pty, eloop, width, height, pty_closed, term);
|
||||
if (ret) {
|
||||
disconnect_eloop(term);
|
||||
ret = kmscon_pty_open(term->pty, width, height, pty_closed, term);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
term->closed_cb = closed_cb;
|
||||
term->closed_data = data;
|
||||
@ -272,7 +242,6 @@ void kmscon_terminal_close(struct kmscon_terminal *term)
|
||||
term->closed_data = NULL;
|
||||
term->closed_cb = NULL;
|
||||
|
||||
disconnect_eloop(term);
|
||||
kmscon_pty_close(term->pty);
|
||||
|
||||
if (cb)
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "console.h"
|
||||
#include "eloop.h"
|
||||
#include "font.h"
|
||||
#include "output.h"
|
||||
#include "unicode.h"
|
||||
@ -45,13 +46,13 @@ typedef void (*kmscon_terminal_closed_cb) (struct kmscon_terminal *term,
|
||||
void *data);
|
||||
|
||||
int kmscon_terminal_new(struct kmscon_terminal **out,
|
||||
struct kmscon_font_factory *ff, struct kmscon_compositor *comp);
|
||||
struct kmscon_eloop *loop, struct kmscon_font_factory *ff,
|
||||
struct kmscon_compositor *comp);
|
||||
void kmscon_terminal_ref(struct kmscon_terminal *term);
|
||||
void kmscon_terminal_unref(struct kmscon_terminal *term);
|
||||
|
||||
int kmscon_terminal_open(struct kmscon_terminal *term,
|
||||
struct kmscon_eloop *eloop,
|
||||
kmscon_terminal_closed_cb closed_cb, void *data);
|
||||
kmscon_terminal_closed_cb closed_cb, void *data);
|
||||
void kmscon_terminal_close(struct kmscon_terminal *term);
|
||||
|
||||
int kmscon_terminal_add_output(struct kmscon_terminal *term,
|
||||
|
@ -110,8 +110,7 @@ static void terminal_closed(struct kmscon_terminal *term, void *data)
|
||||
if (!app)
|
||||
goto err_out;
|
||||
|
||||
ret = kmscon_terminal_open(app->term, app->eloop,
|
||||
terminal_closed, app);
|
||||
ret = kmscon_terminal_open(app->term, terminal_closed, app);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
@ -247,12 +246,11 @@ static int setup_app(struct app *app)
|
||||
if (ret)
|
||||
goto err_loop;
|
||||
|
||||
ret = kmscon_terminal_new(&app->term, app->ff, app->comp);
|
||||
ret = kmscon_terminal_new(&app->term, app->eloop, app->ff, app->comp);
|
||||
if (ret)
|
||||
goto err_loop;
|
||||
|
||||
ret = kmscon_terminal_open(app->term, app->eloop,
|
||||
terminal_closed, app);
|
||||
ret = kmscon_terminal_open(app->term, terminal_closed, app);
|
||||
if (ret)
|
||||
goto err_loop;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user