内容

名称

Test2::IPC::Driver - Test2 IPC 驱动程序的基类。

概要

package Test2::IPC::Driver::MyDriver;

use base 'Test2::IPC::Driver';

...

方法

$self->abort($msg)

如果 IPC 遇到致命错误,它应该使用此方法。 这将把消息打印到 STDERR,并在其前面加上 'IPC Fatal Error: ',然后强制退出 255。 IPC 错误可能发生在主线程或进程之外的线程或进程中,此方法提供了让测试程序注意到错误的最佳机会。

$self->abort_trace($msg)

这与 $ipc->abort($msg) 相同,只是它使用 Carp::longmess 在消息中添加堆栈跟踪。

加载驱动程序

Test2::IPC::Driver 有一个 import() 方法。所有驱动程序都继承了这个导入方法。这个导入方法注册驱动程序。

在大多数情况下,您只需要加载所需的 IPC 驱动程序即可使其工作。您应该尽早加载此驱动程序。如果您加载得太晚而无法生效,则会发出警告。

use Test2::IPC::Driver::MyDriver;
...

编写驱动程序

package Test2::IPC::Driver::MyDriver;
use strict;
use warnings;

use base 'Test2::IPC::Driver';

sub is_viable {
    return 0 if $^O eq 'win32'; # Will not work on windows.
    return 1;
}

sub add_hub {
    my $self = shift;
    my ($hid) = @_;

    ... # Make it possible to contact the hub
}

sub drop_hub {
    my $self = shift;
    my ($hid) = @_;

    ... # Nothing should try to reach the hub anymore.
}

sub send {
    my $self = shift;
    my ($hid, $e, $global) = @_;

    ... # Send the event to the proper hub.

    # This may notify other procs/threads that there is a pending event.
    Test2::API::test2_ipc_set_pending($uniq_val);
}

sub cull {
    my $self = shift;
    my ($hid) = @_;

    my @events = ...; # Here is where you get the events for the hub

    return @events;
}

sub waiting {
    my $self = shift;

    ... # Notify all listening procs and threads that the main
    ... # process/thread is waiting for them to finish.
}

1;

子类必须实现的方法

$ipc->is_viable

如果驱动程序在当前环境中有效,则应返回 true。如果无效,则应返回 false。这是一个类方法。

$ipc->add_hub($hid)

这用于提醒驱动程序一个新的集线器正在等待事件。驱动程序应跟踪进程和线程 ID,集线器只能由启动它的进程+线程删除。

sub add_hub {
    my $self = shift;
    my ($hid) = @_;

    ... # Make it possible to contact the hub
}
$ipc->drop_hub($hid)

这用于提醒驱动程序集线器不再接受事件。驱动程序应跟踪进程和线程 ID,集线器只能由启动它的进程+线程删除(这是驱动程序强制执行的责任)。

sub drop_hub {
    my $self = shift;
    my ($hid) = @_;

    ... # Nothing should try to reach the hub anymore.
}
$ipc->send($hid, $event);
$ipc->send($hid, $event, $global);

用于从当前进程/线程向其进程+线程中的指定集线器发送事件。

sub send {
    my $self = shift;
    my ($hid, $e) = @_;

    ... # Send the event to the proper hub.

    # This may notify other procs/threads that there is a pending event.
    Test2::API::test2_ipc_set_pending($uniq_val);
}

如果 $global 为 true,则驱动程序应将事件发送到所有进程和线程中的所有集线器。

@events = $ipc->cull($hid)

用于收集已发送到指定集线器的事件。

sub cull {
    my $self = shift;
    my ($hid) = @_;

    my @events = ...; # Here is where you get the events for the hub

    return @events;
}
$ipc->waiting()

当父进程完成并等待所有子进程和线程完成时,将在父进程中调用此方法。

sub waiting {
    my $self = shift;

    ... # Notify all listening procs and threads that the main
    ... # process/thread is waiting for them to finish.
}

子类可以实现或覆盖的方法

$ipc->driver_abort($msg)

这是一个由 Test2::IPC::Driver->abort() 调用的钩子。这是您在发生中止时进行清理的机会。您无法阻止中止,但可以优雅地接受它。

SOURCE

Test2 的源代码仓库位于 http://github.com/Test-More/test-more/

MAINTAINERS

Chad Granum <[email protected]>

AUTHORS

Chad Granum <[email protected]>

COPYRIGHT

版权所有 2020 Chad Granum <[email protected]>。

本程序是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。

参见 https://dev.perl5.cn/licenses/