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 SHAREDSvRELEASE(shared);
50 sv_setsv(sv,SHAREDSvGET(shared));
51 SHAREDSvUNLOCK(shared);
52 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));
59 sv_setsv(SHAREDSvGET(shared), sv);
62 mg->mg_private = shared->index;
63 SHAREDSvRELEASE(shared);
64 if(SvROK(SHAREDSvGET(shared)))
65 Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
66 SHAREDSvUNLOCK(shared);
70 int shared_sv_destroy_mg (pTHX_ SV* sv, MAGIC *mg) {
71 shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
74 Perl_sharedsv_thrcnt_dec(aTHX_ shared);
77 MGVTBL svtable = {MEMBER_TO_FPTR(shared_sv_fetch_mg),
78 MEMBER_TO_FPTR(shared_sv_store_mg),
81 MEMBER_TO_FPTR(shared_sv_destroy_mg)
84 MODULE = threads::shared PACKAGE = threads::shared
94 RETVAL = newSViv(SvIV(SvRV(ref)));
103 shared_sv* shared = Perl_sharedsv_find(aTHX, ref);
105 croak("thrcnt can only be used on shared values");
106 SHAREDSvLOCK(shared);
107 RETVAL = newSViv(SvREFCNT(SHAREDSvGET(shared)));
108 SHAREDSvUNLOCK(shared);
120 shared = Perl_sharedsv_find(aTHX, ref);
122 croak("thrcnt can only be used on shared values");
123 Perl_sharedsv_thrcnt_inc(aTHX_ shared);
126 MODULE = threads::shared PACKAGE = threads::shared::sv
133 shared_sv* shared = Perl_sharedsv_new(aTHX);
135 SV* obj = newSViv((IV)shared);
136 SHAREDSvEDIT(shared);
137 SHAREDSvGET(shared) = newSVsv(value);
138 SHAREDSvRELEASE(shared);
139 sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
140 shared_magic = mg_find(value, PERL_MAGIC_ext);
141 shared_magic->mg_virtual = &svtable;
142 shared_magic->mg_obj = newSViv((IV)shared);
143 shared_magic->mg_flags |= MGf_REFCOUNTED;
144 shared_magic->mg_private = 0;
151 MODULE = threads::shared PACKAGE = threads::shared::av
158 shared_sv* shared = Perl_sharedsv_new(aTHX);
159 SV* obj = newSViv((IV)shared);
160 SHAREDSvEDIT(shared);
161 SHAREDSvGET(shared) = (SV*) newAV();
162 SHAREDSvRELEASE(shared);
168 STORE(self, index, value)
173 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
177 SHAREDSvLOCK(shared);
178 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index), 0);
179 if(aentry_ && SvIV((*aentry_))) {
181 slot = (shared_sv*) SvIV(aentry);
182 if(SvROK(SHAREDSvGET(slot)))
183 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
185 sv_setsv(SHAREDSvGET(slot), value);
186 SHAREDSvRELEASE(slot);
188 slot = Perl_sharedsv_new(aTHX);
189 SHAREDSvEDIT(shared);
190 SHAREDSvGET(slot) = newSVsv(value);
191 aentry = newSViv((IV)slot);
192 av_store((AV*) SHAREDSvGET(shared), SvIV(index), aentry);
193 SHAREDSvRELEASE(shared);
195 SHAREDSvUNLOCK(shared);
202 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
207 SHAREDSvLOCK(shared);
208 aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index),0);
211 if(SvTYPE(aentry) == SVt_NULL) {
212 retval = &PL_sv_undef;
214 slot = (shared_sv*) SvIV(aentry);
215 retval = newSVsv(SHAREDSvGET(slot));
218 retval = &PL_sv_undef;
220 SHAREDSvUNLOCK(shared);
229 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
231 SHAREDSvLOCK(shared);
232 for(i = 1; i < items; i++) {
233 shared_sv* slot = Perl_sharedsv_new(aTHX);
236 SHAREDSvGET(slot) = newSVsv(tmp);
237 av_push((AV*) SHAREDSvGET(shared), newSViv((IV)slot));
238 SHAREDSvRELEASE(slot);
240 SHAREDSvUNLOCK(shared);
246 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
248 SHAREDSvLOCK(shared);
249 SHAREDSvEDIT(shared);
250 av_unshift((AV*)SHAREDSvGET(shared), items - 1);
251 SHAREDSvRELEASE(shared);
252 for(i = 1; i < items; i++) {
253 shared_sv* slot = Perl_sharedsv_new(aTHX);
256 SHAREDSvGET(slot) = newSVsv(tmp);
257 av_store((AV*) SHAREDSvGET(shared), i - 1, newSViv((IV)slot));
258 SHAREDSvRELEASE(slot);
260 SHAREDSvUNLOCK(shared);
266 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
269 SHAREDSvLOCK(shared);
270 SHAREDSvEDIT(shared);
271 retval = av_pop((AV*)SHAREDSvGET(shared));
272 SHAREDSvRELEASE(shared);
273 if(retval && SvIV(retval)) {
274 slot = (shared_sv*) SvIV(retval);
275 retval = newSVsv(SHAREDSvGET(slot));
276 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
278 retval = &PL_sv_undef;
280 SHAREDSvUNLOCK(shared);
290 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
293 SHAREDSvLOCK(shared);
294 SHAREDSvEDIT(shared);
295 retval = av_shift((AV*)SHAREDSvGET(shared));
296 SHAREDSvRELEASE(shared);
297 if(retval && SvIV(retval)) {
298 slot = (shared_sv*) SvIV(retval);
299 retval = newSVsv(SHAREDSvGET(slot));
300 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
302 retval = &PL_sv_undef;
304 SHAREDSvUNLOCK(shared);
313 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
317 SHAREDSvLOCK(shared);
318 svp = AvARRAY((AV*)SHAREDSvGET(shared));
319 i = AvFILLp((AV*)SHAREDSvGET(shared));
322 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(svp[i]));
326 SHAREDSvEDIT(shared);
327 av_clear((AV*)SHAREDSvGET(shared));
328 SHAREDSvRELEASE(shared);
329 SHAREDSvUNLOCK(shared);
336 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
337 SHAREDSvEDIT(shared);
338 av_extend((AV*)SHAREDSvGET(shared), (I32) SvIV(count));
339 SHAREDSvRELEASE(shared);
349 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
351 SHAREDSvLOCK(shared);
352 exists = av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index));
358 SHAREDSvUNLOCK(shared);
361 STORESIZE(self,count)
365 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
366 SHAREDSvEDIT(shared);
367 av_fill((AV*) SHAREDSvGET(shared), (I32) SvIV(count));
368 SHAREDSvRELEASE(shared);
374 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
375 SHAREDSvLOCK(shared);
376 RETVAL = newSViv(av_len((AV*) SHAREDSvGET(shared)) + 1);
377 SHAREDSvUNLOCK(shared);
386 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
388 SHAREDSvLOCK(shared);
389 if(av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index))) {
391 SHAREDSvEDIT(shared);
392 tmp = av_delete((AV*)SHAREDSvGET(shared), (I32) SvIV(index),0);
393 SHAREDSvRELEASE(shared);
395 slot = (shared_sv*) SvIV(tmp);
396 RETVAL = newSVsv(SHAREDSvGET(slot));
397 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
399 RETVAL = &PL_sv_undef;
402 RETVAL = &PL_sv_undef;
404 SHAREDSvUNLOCK(shared);
409 SPLICE(self, offset, length, ...)
414 croak("Splice is not implmented for shared arrays");
416 MODULE = threads::shared PACKAGE = threads::shared::hv
423 shared_sv* shared = Perl_sharedsv_new(aTHX);
424 SV* obj = newSViv((IV)shared);
425 SHAREDSvEDIT(shared);
426 SHAREDSvGET(shared) = (SV*) newHV();
427 SHAREDSvRELEASE(shared);
433 STORE(self, key, value)
438 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
443 char* ckey = SvPV(key, len);
444 SHAREDSvLOCK(shared);
445 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len, 0);
446 if(hentry_ && SvIV((*hentry_))) {
448 slot = (shared_sv*) SvIV(hentry);
449 if(SvROK(SHAREDSvGET(slot)))
450 Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
452 sv_setsv(SHAREDSvGET(slot), value);
453 SHAREDSvRELEASE(slot);
455 slot = Perl_sharedsv_new(aTHX);
456 SHAREDSvEDIT(shared);
457 SHAREDSvGET(slot) = newSVsv(value);
458 hentry = newSViv((IV)slot);
459 hv_store((HV*) SHAREDSvGET(shared), ckey,len , hentry, 0);
460 SHAREDSvRELEASE(shared);
462 SHAREDSvUNLOCK(shared);
470 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
476 char* ckey = SvPV(key, len);
477 SHAREDSvLOCK(shared);
478 hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len,0);
481 if(SvTYPE(hentry) == SVt_NULL) {
482 retval = &PL_sv_undef;
484 slot = (shared_sv*) SvIV(hentry);
485 retval = newSVsv(SHAREDSvGET(slot));
488 retval = &PL_sv_undef;
490 SHAREDSvUNLOCK(shared);
499 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
502 SHAREDSvLOCK(shared);
503 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
504 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
506 slot = (shared_sv*) SvIV(Perl_hv_iterval(PL_sharedsv_space, (HV*) SHAREDSvGET(shared), entry));
507 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
508 entry = Perl_hv_iternext(PL_sharedsv_space,(HV*) SHAREDSvGET(shared));
510 SHAREDSvEDIT(shared);
511 hv_clear((HV*) SHAREDSvGET(shared));
512 SHAREDSvRELEASE(shared);
513 SHAREDSvUNLOCK(shared);
519 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
523 SHAREDSvLOCK(shared);
524 Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
525 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
527 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
528 RETVAL = newSVpv(key, len);
530 RETVAL = &PL_sv_undef;
532 SHAREDSvUNLOCK(shared);
538 NEXTKEY(self, oldkey)
542 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
546 SHAREDSvLOCK(shared);
547 entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
549 key = Perl_hv_iterkey(PL_sharedsv_space, entry,&len);
550 RETVAL = newSVpv(key, len);
552 RETVAL = &PL_sv_undef;
554 SHAREDSvUNLOCK(shared);
564 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
566 char* ckey = SvPV(key, len);
567 SHAREDSvLOCK(shared);
568 if(hv_exists((HV*)SHAREDSvGET(shared), ckey, len)) {
573 SHAREDSvUNLOCK(shared);
582 shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
585 char* ckey = SvPV(key, len);
587 SHAREDSvLOCK(shared);
588 SHAREDSvEDIT(shared);
589 tmp = hv_delete((HV*) SHAREDSvGET(shared), ckey, len,0);
590 SHAREDSvRELEASE(shared);
593 RETVAL = newSVsv(SHAREDSvGET(slot));
594 Perl_sharedsv_thrcnt_dec(aTHX_ slot);
596 RETVAL = &PL_sv_undef;
598 SHAREDSvUNLOCK(shared);