Daemon::Generic::Event - Generic daemon framework with Event.pm


Daemon-Generic documentation Contained in the Daemon-Generic distribution.

Index


Code Index:

NAME

Top

 Daemon::Generic::Event - Generic daemon framework with Event.pm

SYNOPSIS

Top

 use Daemon::Generic::Event;

 @ISA = qw(Daemon::Generic::Event);

 sub gd_preconfig {
	# stuff
 }

DESCRIPTION

Top

Daemon::Generic::Event is a subclass of Daemon::Generic that predefines some methods:

gd_run()

Setup a periodic callback to gd_run_body() if there is a gd_run_body(). Call Event::loop().

gd_setup_signals()

Bind SIGHUP to call gd_reconfig_event(). Bind SIGINT to call gd_quit_event().

To use Daemon::Generic::Event, you have to provide a gd_preconfig() method. It can be empty if you have a gd_run_body().

Set up your own events in gd_preconfig() and gd_postconfig().

If you have a gd_run_body() method, it will be called once per second or every gd_interval() seconds if you have a gd_interval() method. Unlike in Daemon::Generic::While1, gd_run_body() should not include a call to sleep().

THANK THE AUTHOR

Top

If you need high-speed internet services (T1, T3, OC3 etc), please send me your request-for-quote. I have access to very good pricing: you'll save money and get a great service.

LICENSE

Top

Copyright(C) 2006 David Muir Sharnoff <muir@idiom.com>. This module may be used and distributed on the same terms as Perl itself.


Daemon-Generic documentation Contained in the Daemon-Generic distribution.

# Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com>

package Daemon::Generic::Event;

use strict;
use warnings;
require Daemon::Generic;
require Event;
require Exporter;

our @ISA = qw(Daemon::Generic Exporter);
our @EXPORT = @Daemon::Generic::EXPORT;
our $VERSION = 0.3;

sub newdaemon
{
	local($Daemon::Generic::caller) = caller() || 'main';
	local($Daemon::Generic::package) = __PACKAGE__;
	Daemon::Generic::newdaemon(@_);
}

sub gd_setup_signals
{
	my $self = shift;
	my $reload_event = Event->signal(
		signal	=> 'HUP',
		desc	=> 'reload on SIGHUP',
		prio	=> 6,
		cb	=> sub { 
			$self->gd_reconfig_event; 
			$self->{gd_timer}->cancel()
				if $self->{gd_timer};
			$self->gd_setup_timer();
		},
	);
	my $quit_event = Event->signal(
		signal	=> 'INT',
		cb	=> sub { $self->gd_quit_event; },
	);
}

sub gd_setup_timer
{
	my $self = shift;
	if ($self->can('gd_run_body')) {
		my $interval = ($self->can('gd_interval') && $self->gd_interval()) || 1;
		$self->{gd_timer} = Event->timer(
			cb		=> [ $self, 'gd_run_body' ],
			interval	=> $interval,
			hard		=> 0,
		);
	}
}

sub gd_run
{
	my $self = shift;
	$self->gd_setup_timer();
	Event::loop();
}

sub gd_quit_event
{
	my $self = shift;
	print STDERR "Quitting...\n";
	Event::unloop_all();
}

1;