File Coverage

blib/lib/IPC/Mmap/Share.pm
Criterion Covered Total %
statement 30 76 39.4
branch 5 66 7.5
condition 1 3 33.3
subroutine 10 19 52.6
pod 5 10 50.0
total 51 174 29.3


line stmt bran cond sub pod time code
1             package IPC::Mmap::Share;
2              
3 1     1   25010 use warnings;
  1         4  
  1         35  
4 1     1   6 use strict;
  1         3  
  1         40  
5 1     1   6 use Carp;
  1         8  
  1         291  
6 1     1   1256 use Data::Dumper;
  1         11161  
  1         83  
7 1     1   856 use IPC::Mmap;
  1         31742  
  1         83  
8 1     1   1173701 use Storable qw(freeze thaw);
  1         4191  
  1         89  
9              
10 1     1   9 use base qw(Exporter);
  1         2  
  1         108  
11              
12             BEGIN {
13 1     1   1219 our $VERSION = 0.03;
14             }
15              
16             my $DEBUG = 0;
17              
18             sub new {
19 1 50   1 1 17 my $self = shift(@_) or croak "Error!..I do not even know who I am!..";
20 1   33     7 my $class = ref($self) || $self;
21 1 50       4 my $size = shift(@_) or croak "Incorrect call to new";
22 1 50       53 open(my $FILE,"<","/dev/zero") || die $!;
23 1         5 my $mmap = create_mmap($size);
24 0         0 return bless { mmap => $mmap , size => $size },$class;
25             }
26              
27             sub create_mmap {
28 1 50   1 0 5 my $size = shift(@_) or die "Internal error!..Size was not passed to create_mmap";
29 1 50       28 open(my $FILE,"<","/dev/zero") || croak $!;
30 1 0       7 my $mmap = IPC::Mmap->new($FILE, $size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS) or croak $!;
31 0           return $mmap;
32             }
33              
34             sub set_mmap {
35 0 0   0 0   my $self = shift(@_) or croak "Error...set_mmap is a method call";
36 0 0         my $mmap = shift(@_) or croak "Error...incorrect call to set_mmap...expected an argument";
37 0           $self->{mmap} = $mmap;
38             }
39            
40             sub get_mmap {
41 0 0   0 0   my $self = shift(@_) or croak "Error...get_mmap is a method call";
42 0           return $self->{mmap};
43             }
44              
45             sub get_size {
46 0 0   0 0   my $self = shift(@_) or croak "Error...get_size is a method call";
47 0           return $self->{size};
48             }
49              
50             sub set {
51 0     0 1   my $self = shift(@_);
52 0 0         my $var = shift(@_) or croak "Error...You passed no argument or undef to set method";
53              
54 0           my $var_ref = \$var; #saying $var=\$var would create a circular reference, caution!!
55              
56 0 0         my $serialized = freeze($var_ref) or croak "Internal error...freeze failed...";
57              
58             #check that the structure fits the mmaped area...
59 0 0         croak "Error...you cannot store a structure that is bigger than the size you have allocated in new. Please go back and try an allocation size of at least ".length($serialized)."\n" if (length($serialized) > $self->get_size);
60            
61 0 0         $DEBUG&&print STDERR "Size is ",length($serialized),"\n";
62 0           my $mmap = $self->get_mmap();
63 0           my $size = $self->get_size();
64 0 0         $mmap->lock() || croak "Internal error...lock failed";
65 0 0         $mmap->write($serialized,0,$size) || croak "Internal error...write failed";
66 0 0         $mmap->unlock() || croak "Internal error...unlock failed";
67             }
68              
69              
70             sub get {
71 0     0 1   my $self = shift(@_);
72 0           my $mmap = $self->get_mmap();
73 0           my $size = $self->get_size();
74 0           my $unserialized;
75 0 0         $mmap->lock() || croak "Internal error...lock failed";
76 0 0         $mmap->read($unserialized,0,$size) || croak "Internal error...read failed";
77 0 0         $mmap->unlock() || croak "Internal error...unlock failed";
78 0 0         my $var_ref = thaw($unserialized) or croak "Error...Unfreezing returned an undefined value...";
79 0           return ${$var_ref};
  0            
80             }
81              
82             sub lock {
83 0 0   0 1   my $self = shift(@_) or croak "I could not shift the reference to my self";
84 0 0         my $mmap = $self->get_mmap() or croak "Failed to retrieve mmap object";
85 0 0         $mmap->lock() || croak "Internal error...lock failed";
86 0           $self->{locked} = 1;
87             }
88              
89              
90             sub unlock {
91 0 0   0 1   my $self = shift(@_) or croak "I could not shift the reference to my self";
92 0 0         my $mmap = $self->get_mmap() or croak "Failed to retrieve mmap object";
93 0 0         $mmap->unlock() || croak "Internal error...lock failed";
94 0           $self->{locked} = 0;
95             }
96              
97             sub is_locked {
98 0 0   0 0   my $self = shift(@_) or croak "I could not shift the reference to my self";
99 0 0         return 1 if ($self->{locked} == 1);
100 0           return;
101             }
102              
103             sub DESTROY {
104 0 0   0     my $self = shift(@_) or croak "I could not shift the reference to my self";
105 0 0         my $mmap = $self->get_mmap() or croak "Failed to retrieve mmap object";
106 0 0         if ($self->is_locked) {
107 0 0         $mmap->unlock() || croak "Internal error...unlock failed";
108             }
109 0           return;
110             }
111              
112             1;
113            
114             __END__