Viewing File: /usr/local/cpanel/3rdparty/perl/536/cpanel-lib/Net/Curl/Promiser/Backend/Mojo.pm

package Net::Curl::Promiser::Backend::Mojo;

use strict;
use warnings;

use parent 'Net::Curl::Promiser::Backend::LoopBase';

use Net::Curl::Multi ();

use Mojo::IOLoop ();
use Mojo::Promise ();

use Net::Curl::Promiser::FDFHStore ();

use constant PROMISE_CLASS => 'Mojo::Promise';

sub new {
    my ($class, $loop) = @_;

    my $self = $class->SUPER::new();

    $self->{'_fhstore'} = Net::Curl::Promiser::FDFHStore->new();

    return $self;
}

#----------------------------------------------------------------------

sub SET_TIMER {
    my ($self, $multi, $timeout_ms) = @_;

    $self->{onetimer} = Mojo::IOLoop->timer(
        $timeout_ms / 1000,
        sub {
            $self->time_out($multi);
        },
    );
}

sub CLEAR_TIMER {
    my ($ot) = delete $_[0]->{'onetimer'};
    Mojo::IOLoop->remove($ot) if $ot;
}

sub _io {
    my ($self, $fd, $multi, $read_yn, $write_yn) = @_;

    my $socket = $self->{'_watched_sockets'}{$fd} ||= do {
        my $s = $self->{'_fhstore'}->get_fh($fd);

        Mojo::IOLoop->singleton->reactor->io(
            $s,
            sub {
                $self->process(
                    $multi,
                    [ $fd, $_[1] ? Net::Curl::Multi::CURL_CSELECT_OUT() : Net::Curl::Multi::CURL_CSELECT_IN() ],
                );
            },
        );

        $s;
    };

    Mojo::IOLoop->singleton->reactor->watch(
        $socket,
        $read_yn,
        $write_yn,
    );

    return;
}

sub SET_POLL_IN {
    my ($self, $fd, $multi) = @_;

    $self->_io( $fd, $multi, 1, 0 );

    return;
}

sub SET_POLL_OUT {
    my ($self, $fd, $multi) = @_;

    $self->_io( $fd, $multi, 0, 1 );

    return;
}

sub SET_POLL_INOUT {
    my ($self, $fd, $multi) = @_;

    $self->_io( $fd, $multi, 1, 1 );

    return;
}

sub STOP_POLL {
    my ($self, $fd) = @_;

    if (my $socket = delete $self->{'_watched_sockets'}{$fd}) {
        Mojo::IOLoop->remove($socket);
    }

    return;
}

1;
Back to Directory File Manager