File Coverage

blib/lib/SysV/SharedMem.pm
Criterion Covered Total %
statement 32 32 100.0
branch 5 8 62.5
condition 3 6 50.0
subroutine 9 9 100.0
pod 1 1 100.0
total 50 56 89.2


line stmt bran cond sub pod time code
1             package SysV::SharedMem;
2             {
3             $SysV::SharedMem::VERSION = '0.010';
4             }
5              
6 2     2   1336 use 5.008;
  2         6  
  2         79  
7 2     2   10 use strict;
  2         3  
  2         60  
8 2     2   10 use warnings FATAL => 'all';
  2         3  
  2         94  
9              
10 2     2   9 use Carp qw/croak/;
  2         4  
  2         143  
11 2     2   1724 use IPC::SysV qw/ftok IPC_PRIVATE IPC_CREAT SHM_RDONLY/;
  2         6177  
  2         456  
12 2     2   2585 use Sub::Exporter::Progressive -setup => { exports => [qw/shared_open shared_remove shared_stat shared_chmod shared_chown shared_detach shared_identifier/] };
  2         2733  
  2         25  
13              
14 2     2   272 use XSLoader;
  2         5  
  2         787  
15              
16             XSLoader::load(__PACKAGE__, __PACKAGE__->VERSION);
17              
18             my %get_flags_for = (
19             '<' => 0,
20             '+<' => 0,
21             '>' => 0 | IPC_CREAT,
22             '+>' => 0 | IPC_CREAT,
23             );
24              
25             my %at_flags_for = (
26             '<' => SHM_RDONLY,
27             '+<' => 0,
28             '>' => 0,
29             '+>' => 0,
30             );
31              
32             ## no critic (RequireArgUnpacking)
33              
34             sub _get_key {
35 8     8   26 my ($filename, $mode, %options) = @_;
36 8 50       24 return $options{key} if defined $options{key};
37 8 100 66     406 return ftok($filename, $options{proj_id}) || croak "Invalid filename for shared memory segment: $!" if defined $filename;
38 5         41 return IPC_PRIVATE;
39             }
40              
41             sub shared_open {
42 8     8 1 11936 my (undef, $filename, $mode, %other) = @_;
43 8         44 my %options = (
44             offset => 0,
45             proj_id => 1,
46             perms => oct 600,
47             size => 0,
48             %other,
49             );
50 8 50       25 $mode = '<' if not defined $mode;
51 8 50       28 croak 'No such mode' if not exists $at_flags_for{$mode};
52 8   33     31 my $id = $options{id} || do {
53             my $key = _get_key($filename, $mode, %options);
54             croak 'Zero length specified for shared memory segment' if $options{size} == 0 && ($get_flags_for{$mode} & IPC_CREAT || $key == IPC_PRIVATE);
55             shmget $key, $options{size}, $get_flags_for{$mode} | $options{perms} or croak "Can't open shared memory object: $!";
56             };
57              
58 4         72 _shmat($_[0], $id, @options{qw/offset size/}, $at_flags_for{$mode});
59 4         17 return;
60             }
61              
62             1; # End of SysV::SharedMem
63              
64             # ABSTRACT: SysV Shared memory made easy
65              
66             __END__