Add support for my $foo : shared;
[p5sagit/p5-mst-13.2.git] / ext / threads / shared / shared.pm
index 8baa503..83bd92c 100644 (file)
@@ -1,96 +1,50 @@
 package threads::shared;
-
 use strict;
 use warnings;
 use Config;
-use Scalar::Util qw(weaken);
-use attributes qw(reftype);
 
-BEGIN {
-    if ($Config{'useithreads'} && $threads::threads) {
-       *share = \&share_enabled;
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(share cond_wait cond_broadcast cond_signal _refcnt _id _thrcnt);
+our $VERSION = '0.90';
+
+use Attribute::Handlers;
+
+
+if ($Config{'useithreads'}) {
        *cond_wait = \&cond_wait_enabled;
        *cond_signal = \&cond_signal_enabled;
        *cond_broadcast = \&cond_broadcast_enabled;
-       *unlock = \&unlock_enabled;
-    } else {
+       require XSLoader;
+       XSLoader::load('threads::shared',$VERSION);
+}
+else {
        *share = \&share_disabled;
        *cond_wait = \&cond_wait_disabled;
        *cond_signal = \&cond_signal_disabled;
        *cond_broadcast = \&cond_broadcast_disabled;
-       *unlock = \&unlock_disabled;
-    }
 }
 
-require Exporter;
-require DynaLoader;
-our @ISA = qw(Exporter DynaLoader);
-
-our @EXPORT = qw(share cond_wait cond_broadcast cond_signal unlock);
-our $VERSION = '0.90';
-
-our %shared;
 
 sub cond_wait_disabled { return @_ };
 sub cond_signal_disabled { return @_};
 sub cond_broadcast_disabled { return @_};
-sub unlock_disabled { 1 };
-sub lock_disabled { 1 }
 sub share_disabled { return @_}
 
-sub share_enabled (\[$@%]) { # \]
-    my $value = $_[0];
-    my $ref = reftype($value);
-    if($ref eq 'SCALAR') {
-       my $obj = \threads::shared::sv->new($$value);
-       bless $obj, 'threads::shared::sv';
-       $shared{$$obj} = $value;
-       weaken($shared{$$obj});
-    } elsif($ref eq "ARRAY") {
-       tie @$value, 'threads::shared::av', $value;
-    } elsif($ref eq "HASH") {
-       tie %$value, "threads::shared::hv", $value;
-    } else {
-       die "You cannot share ref of type $_[0]\n";
-    }
-}
-
-
-package threads::shared::sv;
-use base 'threads::shared';
+$threads::shared::threads_shared = 1;
 
-sub DESTROY {}
+sub _thrcnt { 42 }
 
-package threads::shared::av;
-use base 'threads::shared';
-use Scalar::Util qw(weaken);
-sub TIEARRAY {
-       my $class = shift;
-        my $value = shift;
-       my $self = bless \threads::shared::av->new($value),'threads::shared::av';
-       $shared{$self->ptr} = $value;
-       weaken($shared{$self->ptr});
-       return $self;
+sub threads::shared::tie::SPLICE
+{
+ die "Splice not implemented for shared arrays";
 }
 
-package threads::shared::hv;
-use base 'threads::shared';
-use Scalar::Util qw(weaken);
-sub TIEHASH {
-    my $class = shift;
-    my $value = shift;
-    my $self = bless \threads::shared::hv->new($value),'threads::shared::hv';
-    $shared{$self->ptr} = $value;
-    weaken($shared{$self->ptr});
-    return $self;
+sub UNIVERSAL::shared : ATTR {
+    my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+    share($referent);
 }
 
-package threads::shared;
-
-$threads::shared::threads_shared = 1;
-
-bootstrap threads::shared $VERSION;
-
 __END__
 
 =head1 NAME