]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
syscall: have `vec' operate on bytes directly
authorEric Wong <e@80x24.org>
Sun, 24 Sep 2023 20:19:21 +0000 (20:19 +0000)
committerEric Wong <e@80x24.org>
Sun, 24 Sep 2023 23:14:21 +0000 (23:14 +0000)
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
t/cmd_ipc.t

index 776fbe23dae6da6ca855aa6ec18de2f77f8da0bf..b76a9e8a5a529325d294ba0b03928de83525725d 100644 (file)
@@ -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))
index 7313d13b6cddfc61575b5f4bd8183031fa242dd1..e5d22aab5a9e7e318710460c571dff3a50031c81 100644 (file)
@@ -97,7 +97,7 @@ my $do_test = sub { SKIP: {
 
                my $nr = 2 * 1024 * 1024;
                while (1) {
-                       vec(my $vec = '', $nr * 8 - 1, 1) = 1;
+                       vec(my $vec = '', $nr - 1, 8) = 1;
                        my $n = $send->($s1, [], $vec, $flag);
                        if (defined($n)) {
                                $n == length($vec) or