#!/usr/bin/perl -wT
# this is a short example that illustrates use of Proc::NiceSleep

# Copyright (c) 2002-2004 Josh Rabinowitz, All rights reserved
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.

use strict; 

use Proc::NiceSleep qw(:all);
eval ('require Sys::CpuLoad');
if($@) { die "Sys::CpuLoad required for Proc::NiceSleep::max_load() to work"; }

print "Using Proc::NiceSleep v$Proc::NiceSleep::VERSION\n";

# Proc::NiceSleep does not _require_ Sys::CpuLoad, but 
# the max_load() option will have no effect if it is not found.
# So we go ahead and use it for illustrative purposes in this script.  

nice(5);	# lower our priority if possible
print "-----------------------------------------------\n";
print "-- Informational Data About Proc::NiceSleep: --\n";
print Proc::NiceSleep::DumpText(); # show what went on inside 
test_load();
print "-----------------------------------------------\n";
print "-- Informational Data About Proc::NiceSleep: --\n";
print Proc::NiceSleep::DumpText(); # show what went on inside 
exit(0);	# we're all finished here for now

## now, test load feature... this might not work
# if the system is being used by other processes, but
# you can get the idea here...  
sub test_load {
	my ($load1, $load5, $load15) = Sys::CpuLoad::load();
	$load1 ||= 0;
	my $new_max_load = sprintf("%.2f", $load1 + 0.01);
	show_message("Setting max_load to $new_max_load");
	max_load($new_max_load);
	sleep_factor(0);
	my $t1 = Proc::NiceSleep::time();
	my $lastshowtime = 0;
	while(Proc::NiceSleep::time() - $t1 < 10) {	# for up to 10 seconds...	
		my $t2 = Proc::NiceSleep::time();
		my ($load, $load5, $load15) = Sys::CpuLoad::load();
		show_message("Working...  load is " . sprintf("%.2f",  $load) . "." );
		while(Proc::NiceSleep::time() - $t2 < 1) {	# for one second...
			for (my $i=0; $i < 1000; $i++) { my $b = $i + $i; }	# work!
		}
		($load) = Sys::CpuLoad::load();
		#if (my $l = maybe_sleep()) {
		{ 
			my $l = maybe_sleep();
			show_message("Slept " . sprintf("%1.1f", $l) . 
				"s, load is " . sprintf("%.2f",  $load) . "." );
		}
	} 
}

########## UTILITY FUNCTIONS BELOW ################
sub show_message { 
	my $message = shift; 
	printf("%-30s %s\n", $message, scalar(localtime(time())));
}


