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