On Mon, Oct 16, 2000 at 03:28:42PM -0500, [EMAIL PROTECTED] 
wrote:
> I am spending most of my time deciphering the terminology and  
> corresponding function calls.
> 
> Here is my project:
> 
> Create a server deamon that waits for a client to connect and  
> submit configuration data to fire off a process.  There is a limited
> number of resources, so queueing and resource management is  
> a must.  Once queueing and resource management is handled,  
> a job is forked off and the system waits for the child to die to  
> know that those resources are now available.   
> 
> The problem lies in that perl's sigchld handling isn't reliable, due  
> to the unavailablity of asyncronous non-blocking I/O.  Event.pm  
> supposedly can take care of this.

Yes,

use POSIX ":sys_wait_h";
Event->signal(signal => 'CHLD', cb => sub {
                  my ($e) = @_;
                  # warn "CHLD ".$e->hits;
                  for (my $h=0; $h < $e->hits; $h++) {
                      my $died = waitpid(-1,&WNOHANG);
                      # process it
                  }
              });

> My understanding so far-
> 
> Start an Event loop w/ a watcher and given parameters and when  
> a change to the filehandle occurs, the callback is invoked.  The  
> main routine can interact w/ the Event loop w/ varies functions  
> such as: unloop/sweep, etc.
> 
> I don't know what Event thingies I should do in this situation.  I'll
> gladly write-up an example chapter once I get it figured out.
> 
> I think my code will look something like:
> 
> use Event qw(loop, unloop)

Remove comma.

> $server = IO::Socket::INET->new ( blah)

Yes, see NetServer::Portal::Top for a code example.

> $w=Event->io(fd=>\$server, poll=>'r' , cb=\&handle_client)
> loop;
> 
> $sig_watch=Event->signal(signal=>'chld', async=>1, cb=\&chld_mangler)

Why async=>1?

> loop;

Only loop() once.  ;-)

> sub child_mangler
> {
>     while(something)
>     {
>        $pid=waitpid(-1, non-blocking-option)
>        delete_pid_from_queue($pid)
>        num_kids--;
>    }
> }

Yup.

> sub handle_client
> {
>       read config info;
>       resource_manager;
>       create_process;
> }       
> sub  create_process;
> {
>       if # of kids <= $max_num_kids
>       {
>          add_pid_to_queue
>          fork;  # do job
>       }
> }
> 
> I didn't include some of the other sub routines, but this is the main idea.
> 
> 
> Am I heading in the right direction?

Yes.  :-)

-- 
Never ascribe to malice that which can be explained by stupidity.
                       (via, but not speaking for Deutsche Bank)

Reply via email to