Sync OpenBSD patchset 491:

Initial changes to move tmux to libevent.

This moves the client-side loops are pretty much fully over to event-based only
(tmux.c and client.c) but server-side (server.c and friends) treats libevent as
a sort of clever poll, waking up after every event to run various things.

Moving the server stuff over to bufferevents and timers and so on will come
later.
This commit is contained in:
Tiago Cunha
2009-11-08 22:40:36 +00:00
parent 5ce49941fb
commit dd36982ad5
12 changed files with 611 additions and 640 deletions

View File

@ -1,4 +1,4 @@
/* $Id: server-client.c,v 1.12 2009-11-04 22:46:25 tcunha Exp $ */
/* $Id: server-client.c,v 1.13 2009-11-08 22:40:36 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -18,6 +18,7 @@
#include <sys/types.h>
#include <event.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
@ -133,7 +134,9 @@ server_client_lost(struct client *c)
close(c->ibuf.fd);
imsg_clear(&c->ibuf);
event_del(&c->event);
event_del(&c->tty.event);
for (i = 0; i < ARRAY_LENGTH(&dead_clients); i++) {
if (ARRAY_ITEM(&dead_clients, i) == NULL) {
ARRAY_SET(&dead_clients, i, c);
@ -161,25 +164,31 @@ server_client_prepare(void)
events = 0;
if (!(c->flags & CLIENT_BAD))
events |= POLLIN;
events |= EV_READ;
if (c->ibuf.w.queued > 0)
events |= POLLOUT;
server_poll_add(c->ibuf.fd, events, server_client_callback, c);
events |= EV_WRITE;
event_del(&c->event);
event_set(&c->event,
c->ibuf.fd, events, server_client_callback, c);
event_add(&c->event, NULL);
if (c->tty.fd == -1)
continue;
if (c->flags & CLIENT_SUSPENDED || c->session == NULL)
continue;
events = POLLIN;
events = EV_READ;
if (BUFFER_USED(c->tty.out) > 0)
events |= POLLOUT;
server_poll_add(c->tty.fd, events, server_client_callback, c);
events |= EV_WRITE;
event_del(&c->tty.event);
event_set(&c->tty.event,
c->tty.fd, events, server_client_callback, c);
event_add(&c->tty.event, NULL);
}
}
/* Process a single client event. */
void
server_client_callback(int fd, int events, void *data)
server_client_callback(int fd, short events, void *data)
{
struct client *c = data;
@ -187,10 +196,7 @@ server_client_callback(int fd, int events, void *data)
return;
if (fd == c->ibuf.fd) {
if (events & (POLLERR|POLLNVAL|POLLHUP))
goto client_lost;
if (events & POLLOUT && msgbuf_write(&c->ibuf.w) < 0)
if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) < 0)
goto client_lost;
if (c->flags & CLIENT_BAD) {
@ -199,7 +205,7 @@ server_client_callback(int fd, int events, void *data)
return;
}
if (events & POLLIN && server_client_msg_dispatch(c) != 0)
if (events & EV_READ && server_client_msg_dispatch(c) != 0)
goto client_lost;
}
@ -210,7 +216,7 @@ server_client_callback(int fd, int events, void *data)
if (buffer_poll(fd, events, c->tty.in, c->tty.out) != 0)
goto client_lost;
}
return;
client_lost:
@ -423,7 +429,7 @@ server_client_check_redraw(struct client *c)
if (c->flags & (CLIENT_REDRAW|CLIENT_STATUS)) {
if (options_get_number(&s->options, "set-titles"))
server_client_set_title(c);
if (c->message_string != NULL)
redraw = status_message_redraw(c);
else if (c->prompt_string != NULL)