ext/B/B/Xref.pm adding "our" recognition
[p5sagit/p5-mst-13.2.git] / ext / threads / shared / shared.xs
index 34ed30c..cf655cb 100644 (file)
@@ -7,7 +7,7 @@ MGVTBL svtable;
 
 SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
     HV* shared_hv = get_hv("threads::shared::shared", FALSE);
-    SV* id = newSViv((IV)shared);
+    SV* id = newSViv(PTR2IV(shared));
     STRLEN length = sv_len(id);
     SV* tiedobject;
     SV** tiedobject_ = hv_fetch(shared_hv, SvPV(id,length), length, 0);
@@ -26,7 +26,7 @@ SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
                SV* obj_ref = newSViv(0);
                SV* obj = newSVrv(obj_ref,"threads::shared::av");
                AV* hv = newAV();
-               sv_setiv(obj,(IV)shared);
+               sv_setiv(obj,PTR2IV(shared));
                weakref = newRV((SV*)hv);
                sv = newRV_noinc((SV*)hv);
                sv_rvweaken(weakref);
@@ -40,7 +40,7 @@ SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
                SV* obj_ref = newSViv(0);
                SV* obj = newSVrv(obj_ref,"threads::shared::hv");
                HV* hv = newHV();
-               sv_setiv(obj,(IV)shared);
+               sv_setiv(obj,PTR2IV(shared));
                weakref = newRV((SV*)hv);
                sv = newRV_noinc((SV*)hv);
                sv_rvweaken(weakref);
@@ -52,11 +52,11 @@ SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
            default: {
                MAGIC* shared_magic;
                SV* value = newSVsv(SHAREDSvGET(shared));
-               SV* obj = newSViv((IV)shared);
+               SV* obj = newSViv(PTR2IV(shared));
                sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
                shared_magic = mg_find(value, PERL_MAGIC_ext);
                shared_magic->mg_virtual = &svtable;
-               shared_magic->mg_obj = newSViv((IV)shared);
+               shared_magic->mg_obj = newSViv(PTR2IV(shared));
                shared_magic->mg_flags |= MGf_REFCOUNTED;
                shared_magic->mg_private = 0;
                SvMAGICAL_on(value);
@@ -74,11 +74,11 @@ SV* shared_sv_attach_sv (SV* sv, shared_sv* shared) {
 
 
 int shared_sv_fetch_mg (pTHX_ SV* sv, MAGIC *mg) {
-    shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
+    shared_sv* shared = INT2PTR(shared_sv*, SvIV(mg->mg_obj));
     SHAREDSvLOCK(shared);
     if(mg->mg_private != shared->index) {
         if(SvROK(SHAREDSvGET(shared))) {
-            shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared)));
+            shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(shared))));
            shared_sv_attach_sv(sv, target);
         } else {
             sv_setsv(sv, SHAREDSvGET(shared));
@@ -91,10 +91,10 @@ int shared_sv_fetch_mg (pTHX_ SV* sv, MAGIC *mg) {
 }
 
 int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
-    shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
+    shared_sv* shared = INT2PTR(shared_sv*, SvIV(mg->mg_obj));
     SHAREDSvLOCK(shared);
     if(SvROK(SHAREDSvGET(shared)))
-        Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));
+        Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(shared)))));
     if(SvROK(sv)) {
         shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(sv));
         if(!target) {
@@ -104,7 +104,7 @@ int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
         }
         SHAREDSvEDIT(shared);
         Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(shared));
