Currently the only problem I have with it is that it doesn't croak if you forget the Parent or Child blocks, but I think that's pretty minor.
Easy enough:
--- ForkBlock.pm~ Wed Dec 24 20:18:01 2008
+++ ForkBlock.pm Wed Dec 24 21:02:50 2008
@@ -31,6 +31,9 @@
my $parent=$params{"parent"};
my $child =$params{"child"} ;
my $error =$params{"error"} ;
+
+ croak "No Child defined" unless $child;
+ croak "No Parent defined" unless $parent;
local $!;
Although one could make the case that it ought to fall-through without
a Parent. You can achieve that with
DumbFork { Parent {return} ...}
This patch exposes the child PID in a non-collisiony way, as a parameter to
the parent; you could also copy $ForkBlock::CHILD_PID immediately after fork.
--- ForkBlock.pm~ Wed Dec 24 21:02:50 2008
+++ ForkBlock.pm Wed Dec 24 21:14:35 2008
@@ -40,7 +40,7 @@
FORK_IT: {
if($CHILD_PID=fork()) {
#i'm the parent
- &$parent;
+ &$parent($CHILD_PID);
}
elsif(defined($CHILD_PID)) {
#i'm the child
Also note that the prototype permits this alternate invocation:
Fork {
Parent \&manager,
Child \&worker
};
And with this patch:
--- ForkBlock.pm~ Wed Dec 24 21:14:35 2008
+++ ForkBlock.pm Thu Dec 25 02:08:18 2008
@@ -27,10 +27,10 @@
#private--implements the actual forking
sub phork {
my %params=%{shift()};
-
- my $parent=$params{"parent"};
- my $child =$params{"child"} ;
- my $error =$params{"error"} ;
+
+ my $parent=$params{parent}|| $params{Parent};
+ my $child =$params{child} || $params{Child};
+ my $error =$params{error} || $params{Error};
croak "No Child defined" unless $child;
croak "No Parent defined" unless $parent;
You can also do:
Fork {
Parent=>sub{ ... }, #The comma's important here.
Child =>sub{ ... }
};
The distinction between DumbFork and Fork seems backwards/unnecessary.
What if the exit has a condition of
if $CHILD_PID == 0 added?
Another interesting change might be an optional/default Reaper that's
invoked before the phork...
--
In Bob We Trust, All Others Bring Data.