[PATCH] Wrap IPC::ShareLite->new() calls inside eval{} blocks.

Niko Tyni ntyni at debian.org
Sun Apr 26 20:07:03 UTC 2009


As of IPC::ShareLite 0.14, its constructor croaks on error where it used
to return an empty value. This breaks the IPC::SharedCache test suite.

http://bugs.debian.org/525711
http://rt.cpan.org/Public/Bug/Display.html?id=45450
---
 SharedCache.pm |   36 +++++++++++++++++++++++++++---------
 1 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/SharedCache.pm b/SharedCache.pm
index 30bca21..51eabcf 100644
--- a/SharedCache.pm
+++ b/SharedCache.pm
@@ -580,11 +580,13 @@ sub STORE {
   my $share;
   if (exists $root_record->{'map'}{$key}) {
     # we've got a key, get the share and cache it
-    $share = IPC::ShareLite->new('-key' => $root_record->{'map'}{$key},
+    $share = eval {
+             IPC::ShareLite->new('-key' => $root_record->{'map'}{$key},
                                  '-mode' => $options->{ipc_mode},
                                  '-size' => $options->{ipc_segment_size},
                                  '-create' => 0,
                                  '-destroy' => 0);
+    };
     confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share;  
 
     $root_record->{'size'} -= $root_record->{'length_map'}{$key};
@@ -596,13 +598,15 @@ sub STORE {
     for ( my $end = $obj_ipc_key + 10000 ; 
           $obj_ipc_key != $end ; 
           $obj_ipc_key++ ) {
-      $share = IPC::ShareLite->new('-key' => $obj_ipc_key,
+      $share = eval {
+               IPC::ShareLite->new('-key' => $obj_ipc_key,
                                    '-mode' => $options->{ipc_mode},
                                    '-size' => $options->{ipc_segment_size},
                                    '-create' => 1,
                                    '-exclusive' => 1,
                                    '-destroy' => 0,
                                   );
+      };
       last if defined $share;
     }        
     croak("IPC::SharedCache : searched through 10,000 consecutive locations for a free shared memory segment, giving up : $!")
@@ -625,11 +629,13 @@ sub STORE {
       my $delete_key = shift @{$root_record->{'queue'}};
       # delete the segment for this object
       { 
-        my $share = IPC::ShareLite->new('-key' => $root_record->{map}{$delete_key},
+        my $share = eval {
+                    IPC::ShareLite->new('-key' => $root_record->{map}{$delete_key},
                                         '-mode' => $options->{ipc_mode},
                                         '-size' => $options->{ipc_segment_size},
                                         '-create' => 0,
                                     '-destroy' => 1);
+        };
         confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share;
         # share is now deleted since destroy == 1 and $share goes out of scope
       }
@@ -684,11 +690,13 @@ sub DELETE {
 
   # delete the segment for this object
   { 
-    my $share = IPC::ShareLite->new('-key' => $obj_ipc_key,
+    my $share = eval {
+                IPC::ShareLite->new('-key' => $obj_ipc_key,
                                     '-mode' => $options->{ipc_mode},
                                     '-size' => $options->{ipc_segment_size},
                                     '-create' => 0,
                                     '-destroy' => 1);
+    };
     confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share;
     # share is now deleted since destroy == 1 and $share goes out of scope
   }
@@ -830,11 +838,13 @@ sub walk {
   require "Data/Dumper.pm";
   
   # make sure the cache actually exists here
-  my $test = IPC::ShareLite->new('-key' => $key,
+  my $test = eval {
+             IPC::ShareLite->new('-key' => $key,
                                  '-mode' => 0666,
                                  '-size' => $segment_size,
                                  '-create' => 0, 
                                  '-destroy' => 0);
+  };
   die "Unable to find a cache at key $key : $!" unless defined $test;
 
   my %self;
@@ -911,10 +921,12 @@ sub remove {
   
   # delete the root segment
   { 
-    my $share = IPC::ShareLite->new('-key' => $key,
+    my $share = eval {
+                IPC::ShareLite->new('-key' => $key,
                                     '-size' => $segment_size,
                                     '-create' => 0,
                                     '-destroy' => 1);
+    };
     confess("IPC::SharedCache: Unable to get shared cache block $key : $!") unless defined $share;
     # share is now deleted since destroy == 1 and $share goes out of scope
   }
@@ -938,11 +950,13 @@ sub _init_root {
   return if defined $root;
 
   # try to get a handle on an existing root for this key
-  $root = IPC::ShareLite->new('-key' => $ipc_key,
+  $root = eval {
+          IPC::ShareLite->new('-key' => $ipc_key,
                               '-mode' => $options->{ipc_mode},
                               '-size' => $options->{ipc_segment_size},
                               '-create' => 0, 
                               '-destroy' => 0);
+  };
   if (defined $root) {
     $ROOT_SHARE_CACHE{$ipc_key} = $root;
     return;
@@ -961,12 +975,14 @@ sub _init_root {
   #                           if $options->{debug};
 
   # try to create it if that didn't work (and do initialization)
-  $root = IPC::ShareLite->new('-key' => $options->{ipc_key},
+  $root = eval {
+          IPC::ShareLite->new('-key' => $options->{ipc_key},
                               '-mode' => $options->{ipc_mode},
                               '-size' => $options->{ipc_segment_size},
                               '-create' => 1, 
                               '-exclusive' => 1,
                               '-destroy' => 0);
+  };
   confess("IPC::SharedCache object initialization : Unable to initialize root ipc shared memory segment : $!") 
     unless defined($root);
 
@@ -1032,11 +1048,13 @@ sub _get_share_object {
   my $options = $self->{options};
 
   # we've got a key, get the share and cache it
-  my $share = IPC::ShareLite->new('-key' => $obj_ipc_key,
+  my $share = eval {
+              IPC::ShareLite->new('-key' => $obj_ipc_key,
                                   '-mode' => $options->{ipc_mode},
                                   '-size' => $options->{ipc_segment_size},
                                   '-create' => 0,
                                   '-destroy' => 0);
+  };
   confess("IPC::SharedCache: Unable to get shared cache block $obj_ipc_key : $!") unless defined $share;
   
   # get the cache block
-- 
1.6.2.4


--gBBFr7Ir9EOA20Yy--





More information about the pkg-perl-maintainers mailing list