-        SHAREDSvGET(shared) = newRV_noinc(newSViv((IV)target));
+        SHAREDSvGET(shared) = newRV_noinc(newSViv(PTR2IV(target)));
     } else {
             SHAREDSvEDIT(shared);
        sv_setsv(SHAREDSvGET(shared), sv);
@@ -113,18 +113,18 @@ int shared_sv_store_mg (pTHX_ SV* sv, MAGIC *mg) {
     mg->mg_private = shared->index;
     SHAREDSvRELEASE(shared);
     if(SvROK(SHAREDSvGET(shared)))
-       Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(shared))));       
+       Perl_sharedsv_thrcnt_inc(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(shared)))));
     SHAREDSvUNLOCK(shared);
     return 0;
 }
 
 int shared_sv_destroy_mg (pTHX_ SV* sv, MAGIC *mg) {
-    shared_sv* shared = (shared_sv*) SvIV(mg->mg_obj);
+    shared_sv* shared = INT2PTR(shared_sv*, SvIV(mg->mg_obj));
     if(!shared) 
         return 0;
     {
        HV* shared_hv = get_hv("threads::shared::shared", FALSE);
-        SV* id = newSViv((IV)shared);
+        SV* id = newSViv(PTR2IV(shared));
         STRLEN length = sv_len(id);
         hv_delete(shared_hv, SvPV(id,length), length,0);
     }
@@ -141,7 +141,7 @@ MGVTBL svtable = {MEMBER_TO_FPTR(shared_sv_fetch_mg),
 MODULE = threads::shared               PACKAGE = threads::shared               
 
 
-PROTOTYPES: DISABLE
+PROTOTYPES: ENABLE
 
 
 SV*
@@ -171,22 +171,27 @@ _thrcnt(ref)
 
 
 void
-thrcnt_inc(ref)
+thrcnt_inc(ref,perl)
         SV* ref
+       SV* perl
         CODE:
        shared_sv* shared;
+       PerlInterpreter* origperl = INT2PTR(PerlInterpreter*, SvIV(perl));
+       PerlInterpreter* oldperl = PERL_GET_CONTEXT;
         if(SvROK(ref)) 
             ref = SvRV(ref);
         shared = Perl_sharedsv_find(aTHX, ref);
         if(!shared)
            croak("thrcnt can only be used on shared values");
+       PERL_SET_CONTEXT(origperl);
        Perl_sharedsv_thrcnt_inc(aTHX_ shared);
+       PERL_SET_CONTEXT(oldperl);      
 
 void
 _thrcnt_dec(ref)
         SV* ref
         CODE:
-       shared_sv* shared = (shared_sv*) SvIV(ref);
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(ref));
         if(!shared)
            croak("thrcnt can only be used on shared values");
        Perl_sharedsv_thrcnt_dec(aTHX_ shared);
@@ -194,7 +199,7 @@ _thrcnt_dec(ref)
 void 
 unlock_enabled(ref)
        SV* ref
-       PROTOTYPE: \$
+       PROTOTYPE: \[$@%]
        CODE:
        shared_sv* shared;
        if(SvROK(ref))
@@ -207,7 +212,6 @@ unlock_enabled(ref)
 void
 lock_enabled(ref)
         SV* ref
-        PROTOTYPE: \$
         CODE:
         shared_sv* shared;
         if(SvROK(ref))
@@ -221,6 +225,7 @@ lock_enabled(ref)
 void
 cond_wait_enabled(ref)
        SV* ref
+       PROTOTYPE: \[$@%]
        CODE:
        shared_sv* shared;
        int locks;
@@ -237,9 +242,11 @@ cond_wait_enabled(ref)
        COND_WAIT(&shared->user_cond, &shared->mutex);
        shared->owner = PERL_GET_CONTEXT;
        shared->locks = locks;
+       MUTEX_UNLOCK(&shared->mutex);
 
 void cond_signal_enabled(ref)
        SV* ref
+       PROTOTYPE: \[$@%]
        CODE:
        shared_sv* shared;
        if(SvROK(ref))
@@ -252,6 +259,7 @@ void cond_signal_enabled(ref)
 
 void cond_broadcast_enabled(ref)
        SV* ref
+       PROTOTYPE: \[$@%]
        CODE:
        shared_sv* shared;
        if(SvROK(ref))
@@ -270,14 +278,14 @@ new(class, value)
        CODE:
        shared_sv* shared = Perl_sharedsv_new(aTHX);
         MAGIC* shared_magic;
-       SV* obj = newSViv((IV)shared);
+       SV* obj = newSViv(PTR2IV(shared));
        SHAREDSvEDIT(shared);
        SHAREDSvGET(shared) = newSVsv(value);
         SHAREDSvRELEASE(shared);
        sv_magic(value, 0, PERL_MAGIC_ext, "threads::shared", 16);
         shared_magic = mg_find(value, PERL_MAGIC_ext);
         shared_magic->mg_virtual = &svtable;
-        shared_magic->mg_obj = newSViv((IV)shared);
+        shared_magic->mg_obj = newSViv(PTR2IV(shared));
         shared_magic->mg_flags |= MGf_REFCOUNTED;
         shared_magic->mg_private = 0;
         SvMAGICAL_on(value);
@@ -294,7 +302,7 @@ new(class, value)
        SV* value
        CODE:
        shared_sv* shared = Perl_sharedsv_new(aTHX);
-       SV* obj = newSViv((IV)shared);
+       SV* obj = newSViv(PTR2IV(shared));
         SHAREDSvEDIT(shared);
         SHAREDSvGET(shared) = (SV*) newAV();
         SHAREDSvRELEASE(shared);
@@ -308,24 +316,24 @@ STORE(self, index, value)
        SV* index
         SV* value
         CODE:    
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         shared_sv* slot;
         SV* aentry;
        SV** aentry_;
        if(SvROK(value)) {
            shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(value));
            if(!target) {
-                Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
+                Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared array");
            }
-            value = newRV_noinc(newSViv((IV)target));
+            value = newRV_noinc(newSViv(PTR2IV(target)));
         }
        SHAREDSvLOCK(shared);
        aentry_ = av_fetch((AV*) SHAREDSvGET(shared), SvIV(index), 0);
        if(aentry_ && SvIV((*aentry_))) {
            aentry = (*aentry_);
-            slot = (shared_sv*) SvIV(aentry);
+            slot = INT2PTR(shared_sv*, SvIV(aentry));
             if(SvROK(SHAREDSvGET(slot)))
-                Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+                Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
             SHAREDSvEDIT(slot);
             sv_setsv(SHAREDSvGET(slot), value);
             SHAREDSvRELEASE(slot);
@@ -333,12 +341,12 @@ STORE(self, index, value)
             slot = Perl_sharedsv_new(aTHX);
             SHAREDSvEDIT(shared);
             SHAREDSvGET(slot) = newSVsv(value);
-            aentry = newSViv((IV)slot);
+            aentry = newSViv(PTR2IV(slot));
             av_store((AV*) SHAREDSvGET(shared), SvIV(index), aentry);
             SHAREDSvRELEASE(shared);
        }
         if(SvROK(SHAREDSvGET(slot)))
