Merge branch 'be-openssl-more-common-with-be-sock'

* be-openssl-more-common-with-be-sock:
  be_openssl: use bufferevent_enable() instead of bufferevent_add_event_()
  be_sock: drop be_sock_add() macro (useless and debug unfriendly)
  be: introduce bufferevent_generic_adj_existing_timeouts_()
  be_openssl: don't add events during bev creation (like be_sock)
  be: add_event: use evutil_timerisset()
This commit is contained in:
Azat Khuzhin 2015-11-06 10:36:18 +03:00
commit 29573f0db4
4 changed files with 35 additions and 71 deletions

View File

@ -412,6 +412,7 @@ void bufferevent_init_generic_timeout_cbs_(struct bufferevent *bev);
* we delete it.) Call this from anything that changes the timeout values, * we delete it.) Call this from anything that changes the timeout values,
* that enabled EV_READ or EV_WRITE, or that disables EV_READ or EV_WRITE. */ * that enabled EV_READ or EV_WRITE, or that disables EV_READ or EV_WRITE. */
int bufferevent_generic_adj_timeouts_(struct bufferevent *bev); int bufferevent_generic_adj_timeouts_(struct bufferevent *bev);
int bufferevent_generic_adj_existing_timeouts_(struct bufferevent *bev);
enum bufferevent_options bufferevent_get_options_(struct bufferevent *bev); enum bufferevent_options bufferevent_get_options_(struct bufferevent *bev);

View File

@ -969,10 +969,33 @@ bufferevent_generic_adj_timeouts_(struct bufferevent *bev)
return 0; return 0;
} }
int
bufferevent_generic_adj_existing_timeouts_(struct bufferevent *bev)
{
int r = 0;
if (event_pending(&bev->ev_read, EV_READ, NULL)) {
if (evutil_timerisset(&bev->timeout_read)) {
if (bufferevent_add_event_(&bev->ev_read, &bev->timeout_read) < 0)
r = -1;
} else {
event_remove_timer(&bev->ev_read);
}
}
if (event_pending(&bev->ev_write, EV_WRITE, NULL)) {
if (evutil_timerisset(&bev->timeout_write)) {
if (bufferevent_add_event_(&bev->ev_write, &bev->timeout_write) < 0)
r = -1;
} else {
event_remove_timer(&bev->ev_write);
}
}
return r;
}
int int
bufferevent_add_event_(struct event *ev, const struct timeval *tv) bufferevent_add_event_(struct event *ev, const struct timeval *tv)
{ {
if (tv->tv_sec == 0 && tv->tv_usec == 0) if (!evutil_timerisset(tv))
return event_add(ev, NULL); return event_add(ev, NULL);
else else
return event_add(ev, tv); return event_add(ev, tv);

View File

@ -1090,7 +1090,6 @@ set_handshake_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
return do_handshake(bev_ssl); return do_handshake(bev_ssl);
} else { } else {
struct bufferevent *bev = &bev_ssl->bev.bev; struct bufferevent *bev = &bev_ssl->bev.bev;
int r1=0, r2=0;
if (event_initialized(&bev->ev_read)) { if (event_initialized(&bev->ev_read)) {
event_del(&bev->ev_read); event_del(&bev->ev_read);
@ -1103,11 +1102,9 @@ set_handshake_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
event_assign(&bev->ev_write, bev->ev_base, fd, event_assign(&bev->ev_write, bev->ev_base, fd,
EV_WRITE|EV_PERSIST|EV_FINALIZE, EV_WRITE|EV_PERSIST|EV_FINALIZE,
be_openssl_handshakeeventcb, bev_ssl); be_openssl_handshakeeventcb, bev_ssl);
if (fd >= 0) { if (fd >= 0)
r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read); bufferevent_enable(bev, bev->enabled);
r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write); return 0;
}
return (r1<0 || r2<0) ? -1 : 0;
} }
} }
@ -1159,9 +1156,6 @@ be_openssl_enable(struct bufferevent *bev, short events)
struct bufferevent_openssl *bev_ssl = upcast(bev); struct bufferevent_openssl *bev_ssl = upcast(bev);
int r1 = 0, r2 = 0; int r1 = 0, r2 = 0;
if (bev_ssl->state != BUFFEREVENT_SSL_OPEN)
return 0;
if (events & EV_READ) if (events & EV_READ)
r1 = start_reading(bev_ssl); r1 = start_reading(bev_ssl);
if (events & EV_WRITE) if (events & EV_WRITE)
@ -1254,23 +1248,7 @@ be_openssl_adj_timeouts(struct bufferevent *bev)
if (bev_ssl->underlying) { if (bev_ssl->underlying) {
return bufferevent_generic_adj_timeouts_(bev); return bufferevent_generic_adj_timeouts_(bev);
} else { } else {
int r1=0, r2=0; return bufferevent_generic_adj_existing_timeouts_(bev);
if (event_pending(&bev->ev_read, EV_READ, NULL)) {
if (evutil_timerisset(&bev->timeout_read)) {
r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
} else {
event_remove_timer(&bev->ev_read);
}
}
if (event_pending(&bev->ev_write, EV_WRITE, NULL)) {
if (evutil_timerisset(&bev->timeout_write)) {
r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
} else {
event_remove_timer(&bev->ev_write);
}
}
return (r1<0 || r2<0) ? -1 : 0;
} }
} }
@ -1394,15 +1372,6 @@ bufferevent_openssl_new_impl(struct event_base *base,
if (state == BUFFEREVENT_SSL_OPEN) if (state == BUFFEREVENT_SSL_OPEN)
bufferevent_suspend_read_(underlying, bufferevent_suspend_read_(underlying,
BEV_SUSPEND_FILT_READ); BEV_SUSPEND_FILT_READ);
} else {
struct bufferevent *bev = &bev_ssl->bev.bev;
bev->enabled = EV_READ|EV_WRITE;
if (state != BUFFEREVENT_SSL_OPEN)
if (event_add(&bev->ev_read, NULL) < 0)
goto err;
if (event_initialized(&bev->ev_write))
if (event_add(&bev->ev_write, NULL) < 0)
goto err;
} }
return &bev_ssl->bev.bev; return &bev_ssl->bev.bev;

