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(mg->mg_private != shared->index) {
28 if(SvROK(SHAREDSvGET(shared))) {
29 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared)));
30 shared_sv_attach_sv(sv, target);
32 sv_setsv(sv, SHAREDSvGET(shared));
34 mg->mg_private = shared->index;
36 SHAREDSvUNLOCK(shared);
41 int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
42 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
44 if(SvROK(SHAREDSvGET(shared)))
45 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
48 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(sv));
50 SHAREDSvRELEASE(shared);
51 sv_setsv(sv,SHAREDSvGET(shared));
52 SHAREDSvUNLOCK(shared);
53 Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared scalar");
55 Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(shared));
56 SHAREDSvGET(shared) = newRV_noinc(newSViv((IV)target));
58 sv_setsv(SHAREDSvGET(shared), sv);
61 mg->mg_private = shared->index;
62 SHAREDSvRELEASE(shared);
63 if(SvROK(SHAREDSvGET(shared)))
64 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
65 SHAREDSvUNLOCK(shared);
69 int shared_sv_destroy_mg (pTHX_ SV* sv, MAGIC *mg) {
70 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
73 Perl_sharedsv_thrcnt_dec(aTHX_ shared);
76 MGVTBL svtable = {MEMBER_TO_FPTR(shared_sv_fetch_mg),
77 MEMBER_TO_FPTR(shared_sv_store_mg),
80 MEMBER_TO_FPTR(shared_sv_destroy_mg)
83 MODULE = threads::shared PACKAGE = threads::shared
93 RETVAL = newSViv(SvIV(SvRV(ref)));
102 shared_sv* shared = Perl_sharedsv_find(aTHX, ref);
104 croak("thrcnt can only be used on shared values");
105 SHAREDSvLOCK(shared);
106 RETVAL = newSViv(SvREFCNT(SHAREDSvGET(shared)));
107 SHAREDSvUNLOCK(shared);
119 shared = Perl_sharedsv_find(aTHX, ref);
121 croak("thrcnt can only be used on shared values");
122 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
125 MODULE = threads::shared PACKAGE = threads::shared::sv
132 shared_sv* shared = Perl_sharedsv_new(aTHX);
134 SV* obj = newSViv((IV)shared);
135 SHAREDSvEDIT(shared);
136 SHAREDSvGET(shared) = newSVsv(value);
137 SHAREDSvRELEASE(shared);
138 sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
139 shared_magic = mg_find(value, PERL_MAGIC_ext);
140 shared_magic->mg_virtual = &svtable;
141 shared_magic->mg_obj = newSViv((IV)shared);
142 shared_magic->mg_flags |= MGf_REFCOUNTED;
143 shared_magic->mg_private = 0;
150 MODULE = threads::shared PACKAGE = threads::shared::av
157 shared_sv* shared = Perl_sharedsv_new(aTHX);
158 SV* obj = newSViv((IV)shared);
159 SHAREDSvEDIT(shared);
160 SHAREDSvGET(shared) = (SV*) newAV();
161 SHAREDSvRELEASE(shared);
167 STORE(self, index, value)
172 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
176 SHAREDSvLOCK(shared);
177 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index), 0);
178 if(aentry_ && SvIV((*aentry_))) {
180 slot = (shared_sv*) SvIV(aentry);
181 if(SvROK(SHAREDSvGET(slot)))
182 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
184 sv_setsv(SHAREDSvGET(slot), value);
185 SHAREDSvRELEASE(slot);
187 slot = Perl_sharedsv_new(aTHX);
188 SHAREDSvEDIT(shared);
189 SHAREDSvGET(slot) = newSVsv(value);
190 aentry = newSViv((IV)slot);
191 av_store((AV*) SHAREDSvGET(shared), SvIV(index), aentry);
192 SHAREDSvRELEASE(shared);
194 SHAREDSvUNLOCK(shared);
201 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
206 SHAREDSvLOCK(shared);
207 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index),0);
210 if(SvTYPE(aentry) == SVt_NULL) {
211 retval = &PL_sv_undef;
213 slot = (shared_sv*) SvIV(aentry);
214 retval = newSVsv(SHAREDSvGET(slot));
217 retval = &PL_sv_undef;
219 SHAREDSvUNLOCK(shared);
228 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
230 SHAREDSvLOCK(shared);
231 for(i = 1; i < items; i++) {
232 shared_sv* slot = Perl_sharedsv_new(aTHX);
235 SHAREDSvGET(slot) = newSVsv(tmp);
236 av_push((AV*) SHAREDSvGET(shared), newSViv((IV)slot));
237 SHAREDSvRELEASE(slot);
239 SHAREDSvUNLOCK(shared);
245 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
247 SHAREDSvLOCK(shared);
248 SHAREDSvEDIT(shared);
249 av_unshift((AV*)SHAREDSvGET(shared), items - 1);
250 SHAREDSvRELEASE(shared);
251 for(i = 1; i < items; i++) {
252 shared_sv* slot = Perl_sharedsv_new(aTHX);
255 SHAREDSvGET(slot) = newSVsv(tmp);
256 av_store((AV*) SHAREDSvGET(shared), i - 1, newSViv((IV)slot));
257 SHAREDSvRELEASE(slot);
259 SHAREDSvUNLOCK(shared);
265 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
268 SHAREDSvLOCK(shared);
269 SHAREDSvEDIT(shared);
270 retval = av_pop((AV*)SHAREDSvGET(shared));
271 SHAREDSvRELEASE(shared);
272 if(retval && SvIV(retval)) {
273 slot = (shared_sv*) SvIV(retval);
274 retval = newSVsv(SHAREDSvGET(slot));
275 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
277 retval = &PL_sv_undef;
279 SHAREDSvUNLOCK(shared);
289 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
292 SHAREDSvLOCK(shared);
293 SHAREDSvEDIT(shared);
294 retval = av_shift((AV*)SHAREDSvGET(shared));
295 SHAREDSvRELEASE(shared);
296 if(retval && SvIV(retval)) {
297 slot = (shared_sv*) SvIV(retval);
298 retval = newSVsv(SHAREDSvGET(slot));
299 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
301 retval = &PL_sv_undef;
303 SHAREDSvUNLOCK(shared);
312 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
316 SHAREDSvLOCK(shared);
317 svp = AvARRAY((AV*)SHAREDSvGET(shared));
318 i = AvFILLp((AV*)SHAREDSvGET(shared));
321 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(svp[i]));
325 SHAREDSvEDIT(shared);
326 av_clear((AV*)SHAREDSvGET(shared));
327 SHAREDSvRELEASE(shared);
328 SHAREDSvUNLOCK(shared);
335 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
336 SHAREDSvEDIT(shared);
337 av_extend((AV*)SHAREDSvGET(shared), (I32) SvIV(count));
338 SHAREDSvRELEASE(shared);
348 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
350 SHAREDSvLOCK(shared);
351 exists = av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index));
357 SHAREDSvUNLOCK(shared);
360 STORESIZE(self,count)
364 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
365 SHAREDSvEDIT(shared);
366 av_fill((AV*) SHAREDSvGET(shared), (I32) SvIV(count));
367 SHAREDSvRELEASE(shared);
373 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
374 SHAREDSvLOCK(shared);
375 RETVAL = newSViv(av_len((AV*) SHAREDSvGET(shared)) + 1);
376 SHAREDSvUNLOCK(shared);
385 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
387 SHAREDSvLOCK(shared);
388 if(av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index))) {
390 SHAREDSvEDIT(shared);
391 tmp = av_delete((AV*)SHAREDSvGET(shared), (I32) SvIV(index),0);
392 SHAREDSvRELEASE(shared);
394 slot = (shared_sv*) SvIV(tmp);
395 RETVAL = newSVsv(SHAREDSvGET(slot));
396 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
398 RETVAL = &PL_sv_undef;
401 RETVAL = &PL_sv_undef;
403 SHAREDSvUNLOCK(shared);
408 SPLICE(self, offset, length, ...)
413 croak("Splice is not implmented for shared arrays");