-            Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+            Perl_sharedsv_thrcnt_inc(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
 
         SHAREDSvUNLOCK(shared);
 
@@ -347,7 +355,7 @@ FETCH(self, index)
         SV* self
        SV* index
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
        SV* aentry;
        SV** aentry_;
@@ -359,9 +367,9 @@ FETCH(self, index)
             if(SvTYPE(aentry) == SVt_NULL) {
                retval = &PL_sv_undef;
            } else {
-               slot = (shared_sv*) SvIV(aentry);
+               slot = INT2PTR(shared_sv*, SvIV(aentry));
                if(SvROK(SHAREDSvGET(slot))) {
-                    shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                    shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                     retval = shared_sv_attach_sv(NULL,target);
                } else {
                     retval = newSVsv(SHAREDSvGET(slot));
@@ -379,7 +387,7 @@ void
 PUSH(self, ...)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         int i;
         SHAREDSvLOCK(shared);
        for(i = 1; i < items; i++) {
@@ -388,16 +396,16 @@ PUSH(self, ...)
            if(SvROK(tmp)) {
                  shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(tmp));
                  if(!target) {
-                     Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
+                     Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared array");
                  }
-                 tmp = newRV_noinc(newSViv((IV)target));
+                 tmp = newRV_noinc(newSViv(PTR2IV(target)));
             }
             SHAREDSvEDIT(slot);
            SHAREDSvGET(slot) = newSVsv(tmp);
-           av_push((AV*) SHAREDSvGET(shared), newSViv((IV)slot));          
+           av_push((AV*) SHAREDSvGET(shared), newSViv(PTR2IV(slot)));
            SHAREDSvRELEASE(slot);
            if(SvROK(SHAREDSvGET(slot)))
-                Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+                Perl_sharedsv_thrcnt_inc(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
        }
         SHAREDSvUNLOCK(shared);
 
@@ -405,7 +413,7 @@ void
 UNSHIFT(self, ...)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         int i;
         SHAREDSvLOCK(shared);
        SHAREDSvEDIT(shared);
@@ -417,16 +425,16 @@ UNSHIFT(self, ...)
            if(SvROK(tmp)) {
                  shared_sv* target = Perl_sharedsv_find(aTHX_ SvRV(tmp));
                  if(!target) {
-                     Perl_croak(aTHX_ "You cannot assign a non shared reference to an shared array");
+                     Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared array");
                  }
-                 tmp = newRV_noinc(newSViv((IV)target));
+                 tmp = newRV_noinc(newSViv(PTR2IV(target)));
             }
             SHAREDSvEDIT(slot);
            SHAREDSvGET(slot) = newSVsv(tmp);
-           av_store((AV*) SHAREDSvGET(shared), i - 1, newSViv((IV)slot));
+           av_store((AV*) SHAREDSvGET(shared), i - 1, newSViv(PTR2IV(slot)));
            SHAREDSvRELEASE(slot);
            if(SvROK(SHAREDSvGET(slot)))
-                Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+                Perl_sharedsv_thrcnt_inc(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
        }
         SHAREDSvUNLOCK(shared);
 
@@ -434,7 +442,7 @@ SV*
 POP(self)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
        SV* retval;
        SHAREDSvLOCK(shared);
@@ -442,9 +450,9 @@ POP(self)
        retval = av_pop((AV*)SHAREDSvGET(shared));
        SHAREDSvRELEASE(shared);
        if(retval && SvIV(retval)) {
-           slot = (shared_sv*) SvIV(retval);
+           slot = INT2PTR(shared_sv*, SvIV(retval));
            if(SvROK(SHAREDSvGET(slot))) {
-                shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                 retval = shared_sv_attach_sv(NULL,target);
            } else {
                 retval = newSVsv(SHAREDSvGET(slot));
@@ -463,7 +471,7 @@ SV*
 SHIFT(self)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
        SV* retval;
        SHAREDSvLOCK(shared);
@@ -471,9 +479,9 @@ SHIFT(self)
        retval = av_shift((AV*)SHAREDSvGET(shared));
        SHAREDSvRELEASE(shared);
        if(retval && SvIV(retval)) {
-           slot = (shared_sv*) SvIV(retval);
+           slot = INT2PTR(shared_sv*, SvIV(retval));
             if(SvROK(SHAREDSvGET(slot))) {
-                 shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                 shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                  retval = shared_sv_attach_sv(NULL,target);
             } else {
                  retval = newSVsv(SHAREDSvGET(slot));
@@ -491,7 +499,7 @@ void
 CLEAR(self)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
        SV** svp;
        I32 i;
@@ -500,7 +508,7 @@ CLEAR(self)
        i   = AvFILLp((AV*)SHAREDSvGET(shared));
        while ( i >= 0) {
            if(SvIV(svp[i])) {
-               Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(svp[i]));
+               Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv*, SvIV(svp[i])));
            }
            i--;
        }
@@ -514,7 +522,7 @@ EXTEND(self, count)
        SV* self
        SV* count
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        SHAREDSvEDIT(shared);
        av_extend((AV*)SHAREDSvGET(shared), (I32) SvIV(count));
        SHAREDSvRELEASE(shared);
@@ -527,7 +535,7 @@ EXISTS(self, index)
        SV* self
        SV* index
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        I32 exists;
        SHAREDSvLOCK(shared);
        exists = av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index));
@@ -543,7 +551,7 @@ STORESIZE(self,count)
        SV* self
        SV* count
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        SHAREDSvEDIT(shared);
        av_fill((AV*) SHAREDSvGET(shared), (I32) SvIV(count));
        SHAREDSvRELEASE(shared);
@@ -552,7 +560,7 @@ SV*
 FETCHSIZE(self)
        SV* self
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        SHAREDSvLOCK(shared);
        RETVAL = newSViv(av_len((AV*) SHAREDSvGET(shared)) + 1);
        SHAREDSvUNLOCK(shared);
@@ -564,7 +572,7 @@ DELETE(self,index)
        SV* self
        SV* index
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
        SHAREDSvLOCK(shared);
        if(av_exists((AV*) SHAREDSvGET(shared), (I32) SvIV(index))) {
@@ -573,9 +581,9 @@ DELETE(self,index)
            tmp = av_delete((AV*)SHAREDSvGET(shared), (I32) SvIV(index),0);
            SHAREDSvRELEASE(shared);
            if(SvIV(tmp)) {
-               slot = (shared_sv*) SvIV(tmp);
+               slot = INT2PTR(shared_sv*, SvIV(tmp));
                 if(SvROK(SHAREDSvGET(slot))) {
-                   shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                   shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                    RETVAL = shared_sv_attach_sv(NULL,target);
                 } else {
                    RETVAL = newSVsv(SHAREDSvGET(slot));
@@ -607,7 +615,7 @@ new(class, value)
        SV* value
        CODE:
        shared_sv* shared = Perl_sharedsv_new(aTHX);
-       SV* obj = newSViv((IV)shared);
+       SV* obj = newSViv(PTR2IV(shared));
         SHAREDSvEDIT(shared);
         SHAREDSvGET(shared) = (SV*) newHV();
         SHAREDSvRELEASE(shared);
@@ -621,7 +629,7 @@ STORE(self, key, value)
         SV* key
         SV* value
         CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         shared_sv* slot;
         SV* hentry;
         SV** hentry_;
@@ -634,15 +642,15 @@ STORE(self, key, value)
                Perl_croak(aTHX_ "You cannot assign a non shared reference to a shared hash");
             }
            SHAREDSvEDIT(shared);
-           value = newRV_noinc(newSViv((IV)target));
+           value = newRV_noinc(newSViv(PTR2IV(target)));
            SHAREDSvRELEASE(shared);
        }
         hentry_ = hv_fetch((HV*) SHAREDSvGET(shared), ckey, len, 0);
         if(hentry_ && SvIV((*hentry_))) {
             hentry = (*hentry_);
-            slot = (shared_sv*) SvIV(hentry);
+            slot = INT2PTR(shared_sv*, SvIV(hentry));
             if(SvROK(SHAREDSvGET(slot)))
-                Perl_sharedsv_thrcnt_dec(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+                Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
             SHAREDSvEDIT(slot);
             sv_setsv(SHAREDSvGET(slot), value);
             SHAREDSvRELEASE(slot);
@@ -650,12 +658,12 @@ STORE(self, key, value)
             slot = Perl_sharedsv_new(aTHX);
             SHAREDSvEDIT(shared);
             SHAREDSvGET(slot) = newSVsv(value);
-            hentry = newSViv((IV)slot);
+            hentry = newSViv(PTR2IV(slot));
             hv_store((HV*) SHAREDSvGET(shared), ckey,len , hentry, 0);
             SHAREDSvRELEASE(shared);
         }
        if(SvROK(SHAREDSvGET(slot)))
-           Perl_sharedsv_thrcnt_inc(aTHX_ (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot))));
+           Perl_sharedsv_thrcnt_inc(aTHX_ INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot)))));
         SHAREDSvUNLOCK(shared);
 
 