View File

@ -79,7 +79,6 @@
static int be_socket_enable(struct bufferevent *, short); static int be_socket_enable(struct bufferevent *, short);
static int be_socket_disable(struct bufferevent *, short); static int be_socket_disable(struct bufferevent *, short);
static void be_socket_destruct(struct bufferevent *); static void be_socket_destruct(struct bufferevent *);
static int be_socket_adj_timeouts(struct bufferevent *);
static int be_socket_flush(struct bufferevent *, short, enum bufferevent_flush_mode); static int be_socket_flush(struct bufferevent *, short, enum bufferevent_flush_mode);
static int be_socket_ctrl(struct bufferevent *, enum bufferevent_ctrl_op, union bufferevent_ctrl_data *); static int be_socket_ctrl(struct bufferevent *, enum bufferevent_ctrl_op, union bufferevent_ctrl_data *);
@ -92,14 +91,11 @@ const struct bufferevent_ops bufferevent_ops_socket = {
be_socket_disable, be_socket_disable,
NULL, /* unlink */ NULL, /* unlink */
be_socket_destruct, be_socket_destruct,
be_socket_adj_timeouts, bufferevent_generic_adj_existing_timeouts_,
be_socket_flush, be_socket_flush,
be_socket_ctrl, be_socket_ctrl,
}; };
#define be_socket_add(ev, t) \
bufferevent_add_event_((ev), (t))
const struct sockaddr* const struct sockaddr*
bufferevent_socket_get_conn_address_(struct bufferevent *bev) bufferevent_socket_get_conn_address_(struct bufferevent *bev)
{ {
@ -140,7 +136,7 @@ bufferevent_socket_outbuf_cb(struct evbuffer *buf,
!bufev_p->write_suspended) { !bufev_p->write_suspended) {
/* Somebody added data to the buffer, and we would like to /* Somebody added data to the buffer, and we would like to
* write, and we were not writing. So, start writing. */ * write, and we were not writing. So, start writing. */
if (be_socket_add(&bufev->ev_write, &bufev->timeout_write) == -1) { if (bufferevent_add_event_(&bufev->ev_write, &bufev->timeout_write) == -1) {
/* Should we log this? */ /* Should we log this? */
} }
} }
@ -577,14 +573,12 @@ bufferevent_new(evutil_socket_t fd,
static int static int
be_socket_enable(struct bufferevent *bufev, short event) be_socket_enable(struct bufferevent *bufev, short event)
{ {
if (event & EV_READ) { if (event & EV_READ &&
if (be_socket_add(&bufev->ev_read,&bufev->timeout_read) == -1) bufferevent_add_event_(&bufev->ev_read, &bufev->timeout_read) == -1)
return -1; return -1;
} if (event & EV_WRITE &&
if (event & EV_WRITE) { bufferevent_add_event_(&bufev->ev_write, &bufev->timeout_write) == -1)
if (be_socket_add(&bufev->ev_write,&bufev->timeout_write) == -1)
return -1; return -1;
}
return 0; return 0;
} }
@ -619,29 +613,6 @@ be_socket_destruct(struct bufferevent *bufev)
EVUTIL_CLOSESOCKET(fd); EVUTIL_CLOSESOCKET(fd);
} }
static int
be_socket_adj_timeouts(struct bufferevent *bufev)
{
int r = 0;
if (event_pending(&bufev->ev_read, EV_READ, NULL)) {
if (evutil_timerisset(&bufev->timeout_read)) {
if (be_socket_add(&bufev->ev_read, &bufev->timeout_read) < 0)
r = -1;
} else {
event_remove_timer(&bufev->ev_read);
}
}
if (event_pending(&bufev->ev_write, EV_WRITE, NULL)) {
if (evutil_timerisset(&bufev->timeout_write)) {
if (be_socket_add(&bufev->ev_write, &bufev->timeout_write) < 0)
r = -1;
} else {
event_remove_timer(&bufev->ev_write);
}
}
return r;
}
static int static int
be_socket_flush(struct bufferevent *bev, short iotype, be_socket_flush(struct bufferevent *bev, short iotype,
enum bufferevent_flush_mode mode) enum bufferevent_flush_mode mode)