X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FIPC%2FMorseSignals%2FEmitter.pm;h=ae7afdaccbe21687cba47d7dce6e716054e5d5a4;hb=042406e3ab0710d6691b95bb344cbb37453d8fdb;hp=99fa22fc338cfc82a59154d44a9f5620cf9fc7c3;hpb=ddcc7c395d570f0ea20a8e9a242fcbfcc0e49522;p=perl%2Fmodules%2FIPC-MorseSignals.git diff --git a/lib/IPC/MorseSignals/Emitter.pm b/lib/IPC/MorseSignals/Emitter.pm index 99fa22f..ae7afda 100644 --- a/lib/IPC/MorseSignals/Emitter.pm +++ b/lib/IPC/MorseSignals/Emitter.pm @@ -16,23 +16,23 @@ IPC::MorseSignals::Emitter - Base class for IPC::MorseSignals emitters. =head1 VERSION -Version 0.10 +Version 0.16 =cut -our $VERSION = '0.10'; +our $VERSION = '0.16'; =head1 SYNOPSIS use IPC::MorseSignals::Emitter; - my $deuce = new IPC::MorseSignals::Emitter speed => 1024; + my $deuce = IPC::MorseSignals::Emitter->new(speed => 1024); $deuce->post('HLAGH') for 1 .. 3; $deuce->send($pid); =head1 DESCRIPTION -This module sends messages processed by a L emitter to another process as C (for bits 0) and C (for 1) signals. +This module sends messages processed by an underlying L emitter to another process as a sequence of C (for bits 0) and C (for 1) signals. =cut @@ -43,9 +43,15 @@ sub _check_self { =head1 METHODS -=head2 C<< new < delay => $seconds, speed => $bauds, %bme_options > >> +=head2 C -Creates a new emitter object. C specifies the delay between two sends, in seconds, while C is the number of bits sent per second. The delay value has priority over the speed. Extra arguments are passed to L. + my $ime = IPC::MorseSignals::Emitter->new( + delay => $seconds, + speed => $bauds, + %bme_options, + ); + +Creates a new emitter object. C specifies the delay between two sends, in seconds, while C is the number of bits sent per second. The delay value has priority over the speed. Default delay is 1 second. Extra arguments are passed to L. =cut @@ -66,9 +72,11 @@ sub new { bless $self, $class; } -=head2 C +=head2 C + + $ime->send($pid); -Sends messages enqueued with L to the process C<$pid> (or to all the C<@$pid> if C<$pid> is an array reference). +Sends messages enqueued with L to the process C<$pid> (or to all the C<@$pid> if C<$pid> is an array reference, in which case duplicated targets are stripped off). =cut @@ -76,18 +84,23 @@ sub send { my ($self, $dest) = @_; _check_self($self); return unless defined $dest; - my @dests = grep $_ > 0, ref $dest eq 'ARRAY' ? map int, grep defined, @$dest - : int $dest; + my %count; + my @dests = grep $_ > 0 && !$count{$_}++, # Remove duplicates. + ref $dest eq 'ARRAY' ? map int, grep defined, @$dest + : int $dest; + return unless @dests; while (defined(my $bit = $self->pop)) { my @sigs = (SIGUSR1, SIGUSR2); my $d = $self->{delay} * 1_000_000; $d -= usleep $d while $d > 0; kill $sigs[$bit] => @dests; } - return unless @dests; } -=head2 C<< delay < $seconds > >> +=head2 C + + my $delay = $ime->delay; + $ime->delay($seconds); Returns the current delay in seconds, or set it if an argument is provided. @@ -100,7 +113,10 @@ sub delay { return $self->{delay}; } -=head2 C<< speed < $bauds > >> +=head2 C + + my $speed = $ime->speed; + $ime->speed($bauds); Returns the current speed in bauds, or set it if an argument is provided. @@ -141,7 +157,7 @@ For truly useful IPC, search for shared memory, pipes and semaphores. Vincent Pit, C<< >>, L. -You can contact me by mail or on #perl @ FreeNode (vincent or Prof_Vince). +You can contact me by mail or on C (vincent). =head1 BUGS @@ -155,7 +171,7 @@ You can find documentation for this module with the perldoc command. =head1 COPYRIGHT & LICENSE -Copyright 2007-2008 Vincent Pit, all rights reserved. +Copyright 2007,2008,2013 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.