Skip to content

Commit 89b36a4

Browse files
committed
both: only free bufferevent when output is empty
1 parent aa05976 commit 89b36a4

1 file changed

Lines changed: 33 additions & 11 deletions

File tree

‎common.c‎

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -575,22 +575,44 @@ static enum bufferevent_filter_result wss_input_filter_udp(struct evbuffer *src,
575575
return common_wss_input_filter(src, dst, tev, 0);
576576
}
577577

578-
static void free_raw_after_write(struct bufferevent *raw, void *arg) {
578+
static void bev_empty_cb(struct bufferevent *bev, void *arg) {
579579
(void) arg;
580-
LOGD("free raw %p", raw);
581-
bufferevent_free(raw);
580+
if (evbuffer_get_length(bev->output) == 0) {
581+
LOGD("free bev %p", bev);
582+
bufferevent_free(bev);
583+
}
584+
}
585+
586+
static void bev_error_cb(struct bufferevent *bev, short event, void *arg) {
587+
size_t size;
588+
589+
(void) arg;
590+
size = evbuffer_get_length(bev->output);
591+
if (size > 0) {
592+
LOGW("free bev %p, event: 0x%02x, pending: %zu", bev, event, size);
593+
} else {
594+
LOGD("free bev %p, event: 0x%02x", bev, event);
595+
}
596+
bufferevent_free(bev);
597+
}
598+
599+
static void bufferevent_free_when_empty(struct bufferevent *bev) {
600+
if (evbuffer_get_length(bev->output)) {
601+
struct timeval tv = {WSS_TIMEOUT, 0};
602+
LOGD("free bev %p later, pending: %zu", bev, evbuffer_get_length(bev->output));
603+
bufferevent_disable(bev, EV_READ);
604+
bufferevent_enable(bev, EV_WRITE);
605+
bufferevent_set_timeouts(bev, NULL, &tv);
606+
bufferevent_setcb(bev, NULL, bev_empty_cb, bev_error_cb, NULL);
607+
} else {
608+
bufferevent_free(bev);
609+
}
582610
}
583611

584612
static void close_wev(struct bufferevent *wev, struct bufferevent *tev) {
585613
if (wev->cbarg && wev->cbarg != tev) {
586-
struct bufferevent *raw = wev->cbarg;
587614
evbuffer_remove_cb(tev->output, tev_write_cb, wev->cbarg);
588-
if (evbuffer_get_length(raw->output)) {
589-
LOGD("free raw %p later, pending: %zu", raw, evbuffer_get_length(raw->output));
590-
bufferevent_setcb(raw, NULL, free_raw_after_write, NULL, NULL);
591-
} else {
592-
bufferevent_free(raw);
593-
}
615+
bufferevent_free_when_empty(wev->cbarg);
594616
wev->cbarg = NULL;
595617
}
596618
bufferevent_free(wev);
@@ -600,7 +622,7 @@ static void do_close_wss(struct bufferevent *tev) {
600622
if (tev->cbarg) {
601623
close_wev(tev->cbarg, tev);
602624
}
603-
bufferevent_free(tev);
625+
bufferevent_free_when_empty(tev);
604626
}
605627

606628
static void close_wss_data_cb(struct bufferevent *tev, void *arg) {

0 commit comments

Comments
 (0)