7 void shared_sv_attach_sv (SV* sv, shared_sv* shared) {
8 HV* shared_hv = get_hv("threads::shared::shared", FALSE);
9 SV* id = newSViv((IV)shared);
10 STRLEN length = sv_len(id);
12 SV** tiedobject_ = hv_fetch(shared_hv, SvPV(id,length), length, 0);
14 tiedobject = (*tiedobject_);
16 SvRV(sv) = SvRV(tiedobject);
24 int shared_sv_fetch_mg (pTHX_ SV* sv, MAGIC *mg) {
25 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
27 if(SvROK(SHAREDSvGET(shared))) {
28 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared)));
29 shared_sv_attach_sv(sv, target);
31 sv_setsv(sv, SHAREDSvGET(shared));
33 SHAREDSvUNLOCK(shared);
38 int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
39 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
41 if(SvROK(SHAREDSvGET(shared)))
42 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
45 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(sv));
47 SHAREDSvRELEASE(shared);
48 sv_setsv(sv,SHAREDSvGET(shared));
49 SHAREDSvUNLOCK(shared);
50 Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared scalar");
52 Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(shared));
53 SHAREDSvGET(shared) = newRV_noinc(newSViv((IV)target));
56 sv_setsv(SHAREDSvGET(shared), sv);
58 SHAREDSvRELEASE(shared);
59 if(SvROK(SHAREDSvGET(shared)))
60 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
61 SHAREDSvUNLOCK(shared);
65 int shared_sv_destroy_mg (pTHX_ SV* sv, MAGIC *mg) {
66 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
69 Perl_sharedsv_thrcnt_dec(aTHX_ shared);
72 MGVTBL svtable = {MEMBER_TO_FPTR(shared_sv_fetch_mg),
73 MEMBER_TO_FPTR(shared_sv_store_mg),
76 MEMBER_TO_FPTR(shared_sv_destroy_mg)
79 MODULE = threads::shared PACKAGE = threads::shared
89 RETVAL = newSViv(SvIV(SvRV(ref)));
98 shared_sv* shared = Perl_sharedsv_find(aTHX, ref);
100 croak("thrcnt can only be used on shared values");
101 SHAREDSvLOCK(shared);
102 RETVAL = newSViv(SvREFCNT(SHAREDSvGET(shared)));
103 SHAREDSvUNLOCK(shared);
115 shared = Perl_sharedsv_find(aTHX, ref);
117 croak("thrcnt can only be used on shared values");
118 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
121 MODULE = threads::shared PACKAGE = threads::shared::sv
128 shared_sv* shared = Perl_sharedsv_new(aTHX);
130 SV* obj = newSViv((IV)shared);
131 SHAREDSvEDIT(shared);
132 SHAREDSvGET(shared) = newSVsv(value);
133 SHAREDSvRELEASE(shared);
134 sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
135 shared_magic = mg_find(value, PERL_MAGIC_ext);
136 shared_magic->mg_virtual = &svtable;
137 shared_magic->mg_obj = newSViv((IV)shared);
138 shared_magic->mg_flags |= MGf_REFCOUNTED;