From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 6EF731FCC7; Mon, 26 Dec 2016 03:05:17 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: Eric Wong Subject: [PATCH] evcleanup: ensure deferred close from timers are handled ASAP Date: Mon, 26 Dec 2016 03:05:15 +0000 Message-Id: <20161226030515.6141-1-e@80x24.org> List-Id: Danga::Socket defers close() syscalls until the end of the event loop to avoid FD recycling. Unfortunately, this is dependent on IO events firing and waking the process up from poll/kevent/epoll_wait. Without any I/O activity, a socket could remain in the @Danga::Socket::ToClose array indefinitely. Thus, we will trigger a fake IO event after running all timers to trigger the deferred close in Danga::Socket::PostEventLoop. --- lib/PublicInbox/EvCleanup.pm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/EvCleanup.pm b/lib/PublicInbox/EvCleanup.pm index 2b77c61..b9fe843 100644 --- a/lib/PublicInbox/EvCleanup.pm +++ b/lib/PublicInbox/EvCleanup.pm @@ -30,9 +30,19 @@ sub _run_all ($) { $_->() foreach @$run; } +# ensure Danga::Socket::ToClose fires after timers fire +sub _asap_close () { $asapq->[1] ||= _asap_timer() } + sub _run_asap () { _run_all($asapq) } -sub _run_next () { _run_all($nextq) } -sub _run_later () { _run_all($laterq) } +sub _run_next () { + _run_all($nextq); + _asap_close(); +} + +sub _run_later () { + _run_all($laterq); + _asap_close(); +} # Called by Danga::Socket sub event_write { -- EW