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))));
47 shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(sv));
49 sv_setsv(sv,SHAREDSvGET(shared));
50 SHAREDSvUNLOCK(shared);
51 Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared scalar");
54 Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(shared));
55 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");
415 MODULE = threads::shared PACKAGE = threads::shared::hv
422 shared_sv* shared = Perl_sharedsv_new(aTHX);
423 SV* obj = newSViv((IV)shared);
424 SHAREDSvEDIT(shared);
425 SHAREDSvGET(shared) = (SV*) newHV();
426 SHAREDSvRELEASE(shared);
432 STORE(self, key, value)
437 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
442 char* ckey = SvPV(key, len);
443 SHAREDSvLOCK(shared);
444 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len, 0);
445 if(hentry_ && SvIV((*hentry_))) {
447 slot = (shared_sv*) SvIV(hentry);
448 if(SvROK(SHAREDSvGET(slot)))
449 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
451 sv_setsv(SHAREDSvGET(slot), value);
452 SHAREDSvRELEASE(slot);
454 slot = Perl_sharedsv_new(aTHX);
455 SHAREDSvEDIT(shared);
456 SHAREDSvGET(slot) = newSVsv(value);
457 hentry = newSViv((IV)slot);
458 hv_store((HV*) SHAREDSvGET(shared), ckey,len , hentry, 0);
459 SHAREDSvRELEASE(shared);
461 SHAREDSvUNLOCK(shared);
469 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
475 char* ckey = SvPV(key, len);
476 SHAREDSvLOCK(shared);
477 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len,0);
480 if(SvTYPE(hentry) == SVt_NULL) {
481 retval = &PL_sv_undef;
483 slot = (shared_sv*) SvIV(hentry);
484 retval = newSVsv(SHAREDSvGET(slot));
487 retval = &PL_sv_undef;
489 SHAREDSvUNLOCK(shared);
498 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
501 SHAREDSvLOCK(shared);
502 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
503 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
505 slot = (shared_sv*) SvIV(Perl_hv_iterval(PL_sharedsv_space, (HV*) SHAREDSvGET(shared), entry));
506 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
507 entry = Perl_hv_iternext(PL_sharedsv_space,(HV*) SHAREDSvGET(shared));
509 SHAREDSvEDIT(shared);
510 hv_clear((HV*) SHAREDSvGET(shared));
511 SHAREDSvRELEASE(shared);
512 SHAREDSvUNLOCK(shared);
518 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
522 SHAREDSvLOCK(shared);
523 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
524 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
526 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
527 RETVAL = newSVpv(key, len);
529 RETVAL = &PL_sv_undef;
531 SHAREDSvUNLOCK(shared);
537 NEXTKEY(self, oldkey)
541 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
545 SHAREDSvLOCK(shared);
546 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
548 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
549 RETVAL = newSVpv(key, len);
551 RETVAL = &PL_sv_undef;
553 SHAREDSvUNLOCK(shared);
563 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
565 char* ckey = SvPV(key, len);
566 SHAREDSvLOCK(shared);
567 if(hv_exists((HV*)SHAREDSvGET(shared), ckey, len)) {
572 SHAREDSvUNLOCK(shared);
581 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
584 char* ckey = SvPV(key, len);
586 SHAREDSvLOCK(shared);
587 SHAREDSvEDIT(shared);
588 tmp = hv_delete((HV*) SHAREDSvGET(shared), ckey, len,0);
589 SHAREDSvRELEASE(shared);
592 RETVAL = newSVsv(SHAREDSvGET(slot));
593 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
595 RETVAL = &PL_sv_undef;
597 SHAREDSvUNLOCK(shared);