Author: spadkins
Date: Tue Mar 21 09:45:08 2006
New Revision: 3705

Modified:
   p5ee/trunk/App-Context/lib/App/Context.pm

Log:
add response(), renew_process_resources(), fork()

Modified: p5ee/trunk/App-Context/lib/App/Context.pm
==============================================================================
--- p5ee/trunk/App-Context/lib/App/Context.pm   (original)
+++ p5ee/trunk/App-Context/lib/App/Context.pm   Tue Mar 21 09:45:08 2006
@@ -2014,6 +2014,91 @@
     &App::sub_exit() if ($App::trace);
 }
 
+=head2 fork()
+
+    * Signature: $pid = $self->fork()
+    * Param:     void
+    * Return:    $pid     integer
+    * Throws:    App::Exception
+    * Since:     0.01
+
+    Sample Usage: 
+
+    $self->fork();
+
+The fork() method is called in a child process just after
+it has been fork()ed.
+This causes connections to databases, etc. to be closed gracefully and new
+connections to be created if necessary.
+
+Call this after a fork() in the child process.
+It will renew the resources which cannot be shared between a parent and 
+a child process. 
+
+Currently, this is primarily for database connections.
+For most databases, the child needs its own connection.
+
+=cut
+
+sub fork {
+    &App::sub_entry if ($App::trace);
+    my ($self) = @_;
+    my $pid = fork();
+    if (!$pid) {  # in the child process
+        $self->renew_process_resources();
+    }
+    &App::sub_exit($pid) if ($App::trace);
+    return($pid);
+}
+
+#############################################################################
+# renew_process_resources()
+#############################################################################
+
+=head2 renew_process_resources()
+
+    * Signature: $self->renew_process_resources()
+    * Param:     void
+    * Return:    void
+    * Throws:    App::Exception
+    * Since:     0.01
+
+    Sample Usage: 
+
+    $self->renew_process_resources();
+
+The renew_process_resources() method is called in a child process just after
+it has been fork()ed.
+This causes connections to databases, etc. to be closed gracefully and new
+connections to be created if necessary.
+
+Call this after a fork() in the child process.
+It will renew the resources which cannot be shared between a parent and 
+a child process. 
+
+Currently, this is primarily for database connections.
+For most databases, the child needs its own connection.
+
+=cut
+
+sub renew_process_resources {
+    my $self = shift;
+    my ($conf, $repdef, $repname, $instance);
+    my ($class, $method, $args, $argidx, $repcache);
+
+    $self->dbgprint("Context->renew_process_resources()")
+        if ($App::DEBUG && $self->dbg(1));
+
+    $repcache = $self->{session}{cache}{Repository};
+    if (defined $repcache && ref($repcache) eq "HASH") {
+        foreach $repname (keys %$repcache) {
+            $instance = $repcache->{$repname};
+            $instance->_renew_process_resources();
+            delete $repcache->{$repname};
+        }
+    }
+}
+
 #############################################################################
 # shutdown()
 #############################################################################
@@ -2057,5 +2142,49 @@
     }
 }
 
+#############################################################################
+# response()
+#############################################################################
+
+=head2 response()
+
+    * Signature: $context->response()
+    * Param:     void
+    * Return:    void
+    * Throws:    App::Exception
+    * Since:     0.01
+
+    Sample Usage: 
+
+    $context->response();
+
+The response() method gets the current Response being handled in the Context.
+
+=cut
+
+sub response {
+    &App::sub_entry if ($App::trace);
+    my $self = shift;
+
+    my $response = $self->{response};
+    if (!defined $response) {
+
+        #################################################################
+        # RESPONSE
+        #################################################################
+
+        my $response_class = $self->get_option("response_class", 
"App::Response");
+
+        eval {
+            $response = App->new($response_class, "new", $self, 
$self->{options});
+        };
+        $self->{response} = $response;
+        $self->add_message("Context::response(): $@") if ($@);
+    }
+
+    &App::sub_exit($response) if ($App::trace);
+    return($response);
+}
+
 1;
 

Reply via email to