@@ -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
584612static 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
606628static void close_wss_data_cb (struct bufferevent * tev , void * arg ) {
0 commit comments