--- a/pdd Sat Nov 03 21:01:49 2012 +0100
+++ b/pdd Sun Nov 04 20:36:22 2012 +0100
@@ -8,8 +8,10 @@
sub dd;
sub timer;
sub main;
+sub kbd;
MAIN: {
+ $| = 1;
my $dd;
$SIG{INT} = sub {
@@ -29,7 +31,8 @@
# the timer runs in its own thread, there it will
# send a USR1 every now and then to the $dd process
- my $timer = threads->create(\&timer, $dd);
+ threads->create(\&timer, $dd);
+# threads->create(\&kbd, $dd);
printf "%8s %8s %8s %15s %3s\n",
"time", "MB", "M/s", "speed", "done";
@@ -59,8 +62,8 @@
$size = $+{size};
}
- $timer->kill("KILL");
- $timer->join;
+ map { $_->kill("KILL") } threads->list;
+ map { $_->join } threads->list;
if (defined $dd) {
waitpid($dd, 0) == $dd or die "unexpected kid died\n";
@@ -88,6 +91,8 @@
local $SIG{"KILL"} = sub { threads->exit };
my $i = 0;
+ # just sleep 1 second to make the thread killer more
+ # that what we would expect
while (1) {
sleep 1;
kill "USR1" => $pid
@@ -95,3 +100,12 @@
}
}
+sub kbd {
+ my $pid = shift;
+ local $SIG{"KILL"} = sub { threads->exit };
+ open(KBD, "/dev/tty") or die "Can't open /dev/tty: $!";
+ while (<KBD>) {
+ kill "USR1" => $pid;
+ }
+ close(KBD);
+}