From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: 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.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id D0AD81F8C4 for ; Fri, 5 Feb 2021 00:13:54 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] httpd/async: set O_NONBLOCK correctly Date: Fri, 5 Feb 2021 05:13:54 +0500 Message-Id: <20210205001354.24402-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: While Perl tie is nice for some things, getting IO::Handle->blocking to work transparently with it doesn't seem possible at the moment. Add some examples in t/spawn.t for future hackers. Fixes: 22e51bd9da476fa9 ("qspawn: switch to ProcessPipe via popen_rd") --- lib/PublicInbox/HTTPD/Async.pm | 3 ++- t/spawn.t | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index bd1fd8fa..1de9501d 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -37,7 +37,8 @@ sub new { arg => $arg, # arg for $cb end_obj => $end_obj, # like END{}, can ->event_step }, $class; - IO::Handle::blocking($io, 0); + my $pp = tied *$io; + $pp->{fh}->blocking(0) // die "$io->blocking(0): $!"; $self->SUPER::new($io, EPOLLIN | EPOLLET); } diff --git a/t/spawn.t b/t/spawn.t index 0eed79bb..6f811ec1 100644 --- a/t/spawn.t +++ b/t/spawn.t @@ -77,6 +77,11 @@ EOF { my $fh = popen_rd([qw(printf foo\nbar)]); ok(fileno($fh) >= 0, 'tied fileno works'); + my $tfh = (tied *$fh)->{fh}; + is($tfh->blocking(0), 1, '->blocking was true'); + is($tfh->blocking, 0, '->blocking is false'); + is($tfh->blocking(1), 0, '->blocking was true'); + is($tfh->blocking, 1, '->blocking is true'); my @line = <$fh>; is_deeply(\@line, [ "foo\n", 'bar' ], 'wantarray works on readline'); }