@@ -664,7 +672,7 @@ FETCH(self, key)
         SV* self
         SV* key
         CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         shared_sv* slot;
         SV* hentry;
         SV** hentry_;
@@ -678,9 +686,9 @@ FETCH(self, key)
             if(SvTYPE(hentry) == SVt_NULL) {
                 retval = &PL_sv_undef;
             } else {
-                slot = (shared_sv*) SvIV(hentry);
+                slot = INT2PTR(shared_sv*, SvIV(hentry));
                if(SvROK(SHAREDSvGET(slot))) {
-                   shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                   shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                    retval = shared_sv_attach_sv(NULL, target);
                } else {
                    retval = newSVsv(SHAREDSvGET(slot));
@@ -698,14 +706,14 @@ void
 CLEAR(self)
        SV* self
        CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         shared_sv* slot;
        HE* entry;
        SHAREDSvLOCK(shared);
        Perl_hv_iterinit(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
        entry = Perl_hv_iternext(PL_sharedsv_space, (HV*) SHAREDSvGET(shared));
        while(entry) {
-               slot = (shared_sv*) SvIV(Perl_hv_iterval(PL_sharedsv_space, (HV*) SHAREDSvGET(shared), entry));
+               slot = INT2PTR(shared_sv*, SvIV(Perl_hv_iterval(PL_sharedsv_space, (HV*) SHAREDSvGET(shared), entry)));
                Perl_sharedsv_thrcnt_dec(aTHX_ slot);
                entry = Perl_hv_iternext(PL_sharedsv_space,(HV*) SHAREDSvGET(shared));
        }
@@ -718,7 +726,7 @@ SV*
 FIRSTKEY(self)
        SV* self
        CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        char* key = NULL;
        I32 len;
        HE* entry;
@@ -741,7 +749,7 @@ NEXTKEY(self, oldkey)
         SV* self
        SV* oldkey
         CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
         char* key = NULL;
         I32 len;
         HE* entry;
@@ -763,7 +771,7 @@ EXISTS(self, key)
        SV* self
        SV* key
        CODE:
-       shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+       shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        STRLEN len;
        char* ckey = SvPV(key, len);
        SHAREDSvLOCK(shared);
@@ -781,7 +789,7 @@ DELETE(self, key)
         SV* self
         SV* key
         CODE:
-        shared_sv* shared = (shared_sv*) SvIV(SvRV(self));
+        shared_sv* shared = INT2PTR(shared_sv*, SvIV(SvRV(self)));
        shared_sv* slot;
         STRLEN len;
         char* ckey = SvPV(key, len);
@@ -791,9 +799,9 @@ DELETE(self, key)
        tmp = hv_delete((HV*) SHAREDSvGET(shared), ckey, len,0);
        SHAREDSvRELEASE(shared);
        if(tmp) {
-               slot = (shared_sv*) SvIV(tmp);
+               slot = INT2PTR(shared_sv*, SvIV(tmp));
                if(SvROK(SHAREDSvGET(slot))) {
-                   shared_sv* target = (shared_sv*) SvIV(SvRV(SHAREDSvGET(slot)));
+                   shared_sv* target = INT2PTR(shared_sv*, SvIV(SvRV(SHAREDSvGET(slot))));
                    RETVAL = shared_sv_attach_sv(NULL, target);
                } else {
                    RETVAL = newSVsv(SHAREDSvGET(slot));