8 SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
9 HV* shared_hv = get_hv("threads::shared::shared", FALSE);
10 SV* id = newSViv((IV)shared);
11 STRLEN length = sv_len(id);
13 SV** tiedobject_ = hv_fetch(shared_hv, SvPV(id,length), length, 0);
15 tiedobject = (*tiedobject_);
18 SvRV(sv) = SvRV(tiedobject);
20 sv = newRV(SvRV(tiedobject));
23 switch(SvTYPE(SHAREDSvGET(shared))) {
26 SV* obj_ref = newSViv(0);
27 SV* obj = newSVrv(obj_ref,"threads::shared::av");
29 sv_setiv(obj,(IV)shared);
30 weakref = newRV((SV*)hv);
31 sv = newRV_noinc((SV*)hv);
33 sv_magic((SV*) hv, obj_ref, PERL_MAGIC_tied, Nullch, 0);
34 hv_store(shared_hv, SvPV(id,length), length, weakref, 0);
35 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
40 SV* obj_ref = newSViv(0);
41 SV* obj = newSVrv(obj_ref,"threads::shared::hv");
43 sv_setiv(obj,(IV)shared);
44 weakref = newRV((SV*)hv);
45 sv = newRV_noinc((SV*)hv);
47 sv_magic((SV*) hv, obj_ref, PERL_MAGIC_tied, Nullch, 0);
48 hv_store(shared_hv, SvPV(id,length), length, weakref, 0);
49 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
54 SV* value = newSVsv(SHAREDSvGET(shared));
55 SV* obj = newSViv((IV)shared);
56 sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
57 shared_magic = mg_find(value, PERL_MAGIC_ext);
58 shared_magic->mg_virtual = &svtable;
59 shared_magic->mg_obj = newSViv((IV)shared);
60 shared_magic->mg_flags |= MGf_REFCOUNTED;
61 shared_magic->mg_private = 0;
63 sv = newRV_noinc(value);
66 hv_store(shared_hv, SvPV(id,length),length, value, 0);
67 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
76 int shared_sv_fetch_mg (pTHX_ SV* sv, MAGIC *mg) {
77 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
79 if(mg->mg_private != shared->index) {
80 if(SvROK(SHAREDSvGET(shared))) {
81 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared)));
82 shared_sv_attach_sv(sv, target);
84 sv_setsv(sv, SHAREDSvGET(shared));
86 mg->mg_private = shared->index;
88 SHAREDSvUNLOCK(shared);
93 int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
94 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
96 if(SvROK(SHAREDSvGET(shared)))
97 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
99 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(sv));
101 sv_setsv(sv,SHAREDSvGET(shared));
102 SHAREDSvUNLOCK(shared);
103 Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared scalar");
105 SHAREDSvEDIT(shared);
106 Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(shared));
107 SHAREDSvGET(shared) = newRV_noinc(newSViv((IV)target));
109 SHAREDSvEDIT(shared);
110 sv_setsv(SHAREDSvGET(shared), sv);
113 mg->mg_private = shared->index;
114 SHAREDSvRELEASE(shared);
115 if(SvROK(SHAREDSvGET(shared)))
116 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
117 SHAREDSvUNLOCK(shared);
121 int shared_sv_destroy_mg (pTHX_ SV* sv, MAGIC *mg) {
122 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
126 HV* shared_hv = get_hv("threads::shared::shared", FALSE);
127 SV* id = newSViv((IV)shared);
128 STRLEN length = sv_len(id);
129 hv_delete(shared_hv, SvPV(id,length), length,0);
131 Perl_sharedsv_thrcnt_dec(aTHX_ shared);
134 MGVTBL svtable = {MEMBER_TO_FPTR(shared_sv_fetch_mg),
135 MEMBER_TO_FPTR(shared_sv_store_mg),
138 MEMBER_TO_FPTR(shared_sv_destroy_mg)
141 MODULE = threads::shared PACKAGE = threads::shared
151 RETVAL = newSViv(SvIV(SvRV(ref)));
163 shared = Perl_sharedsv_find(aTHX, ref);
165 croak("thrcnt can only be used on shared values");
166 SHAREDSvLOCK(shared);
167 RETVAL = newSViv(SvREFCNT(SHAREDSvGET(shared)));
168 SHAREDSvUNLOCK(shared);
180 shared = Perl_sharedsv_find(aTHX, ref);
182 croak("thrcnt can only be used on shared values");
183 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
189 shared_sv* shared = (shared_sv*) SvIV(ref);
191 croak("thrcnt can only be used on shared values");
192 Perl_sharedsv_thrcnt_dec(aTHX_ shared);
195 MODULE = threads::shared PACKAGE = threads::shared::sv
202 shared_sv* shared = Perl_sharedsv_new(aTHX);
204 SV* obj = newSViv((IV)shared);
205 SHAREDSvEDIT(shared);
206 SHAREDSvGET(shared) = newSVsv(value);
207 SHAREDSvRELEASE(shared);
208 sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
209 shared_magic = mg_find(value, PERL_MAGIC_ext);
210 shared_magic->mg_virtual = &svtable;
211 shared_magic->mg_obj = newSViv((IV)shared);
212 shared_magic->mg_flags |= MGf_REFCOUNTED;
213 shared_magic->mg_private = 0;
220 MODULE = threads::shared PACKAGE = threads::shared::av
227 shared_sv* shared = Perl_sharedsv_new(aTHX);
228 SV* obj = newSViv((IV)shared);
229 SHAREDSvEDIT(shared);
230 SHAREDSvGET(shared) = (SV*) newAV();
231 SHAREDSvRELEASE(shared);
237 STORE(self, index, value)
242 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
247 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(value));
249 Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
251 value = newRV_noinc(newSViv((IV)target));
253 SHAREDSvLOCK(shared);
254 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index), 0);
255 if(aentry_ && SvIV((*aentry_))) {
257 slot = (shared_sv*) SvIV(aentry);
258 if(SvROK(SHAREDSvGET(slot)))
259 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
261 sv_setsv(SHAREDSvGET(slot), value);
262 SHAREDSvRELEASE(slot);
264 slot = Perl_sharedsv_new(aTHX);
265 SHAREDSvEDIT(shared);
266 SHAREDSvGET(slot) = newSVsv(value);
267 aentry = newSViv((IV)slot);
268 av_store((AV*) SHAREDSvGET(shared), SvIV(index), aentry);
269 SHAREDSvRELEASE(shared);
271 if(SvROK(SHAREDSvGET(slot)))
272 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
274 SHAREDSvUNLOCK(shared);
281 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
286 SHAREDSvLOCK(shared);
287 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index),0);
290 if(SvTYPE(aentry) == SVt_NULL) {
291 retval = &PL_sv_undef;
293 slot = (shared_sv*) SvIV(aentry);
294 if(SvROK(SHAREDSvGET(slot))) {
295 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
296 retval = shared_sv_attach_sv(NULL,target);
298 retval = newSVsv(SHAREDSvGET(slot));
302 retval = &PL_sv_undef;
304 SHAREDSvUNLOCK(shared);
313 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
315 SHAREDSvLOCK(shared);
316 for(i = 1; i < items; i++) {
317 shared_sv* slot = Perl_sharedsv_new(aTHX);
320 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(tmp));
322 Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
324 tmp = newRV_noinc(newSViv((IV)target));
327 SHAREDSvGET(slot) = newSVsv(tmp);
328 av_push((AV*) SHAREDSvGET(shared), newSViv((IV)slot));
329 SHAREDSvRELEASE(slot);
330 if(SvROK(SHAREDSvGET(slot)))
331 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
333 SHAREDSvUNLOCK(shared);
339 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
341 SHAREDSvLOCK(shared);
342 SHAREDSvEDIT(shared);
343 av_unshift((AV*)SHAREDSvGET(shared), items - 1);
344 SHAREDSvRELEASE(shared);
345 for(i = 1; i < items; i++) {
346 shared_sv* slot = Perl_sharedsv_new(aTHX);
349 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(tmp));
351 Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
353 tmp = newRV_noinc(newSViv((IV)target));
356 SHAREDSvGET(slot) = newSVsv(tmp);
357 av_store((AV*) SHAREDSvGET(shared), i - 1, newSViv((IV)slot));
358 SHAREDSvRELEASE(slot);
359 if(SvROK(SHAREDSvGET(slot)))
360 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
362 SHAREDSvUNLOCK(shared);
368 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
371 SHAREDSvLOCK(shared);
372 SHAREDSvEDIT(shared);
373 retval = av_pop((AV*)SHAREDSvGET(shared));
374 SHAREDSvRELEASE(shared);
375 if(retval && SvIV(retval)) {
376 slot = (shared_sv*) SvIV(retval);
377 if(SvROK(SHAREDSvGET(slot))) {
378 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
379 retval = shared_sv_attach_sv(NULL,target);
381 retval = newSVsv(SHAREDSvGET(slot));
383 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
385 retval = &PL_sv_undef;
387 SHAREDSvUNLOCK(shared);
397 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
400 SHAREDSvLOCK(shared);
401 SHAREDSvEDIT(shared);
402 retval = av_shift((AV*)SHAREDSvGET(shared));
403 SHAREDSvRELEASE(shared);
404 if(retval && SvIV(retval)) {
405 slot = (shared_sv*) SvIV(retval);
406 if(SvROK(SHAREDSvGET(slot))) {
407 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
408 retval = shared_sv_attach_sv(NULL,target);
410 retval = newSVsv(SHAREDSvGET(slot));
412 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
414 retval = &PL_sv_undef;
416 SHAREDSvUNLOCK(shared);
425 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
429 SHAREDSvLOCK(shared);
430 svp = AvARRAY((AV*)SHAREDSvGET(shared));
431 i = AvFILLp((AV*)SHAREDSvGET(shared));
434 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(svp[i]));
438 SHAREDSvEDIT(shared);
439 av_clear((AV*)SHAREDSvGET(shared));
440 SHAREDSvRELEASE(shared);
441 SHAREDSvUNLOCK(shared);
448 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
449 SHAREDSvEDIT(shared);
450 av_extend((AV*)SHAREDSvGET(shared), (I32) SvIV(count));
451 SHAREDSvRELEASE(shared);
461 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
463 SHAREDSvLOCK(shared);
464 exists = av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index));
470 SHAREDSvUNLOCK(shared);
473 STORESIZE(self,count)
477 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
478 SHAREDSvEDIT(shared);
479 av_fill((AV*) SHAREDSvGET(shared), (I32) SvIV(count));
480 SHAREDSvRELEASE(shared);
486 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
487 SHAREDSvLOCK(shared);
488 RETVAL = newSViv(av_len((AV*) SHAREDSvGET(shared)) + 1);
489 SHAREDSvUNLOCK(shared);
498 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
500 SHAREDSvLOCK(shared);
501 if(av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index))) {
503 SHAREDSvEDIT(shared);
504 tmp = av_delete((AV*)SHAREDSvGET(shared), (I32) SvIV(index),0);
505 SHAREDSvRELEASE(shared);
507 slot = (shared_sv*) SvIV(tmp);
508 if(SvROK(SHAREDSvGET(slot))) {
509 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
510 RETVAL = shared_sv_attach_sv(NULL,target);
512 RETVAL = newSVsv(SHAREDSvGET(slot));
514 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
516 RETVAL = &PL_sv_undef;
519 RETVAL = &PL_sv_undef;
521 SHAREDSvUNLOCK(shared);
526 SPLICE(self, offset, length, ...)
531 croak("Splice is not implmented for shared arrays");
533 MODULE = threads::shared PACKAGE = threads::shared::hv
540 shared_sv* shared = Perl_sharedsv_new(aTHX);
541 SV* obj = newSViv((IV)shared);
542 SHAREDSvEDIT(shared);
543 SHAREDSvGET(shared) = (SV*) newHV();
544 SHAREDSvRELEASE(shared);
550 STORE(self, key, value)
555 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
560 char* ckey = SvPV(key, len);
561 SHAREDSvLOCK(shared);
563 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(value));
565 Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared hash");
567 SHAREDSvEDIT(shared);
568 value = newRV_noinc(newSViv((IV)target));
569 SHAREDSvRELEASE(shared);
571 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len, 0);
572 if(hentry_ && SvIV((*hentry_))) {
574 slot = (shared_sv*) SvIV(hentry);
575 if(SvROK(SHAREDSvGET(slot)))
576 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
578 sv_setsv(SHAREDSvGET(slot), value);
579 SHAREDSvRELEASE(slot);
581 slot = Perl_sharedsv_new(aTHX);
582 SHAREDSvEDIT(shared);
583 SHAREDSvGET(slot) = newSVsv(value);
584 hentry = newSViv((IV)slot);
585 hv_store((HV*) SHAREDSvGET(shared), ckey,len , hentry, 0);
586 SHAREDSvRELEASE(shared);
588 if(SvROK(SHAREDSvGET(slot)))
589 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
590 SHAREDSvUNLOCK(shared);
598 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
604 char* ckey = SvPV(key, len);
605 SHAREDSvLOCK(shared);
606 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len,0);
609 if(SvTYPE(hentry) == SVt_NULL) {
610 retval = &PL_sv_undef;
612 slot = (shared_sv*) SvIV(hentry);
613 if(SvROK(SHAREDSvGET(slot))) {
614 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
615 retval = shared_sv_attach_sv(NULL, target);
617 retval = newSVsv(SHAREDSvGET(slot));
621 retval = &PL_sv_undef;
623 SHAREDSvUNLOCK(shared);
632 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
635 SHAREDSvLOCK(shared);
636 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
637 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
639 slot = (shared_sv*) SvIV(Perl_hv_iterval(PL_sharedsv_space, (HV*) SHAREDSvGET(shared), entry));
640 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
641 entry = Perl_hv_iternext(PL_sharedsv_space,(HV*) SHAREDSvGET(shared));
643 SHAREDSvEDIT(shared);
644 hv_clear((HV*) SHAREDSvGET(shared));
645 SHAREDSvRELEASE(shared);
646 SHAREDSvUNLOCK(shared);
652 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
656 SHAREDSvLOCK(shared);
657 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
658 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
660 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
661 RETVAL = newSVpv(key, len);
663 RETVAL = &PL_sv_undef;
665 SHAREDSvUNLOCK(shared);
671 NEXTKEY(self, oldkey)
675 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
679 SHAREDSvLOCK(shared);
680 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
682 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
683 RETVAL = newSVpv(key, len);
685 RETVAL = &PL_sv_undef;
687 SHAREDSvUNLOCK(shared);
697 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
699 char* ckey = SvPV(key, len);
700 SHAREDSvLOCK(shared);
701 if(hv_exists((HV*)SHAREDSvGET(shared), ckey, len)) {
706 SHAREDSvUNLOCK(shared);
715 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
718 char* ckey = SvPV(key, len);
720 SHAREDSvLOCK(shared);
721 SHAREDSvEDIT(shared);
722 tmp = hv_delete((HV*) SHAREDSvGET(shared), ckey, len,0);
723 SHAREDSvRELEASE(shared);
725 slot = (shared_sv*) SvIV(tmp);
726 if(SvROK(SHAREDSvGET(slot))) {
727 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
728 RETVAL = shared_sv_attach_sv(NULL, target);
730 RETVAL = newSVsv(SHAREDSvGET(slot));
732 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
734 RETVAL = &PL_sv_undef;
736 SHAREDSvUNLOCK(shared);