From b8db6914a2a7da45cf0aed20240c8c6696a16968 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 24 Sep 2023 20:19:21 +0000 Subject: syscall: have `vec' operate on bytes directly Instead of converting to bytes to bits and asking `vec' to operate on single bits, we can just have `vec' work on 8 bits at-a-time. This also fixes an overallocation in pure Perl Linux recv_cmd4. Adding an extra byte ourselves for "\0" isn't necessary: Perl already does it internally everywhere when creating/resizing scalars. --- lib/PublicInbox/Syscall.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/PublicInbox/Syscall.pm') diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm index 776fbe23..b76a9e8a 100644 --- a/lib/PublicInbox/Syscall.pm +++ b/lib/PublicInbox/Syscall.pm @@ -283,7 +283,7 @@ sub epoll_wait_mod4 { # resize our static buffer if maxevents bigger than we've ever done if ($maxevents > $epoll_wait_size) { $epoll_wait_size = $maxevents; - vec($epoll_wait_events, $maxevents * 12 * 8 - 1, 1) = 0; + vec($epoll_wait_events, $maxevents * 12 - 1, 8) = 0; } @$events = (); my $ct = syscall($SYS_epoll_wait, $epfd, $epoll_wait_events, @@ -304,7 +304,7 @@ sub epoll_wait_mod8 { # resize our static buffer if maxevents bigger than we've ever done if ($maxevents > $epoll_wait_size) { $epoll_wait_size = $maxevents; - vec($epoll_wait_events, $maxevents * 16 * 8 - 1, 1) = 0; + vec($epoll_wait_events, $maxevents * 16 - 1, 8) = 0; } @$events = (); my $ct = syscall($SYS_epoll_wait, $epfd, $epoll_wait_events, @@ -429,7 +429,7 @@ no warnings 'once'; *recv_cmd4 = sub ($$$) { my ($sock, undef, $len) = @_; - vec($_[1] //= '', ($len + 1) * 8, 1) = 0; + vec($_[1] //= '', $len - 1, 8) = 0; my $cmsghdr = "\0" x msg_controllen; # 10 * sizeof(int) my $iov = pack('P'.TMPL_size_t, $_[1], $len); my $mh = pack('PL' . # msg_name, msg_namelen (socklen_t (U32)) -- cgit v1.2.3-24-ge0c7