Carrot

 view release on metacpan or  search on metacpan

lib/Carrot/Continuity/Coordination/Episode/Paragraph/FDx2_IO.pm  view on Meta::CPAN

# //parameters
# //returns
{
	my ($this) = @ARGUMENTS;

	return if ($this->[ATR_OBUF_STATE] == BST_CLOSED); # no point
	if (length($this->[ATR_OBUF]) == 0) { # $n == 0 indicates eof

		$this->[ATR_TARGET_OUT]->fd_ignore_write;
		$this->[ATR_PROTOCOL]->evt_fdx2_io_pending_output(IS_FALSE);
		return;
	}

	WRITE: {
		my $n = syswrite(
			$this->[ATR_FD_OUT],
			$this->[ATR_OBUF],
			$syswrite_size);
		unless (defined($n))
		{
#FIXME: log $OS_ERROR
			return if ($this->is_temporary_error());
			$this->destructor;
			return;
		};
		if ($n == 0) { # eof
			$this->destructor;
			return;
		}
		substr($this->[ATR_OBUF], 0, $n, '');
	}

	if (length($this->[ATR_OBUF]) == 0)
	{
		$this->[ATR_TARGET_OUT]->fd_ignore_write;
		$this->[ATR_OBUF_STATE] = BST_IDLE;
		$this->[ATR_PROTOCOL]->evt_fdx2_io_pending_output(IS_FALSE);
	}
	return;
}



sub is_temporary_error
# /type method
# /effect ""
# //parameters
# //returns
#	::Personality::Abstract::Boolean
{
	if (($OS_ERROR == EAGAIN)
	or ($OS_ERROR == EINTR)
	or ($OS_ERROR == EINPROGRESS)
	or ($OS_ERROR == ENOMEM)) {
		return(IS_TRUE);
	}
	return(IS_FALSE);
}


sub is_alive
# /type method
# /effect ""
# //parameters
# //returns
#	::Personality::Abstract::Boolean
{
	return(IS_TRUE);
} # FIXME


sub attribute_destruction
# /type method
# /effect "Destructs the attributes of an instance (breaks circular references)"
# //parameters
# //returns
{
	my ($this) = @ARGUMENTS;

	$this->[ATR_TARGET_IN]->deactivate;
	$this->[ATR_TARGET_OUT]->deactivate;

#	my $fd = fileno($this->[ATR_SOCKET]);
#	POSIX::close($fd) || warn("FD$fd: close: $OS_ERROR");

	$this->[ATR_PROTOCOL]->evt_fdx2_io_drop;
	return;
}


sub set_bst_in_closed
# /type method
# /effect ""
# //parameters
# //returns
{
	$_[THIS][ATR_IBUF_STATE] = BST_CLOSED;
	$_[THIS][ATR_TARGET_IN]->fd_ignore_read;
	return;
}

sub set_bst_out_closed
# /type method
# /effect ""
# //parameters
# //returns
{
	$_[THIS][ATR_OBUF_STATE] = BST_CLOSED;
	$_[THIS][ATR_TARGET_OUT]->fd_ignore_write;
	return;
}

sub DESTROY
# /type method
# /effect ""
# //parameters
# //returns
{
	foreach my $attribute (ATR_TARGET_IN, ATR_TARGET_OUT)
	{
		if (defined($_[THIS][$attribute]))



( run in 1.250 second using v1.01-cache-2.11-cpan-e93a5daba3e )