[wiaflos-devel] COMMIT - r266 - in trunk: soap wiaflos/server
svn at linuxrulz.org
svn at linuxrulz.org
Tue Dec 30 06:23:07 GMT 2008
Author: nkukard
Date: 2008-12-30 06:23:07 +0000 (Tue, 30 Dec 2008)
New Revision: 266
Added:
trunk/wiaflos/server/jobs.pm
Modified:
trunk/soap/wiaflos-server
Log:
* Added job control to server
Modified: trunk/soap/wiaflos-server
===================================================================
--- trunk/soap/wiaflos-server 2008-12-25 07:29:26 UTC (rev 265)
+++ trunk/soap/wiaflos-server 2008-12-30 06:23:07 UTC (rev 266)
@@ -39,6 +39,7 @@
use wiaflos::server::logging;
use wiaflos::server::users;
use wiaflos::server::templating;
+use wiaflos::server::jobs;
use Auth qw();
@@ -248,26 +249,9 @@
$self->SUPER::child_init_hook();
-
- $self->log(LOG_INFO,"Loading caching engine...");
- wiaflos::server::cache::connect($self);
- $self->log(LOG_INFO,"Caching engine loaded.");
- $self->log(LOG_INFO,"Connecting to database...");
- # Init system stuff
- $self->{'client'}->{'dbh'} = wiaflos::server::dbilayer::Init($self);
- if (defined($self->{'client'}->{'dbh'})) {
- # Check if we succeeded
- if (!($self->{'client'}->{'dbh'}->connect())) {
- # If we succeeded, record OK
- $self->{'client'}->{'dbh_status'} = 0;
- $self->log(LOG_INFO,"Connected to database.");
- } else {
- $self->log(LOG_WARN,"Failed to connect to database: ".$self->{'client'}->{'dbh'}->Error());
- }
- } else {
- $self->log(LOG_WARN,"Failed to initialize: ".wiaflos::server::dbilayer::internalErr());
- }
+ # Initialize job control
+ wiaflos::server::jobs::Init($self);
}
@@ -276,10 +260,10 @@
{
my $self = shift;
- $self->SUPER::child_init_hook();
-
- $self->log(LOG_INFO,"Unloading caching engine.");
- wiaflos::server::cache::disconnect($self);
+ $self->SUPER::child_finish_hook();
+
+ # Shut down job control
+ wiaflos::server::jobs::Finish($self);
}
Added: trunk/wiaflos/server/jobs.pm
===================================================================
--- trunk/wiaflos/server/jobs.pm (rev 0)
+++ trunk/wiaflos/server/jobs.pm 2008-12-30 06:23:07 UTC (rev 266)
@@ -0,0 +1,202 @@
+# Job scheduling and control
+# Copyright (C) 2005-2007 Nigel Kukard <nkukard at lbsd.net>
+# Copyright (C) 2008, LinuxRulz
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+
+
+package wiaflos::server::jobs;
+
+use strict;
+
+# Exporter stuff
+require Exporter;
+our (@ISA, at EXPORT);
+ at ISA = qw(Exporter);
+ at EXPORT = qw(
+);
+
+use wiaflos::constants;
+use wiaflos::server::dblayer;
+use wiaflos::server::dbilayer;
+use wiaflos::server::cache;
+use wiaflos::server::logging;
+use wiaflos::server::system qw(OpenMax);
+
+
+
+# Our current error message
+my $error = "";
+
+# Set current error message
+# Args: error_message
+sub setError
+{
+ my $err = shift;
+ my ($package,$filename,$line) = caller;
+ my (undef,undef,undef,$subroutine) = caller(1);
+
+ # Set error
+ $error = "$subroutine($line): $err";
+}
+
+# Return current error message
+# Args: none
+sub Error
+{
+ my $err = $error;
+
+ # Reset error
+ $error = "";
+
+ # Return error
+ return $err;
+}
+
+
+
+# This is the server
+my $serverHandle = undef;
+# Jobs we currently handling
+my %jobs; # FIXME - this must be a shared variable
+
+
+
+
+# Initialize
+sub Init
+{
+ my $server = shift;
+
+
+ $serverHandle = $server;
+
+ _initJob();
+}
+
+
+# Finish off job control
+sub Finish
+{
+ my $server = $serverHandle;
+
+ $server->log(LOG_INFO,"[JOBS] Unloading caching engine.");
+ wiaflos::server::cache::disconnect($server);
+}
+
+
+# Init job
+sub _initJob
+{
+ my $server = $serverHandle;
+
+
+ $server->log(LOG_INFO,"[JOBS] Loading caching engine...");
+ wiaflos::server::cache::connect($server);
+ $server->log(LOG_INFO,"[JOBS] Caching engine loaded.");
+
+ $server->log(LOG_INFO,"[JOBS] Connecting to database...");
+ # Init system stuff
+ $server->{'client'}->{'dbh'} = wiaflos::server::dbilayer::Init($server);
+ if (defined($server->{'client'}->{'dbh'})) {
+ # Check if we succeeded
+ if (!($server->{'client'}->{'dbh'}->connect())) {
+ # If we succeeded, record OK
+ $server->{'client'}->{'dbh_status'} = 0;
+ $server->log(LOG_INFO,"[JOBS] Connected to database.");
+ } else {
+ $server->log(LOG_WARN,"[JOBS] Failed to connect to database: ".$server->{'client'}->{'dbh'}->Error());
+ }
+ } else {
+ $server->log(LOG_WARN,"[JOBS] Failed to initialize: ".wiaflos::server::dbilayer::internalErr());
+ }
+}
+
+
+# Background child job
+sub createJob
+{
+ $SIG{CHLD} = \&REAPER;
+
+
+ # Try fork
+ my $pid = fork();
+ if (!defined($pid)) {
+ setError("Failed to fork(): $!");
+ return ERR_SRVFORK;
+ }
+ if ($pid) {
+ # This is the parent
+ return $pid;
+
+ } else {
+ # This is the child
+ setStatus("Initializing...");
+ ## Close open file descriptors
+ foreach my $i (0, 1, 3 .. OpenMax) { POSIX::close($i); }
+
+ # Reopen stdout, stdin to /dev/null
+ open(STDIN, "+>/dev/null");
+ open(STDOUT, "+>&STDIN");
+ }
+
+
+ _initJob();
+
+ return 0;
+}
+
+
+# Set job status
+sub setStatus
+{
+ my @params = @_;
+
+
+ my $server = $serverHandle;
+
+ # Set default pid and see if we were given one
+ my $pid = $$;
+ if (@params > 1) {
+ $pid = shift;
+ }
+
+ my $txt = shift;
+ # Set job status
+ $jobs{$pid} = $txt;
+
+ $server->log(LOG_INFO,"[JOBS] Setting status of $pid: $txt");
+}
+
+
+
+
+# The grim reaper
+sub REAPER
+{
+ my $server = $serverHandle;
+
+ my $waitedpid = waitpid(-1,POSIX::WNOHANG);
+
+ delete($jobs{$waitedpid});
+
+ $server->log(LOG_INFO,"[JOBS] Child $waitedpid exiting.");
+}
+
+
+1;
+# vim: ts=4
More information about the wiaflos-devel
mailing list