01
2022-08-25
op
#!/usr/bin/env perl
03
2022-08-25
op
use open ":std", ":encoding(UTF-8)";
04
2022-08-25
op
use strict;
05
2022-08-25
op
use warnings;
07
2022-08-25
op
use IO::Poll qw(POLLOUT);
09
2022-08-25
op
use OpenBSD::Pledge;
10
2022-08-25
op
use OpenBSD::Unveil;
12
2022-08-25
op
my $jobs = $ENV{'MAKE_JOBS'} // 1;
14
2022-08-25
op
my $poll = IO::Poll->new();
15
2022-08-25
op
for (1..$jobs) {
16
2022-08-25
op
open(my $kid, '|-', './mexp') or die "can't exec ./mexp: $!";
17
2022-08-25
op
$poll->mask($kid => POLLOUT);
20
2022-08-25
op
sub process {
21
2022-08-25
op
die "poll: $!" if $poll->poll() == -1;
22
2022-08-25
op
my @handles = $poll->handles(POLLOUT) or die "no procs ready?";
23
2022-08-25
op
my $handle = $handles[int(rand(@handles))];
24
2022-08-26
op
print $handle $_ foreach @_;
27
2022-08-25
op
unveil("./mexp", "rx") or die "unveil mexp: $!";
28
2022-08-25
op
pledge("stdio proc exec") or die "pledge: $!";
30
2022-08-25
op
my @thread;
31
2022-08-25
op
while (<>) {
32
2022-08-25
op
print; # continue the pipeline
34
2022-08-26
op
my $new_thread = m/^-/;
35
2022-08-26
op
if ($new_thread && @thread) {
36
2022-08-25
op
process @thread;
37
2022-08-25
op
@thread = ();
40
2022-08-25
op
push @thread, $_;
43
2022-08-25
op
process @thread if @thread;