# Copyright 2000 by Stem Systems, Inc. All rights reserved. # If you have this software as part of the prototype release, you are # not allowed to distribute any copies to anyone. This software is not # to shown to anyone else without prior permission from Stem Systems. use strict ; package Stem::Event ; use Stem::Debug ; # basic package wrappers for top level Event.pm calls. sub start_loop { $Event::DIED = \&died ; Event::loop() ; } sub died { my( $event, $err ) = @_ ; print "die '$err' called in [$event]\n", map( "<$_>", caller() ), "\n" ; exit; } ; sub end_loop { Event::unloop_all( 1) ; } sub dump { local( $,) = ' ' ; for my $w ( Event::all_watchers() ) { print "$w O ", @{$w->cb()}, "fd ", $w->fd(), "\n" ; } } sub trigger { my( $event, $object, $method, @args ) = @_ ; #print "[$event] [$object] [$method]\n" ; ################### ################### # lookup cell name from object. log it and store it ################### ################### $Stem::Event::current_object = $object ; $object->$method( @args ) ; ################### ################### # clear saved cell name and target??? ################### ################### my ( $cell_name, $target ) = Stem::Route::lookup_cell_name( $object ) ; if ( $cell_name ) { # Debug # "EVENT $event to $cell_name:$target [$object] [$method]\n" ; } else { # Debug "EVENT $event to [$object] [$method]\n" ; } Stem::Msg::process_queue() ; } ############################################################################ package Stem::Event::Plain ; =head2 Stem::Event::Plain::new This event is queued up for dispatch in the future when there no other pending events. It has these attributes which are passed into the new constructor: =over 4 =item 'object' => =item 'method' => =back =head2 Example $plain_event = Stem::Event::Plain->new( 'object' => $foo_obj ) ; =cut my $attr_spec_plain = [ { 'name' => 'object', 'required' => 1, 'type' => 'object', 'help' => < 'method', 'default' => 'triggered', 'help' => <idle( 'cb' => [ $self, 'idle_triggered' ], 'repeat' => 0 ) ; $self->{'idle_event'} = $idle_event ; return $self ; } sub idle_triggered { my( $self ) = @_ ; Stem::Event::trigger( 'plain', $self->{'object'}, $self->{'method'} ) ; $self->{'idle_event'}->cancel() ; delete( $self->{'idle_event'} ) ; } ############################################################################ package Stem::Event::Plain::Test ; sub go { print __PACKAGE__, " testing\n" ; Stem::Event::Plain->new( 'object' => bless {} ) ; Stem::Event::start_loop() ; print "end test\n" ; } # default callback method sub triggered { my( $self ) = @_ ; print "success\n" ; } ############################################################################ package Stem::Event::Signal ; =head2 Stem::Event::Signal::new This event is triggered by signals. It has these attributes which are passed into the new constructor: =over 4 =item 'object' => =item 'method' => where SIG is the lower case name of the signal =item 'signal' => =back =head2 Example $signal_event = Stem::Event::Signal->new( 'object' => $foo_obj 'signal' => 'INT' ) ; sub sigint_handler { die "SIGINT\n" } =cut my $attr_spec_signal = [ { 'name' => 'object', 'required' => 1, 'type' => 'object', 'help' => < 'signal', 'required' => 1, 'help' => < 'method', 'help' => <{'method'} = $self->{ 'method' } || "sig\L$self->{'signal'}_handler" ; # create the signal event watcher my $signal_event = Event->signal( 'cb' => [ $self, 'signal_triggered' ], 'signal' => $self->{'signal'}, ) ; $self->{'signal_event'} = $signal_event ; return $self ; } sub signal_triggered { my( $self ) = @_ ; Stem::Event::trigger( "signal $self->{'signal'}", $self->{'object'}, $self->{'method'} ) ; } sub cancel { my( $self ) = @_ ; $self->{'signal_event'}->cancel() ; delete( $self->{'signal_event'} ) ; } ############################################################################ package Stem::Event::Signal::Test ; sub go { print __PACKAGE__, " testing\n" ; Stem::Event::Signal->new( 'object' => bless({}), 'signal' => 'INT' ) ; Stem::Event::start_loop() ; print "end test\n" ; } # default callback method sub sigint_handler { my( $self, $event ) = @_ ; print "SIGINT\n" ; } ############################################################################ package Stem::Event::Timer ; =head2 Stem::Event::Timer::new This event is queued up for dispatch in the future at a given time ('at') or after a minimum time period has elapsed ('delay'). One of the two time attributes 'at' or 'delay' must be set. Here are the allowed attributes: =over 4 =item 'object' => =item 'at' => =item 'delay' =>