Apache2-SSI
view release on metacpan or search on metacpan
lib/Apache2/SSI/SharedMem.pm view on Meta::CPAN
# No support for threads
!$Config{useithreads} &&
$^O !~ /^(?:Android|cygwin|dos|MSWin32|os2|VMS|riscos)/i )
{
require IPC::SysV;
IPC::SysV->import( qw( IPC_RMID IPC_PRIVATE IPC_SET IPC_STAT IPC_CREAT IPC_EXCL IPC_NOWAIT
SEM_UNDO S_IRWXU S_IRWXG S_IRWXO
GETNCNT GETZCNT GETVAL SETVAL GETPID GETALL SETALL
shmat shmdt memread memwrite ftok ) );
our $SYSV_SUPPORTED = 1;
eval( <<'EOT' );
our $SEMOP_ARGS =
{
(LOCK_EX) =>
[
1, 0, 0, # wait for readers to finish
2, 0, 0, # wait for writers to finish
2, 1, SEM_UNDO, # assert write lock
],
(LOCK_EX | LOCK_NB) =>
[
1, 0, IPC_NOWAIT, # wait for readers to finish
2, 0, IPC_NOWAIT, # wait for writers to finish
2, 1, (SEM_UNDO | IPC_NOWAIT), # assert write lock
],
(LOCK_EX | LOCK_UN) =>
[
2, -1, (SEM_UNDO | IPC_NOWAIT),
],
(LOCK_SH) =>
[
2, 0, 0, # wait for writers to finish
1, 1, SEM_UNDO, # assert shared read lock
],
(LOCK_SH | LOCK_NB) =>
[
2, 0, IPC_NOWAIT, # wait for writers to finish
1, 1, (SEM_UNDO | IPC_NOWAIT), # assert shared read lock
],
(LOCK_SH | LOCK_UN) =>
[
1, -1, (SEM_UNDO | IPC_NOWAIT), # remove shared read lock
],
};
EOT
if( $@ )
{
warn( "Error while trying to evel \$SEMOP_ARGS: $@\n" );
}
}
else
{
our $SYSV_SUPPORTED = 0;
}
our @EXPORT_OK = qw(LOCK_EX LOCK_SH LOCK_NB LOCK_UN);
our %EXPORT_TAGS = (
all => [qw( LOCK_EX LOCK_SH LOCK_NB LOCK_UN )],
lock => [qw( LOCK_EX LOCK_SH LOCK_NB LOCK_UN )],
'flock' => [qw( LOCK_EX LOCK_SH LOCK_NB LOCK_UN )],
);
# Credits IPC::Shareable
our $N = do { my $foo = eval { pack "L!", 0 }; $@ ? '' : '!' };
our $SHEM_REPO = {};
our $VERSION = 'v0.1.2';
};
use strict;
use warnings;
sub init
{
my $self = shift( @_ );
# Default action when accessing a shared memory? If 1, it will create it if it does not exist already
$self->{create} = 0;
$self->{destroy} = 0;
$self->{exclusive} = 0;
$self->{key} = &IPC::SysV::IPC_PRIVATE;
$self->{mode} = 0666;
$self->{serial} = '';
# SHM_BUFSIZ
$self->{size} = SHM_BUFSIZ;
$self->{_init_strict_use_sub} = 1;
$self->SUPER::init( @_ ) || return;
$self->{addr} = undef();
$self->{id} = undef();
$self->{locked} = 0;
$self->{owner} = $$;
$self->{removed} = 0;
$self->{semid} = undef();
return( $self );
}
sub addr { return( shift->_set_get_scalar( 'addr', @_ ) ); }
sub attach
{
my $self = shift( @_ );
my $flags = shift( @_ );
$flags = $self->flags if( !defined( $flags ) );
my $addr = $self->addr;
return( $addr ) if( defined( $addr ) );
my $id = $self->id;
return( $self->error( "No shared memory id! Have you opened it first?" ) ) if( !length( $id ) );
$addr = shmat( $id, undef(), $flags );
return( $self->error( "Unable to attach to shared memory: $!" ) ) if( !defined( $addr ) );
$self->addr( $addr );
return( $addr );
}
sub create { return( shift->_set_get_boolean( 'create', @_ ) ); }
sub destroy { return( shift->_set_get_boolean( 'destroy', @_ ) ); }
sub detach
{
my $self = shift( @_ );
my $addr = $self->addr;
return if( !defined( $addr ) );
my $rv = shmdt( $addr );
return( $self->error( "Unable to detach from shared memory: $!" ) ) if( !defined( $rv ) );
$self->addr( undef() );
( run in 1.152 second using v1.01-cache-2.11-cpan-39bf76dae61 )