The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

Name

SPVM::Go::Select - Go select Statement

Description

The Go::Select class in SPVM has methods to select a readable/writable channel.

Usage

  use Go;
  
  Go->go(method : void () {
    
    my $ch0 = Go->make;
    
    my $ch1 = Go->make;
    
    my $ch2 = Go->make;
    
    my $ch3 = Go->make;
    
    Go->go([has ch0 : Go::Channel = $ch0, has ch1 : Go::Channel = $ch1, has ch2 : Go::Channel = $ch2, has ch3 : Go::Channel = $ch3] method : void () {
      
      my $ch0 = $self->{ch0};
      
      $ch0->write(1);
      
      my $ch1 = $self->{ch1};
      
      $ch1->write(2);
      
      my $ch2 = $self->{ch2};
      
      $ch2->write(3);
      
      my $ch3 = $self->{ch3};
      
      my $ok = 0;
      
      my $value = (int)$ch3->read(\$ok);
    });
    
    my $select = Go->new_select;
    
    $select->add_read($ch2);
    
    $select->add_read($ch1);
    
    $select->add_read($ch0);
    
    $select->add_write($ch3 => 4);
    
    while (1) {
      my $result = $select->select;
      
      my $ok = $result->ok;
      
      if ($ok) {
        my $ch = $result->channel;
        
        my $is_write = $result->is_write;
        
        if ($is_write) {
          $select->remove_write($ch);
        }
        else {
          my $value = (int)$result->value;
          
          $select->remove_read($ch);
        }
      }
      
      if ($select->is_empty) {
        last;
      }
    }
    
  });
  
  Go->gosched;

Fields

non_blocking

has non_blocking : rw byte;

Set the flag if this select is non-blocking.

Instance Methods

add_read

method add_read : void ($channel : Go::Channel);

Adds a select case for reading given a channel $channel.

add_write

method add_write : void ($channel : Go::Channel, $value : object);

Adds a select case for writing given a channel $channel and a value $value.

remove_read

method remove_read : void ($channel : Go::Channel);

Removes a corresponding select case for reading given a channel $channel.

remove_write

method remove_write : void ($channel : Go::Channel);

Removes a corresponding select case for reading given a channel $channel.

select

method select : Go::Select::Result ();

Selects a channel and returns its result.

A readable or writable channel is randomly selected.

If no channels are readable or writable, the goroutine waits until a readable or writable channel is selected.

If the "non_blocking" field is set to non-zero and no channels are readable or writable, returns undef.

is_empty

method is_empty : int ();

If the count of the select cases is 0, returns 1. Otherwise returns 0.

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License