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