[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