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:
David Herrmann 2012-01-28 13:56:13 +01:00
parent 9b4c6c5542
commit da0623c260
5 changed files with 33 additions and 90 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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)

View File

@ -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,

View File

@ -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;