File Coverage

blib/lib/IPC/Manager/Client/UnixSocket.pm
Criterion Covered Total %
statement 61 69 88.4
branch 6 14 42.8
condition 3 5 60.0
subroutine 17 19 89.4
pod 7 10 70.0
total 94 117 80.3


line stmt bran cond sub pod time code
1             package IPC::Manager::Client::UnixSocket;
2 1     1   7 use strict;
  1         2  
  1         39  
3 1     1   5 use warnings;
  1         2  
  1         68  
4              
5             our $VERSION = '0.000005';
6              
7 1     1   5 use File::Spec;
  1         2  
  1         33  
8 1     1   21 use Carp qw/croak/;
  1         2  
  1         82  
9 1     1   668 use POSIX qw/mkfifo/;
  1         8361  
  1         7  
10 1     1   2263 use IO::Socket::UNIX qw/SOCK_DGRAM/;
  1         4  
  1         19  
11 1     1   416 use IO::Select;
  1         3  
  1         59  
12              
13 1     1   8 use parent 'IPC::Manager::Base::FS::Handle';
  1         1  
  1         10  
14 1         6 use Object::HashBase qw{
15             +buffer
16             +socket
17             +socket_cache
18 1     1   67 };
  1         2  
19              
20 29     29 1 589 sub check_path { -S $_[1] }
21 4     4 1 12 sub path_type { 'UNIX Socket' }
22              
23 4     4 0 18 sub handles_for_select { $_[0]->{+SOCKET} }
24              
25 0     0 1 0 sub suspend { croak "suspend is not supported by the UnixSocket driver" }
26              
27             sub make_path {
28 4     4 1 8 my $self = shift;
29 4         27 my $path = $self->path;
30              
31 4 50       48 my $s = IO::Socket::UNIX->new(
32             Type => SOCK_DGRAM,
33             Local => $path,
34             Blocking => 0,
35             ) or die "Cannot create reader socket: $!";
36              
37 4         1656 $self->{+SOCKET} = $s;
38             }
39              
40             sub pre_disconnect_hook {
41 4     4 1 7 my $self = shift;
42 4 50       271 unlink($self->{+PATH}) or warn "Could not unlink socket: $!";
43             }
44              
45             sub init {
46 4     4 0 115 my $self = shift;
47              
48 4   50     74 $self->{+BUFFER} //= [];
49              
50 4         22 $self->SUPER::init();
51             }
52              
53             sub fill_buffer {
54 0     0 0 0 my $self = shift;
55              
56 0         0 my $s = $self->{+SOCKET};
57 0         0 while (my $msg = <$s>) {
58 0         0 push @{$self->{+BUFFER}} => $msg;
  0         0  
59             }
60              
61 0 0       0 return @{$self->{+BUFFER}} ? 1 : 0;
  0         0  
62             }
63              
64             sub get_messages {
65 15     15 1 16105 my $self = shift;
66              
67 15         31 my @out;
68              
69 15         80 push @out => $self->read_resume_file;
70 15         36 push @out => @{$self->{+BUFFER}};
  15         36  
71              
72 15         34 my $s = $self->{+SOCKET};
73 15         283 while (my $msg = <$s>) {
74 13         68 $msg = IPC::Manager::Message->new($self->{+SERIALIZER}->deserialize($msg));
75 13         128 push @out => $msg;
76 13         172 $self->{+STATS}->{read}->{$msg->{from}}++;
77             }
78              
79 15         49 @{$self->{+BUFFER}} = ();
  15         41  
80              
81 15         128 return sort { $a->stamp <=> $b->stamp } @out;
  3         63  
82             }
83              
84             sub send_message {
85 13     13 1 1082 my $self = shift;
86 13         52 my $msg = $self->build_message(@_);
87              
88 13 50       160 my $peer_id = $msg->to or croak "No peer specified";
89              
90 13         54 $self->pid_check;
91 13 50       69 my $sock = $self->peer_exists($peer_id) or die "'$peer_id' is not a valid message recipient";
92              
93 13 50 66     117 my $s = $self->{+SOCKET_CACHE}->{$sock} //= IO::Socket::UNIX->new(
94             Type => SOCK_DGRAM,
95             Peer => $sock,
96             ) or die "Cannot connect to socket: $!";
97              
98 13 50       1774 $s->send($self->{+SERIALIZER}->serialize($msg) . "\n") or die "Cannot send message: $!";
99              
100 13         660 $self->{+STATS}->{sent}->{$msg->{to}}++;
101             }
102              
103             1;
104              
105             __END__