It turns out the restarter didn't really work on Win32. This checkin
[catagits/Catalyst-Devel.git] / lib / Catalyst / Restarter / Forking.pm
diff --git a/lib/Catalyst/Restarter/Forking.pm b/lib/Catalyst/Restarter/Forking.pm
new file mode 100644 (file)
index 0000000..3c136f4
--- /dev/null
@@ -0,0 +1,39 @@
+package Catalyst::Restarter::Forking;
+
+use Moose;
+
+use threads;
+use Thread::Cancel;
+
+extends 'Catalyst::Restarter';
+
+has _child => (
+    is  => 'rw',
+    isa => 'Int',
+);
+
+
+sub _fork_and_start {
+    my $self = shift;
+
+    if ( my $pid = fork ) {
+        $self->_child($pid);
+    }
+    else {
+        $self->start_sub->();
+    }
+}
+
+sub _kill_child {
+    my $self = shift;
+
+    return unless $self->_child;
+
+    return unless kill 0, $self->_child;
+
+    local $SIG{CHLD} = 'IGNORE';
+    die "Cannot send INT signal to ", $self->_child, ": $!"
+        unless kill 'INT', $self->_child;
+}
+
+1;