package Thread::Shared::Hash; use threads::shared '1.02', qw/ share is_shared /; use Thread::Shared; use strict; sub TIEHASH { my $class = shift; my $value = shift; my $bless = shift; if ( not defined $value or not is_shared $value ) { $value = &share({}); } if ( $bless and $bless ne 'HASH' ) { bless $value, $bless; } my $self = { hash => $value }; bless $self, $class; return $self; } sub get_shared_value { return shift->{hash}; } sub FETCH { my ($self, $key) = @_; my $value = $self->{hash}->{$key}; if ( ref($value) ) { $value = Thread::Shared::wrap($value); } return $value; } sub STORE { my ($self, $key, $value) = @_; $self->{hash}->{$key} = Thread::Shared::make_sharable($value); } sub DELETE { my ($self, $key) = @_; delete $self->{hash}->{$key}; } sub CLEAR { my $self = shift; foreach my $key ( keys %{$self->{hash}} ) { delete $self->{hash}->{$key}; } } sub EXISTS { my ($self, $key) = shift; return exists $self->{hash}->{$key}; } sub FIRSTKEY { my $self = shift; # reset the each() iterator my $a = keys %{$self->{hash}}; return each %{$self->{hash}}; } sub NEXTKEY { my $self = shift; return each %{$self->{hash}}; } sub SCALAR { my $self = shift; return scalar %{$self->{hash}}; } sub UNTIE { my $self = shift; # TODO: me! } sub DESTROY { my $self = shift; # TODO: me! } 1;