In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/28399f576f6389d20835cad7ee86f458880fdcda?hp=34bd199a87daedeaeadd8e9ef48032c8307eaa94>

- Log -----------------------------------------------------------------
commit 28399f576f6389d20835cad7ee86f458880fdcda
Author: Jerry D. Hedden <jdhed...@cpan.org>
Date:   Tue Oct 2 18:58:32 2012 -0400

    Upgrade to threads::shared 1.42

M       dist/threads-shared/shared.xs
M       dist/threads-shared/t/dualvar.t

commit 9095cc4a20b2690cb271de143285b4f1d66237de
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Tue Oct 2 16:11:17 2012 -0700

    Revert "Upgrade to threads::shared 1.42"
    
    This reverts commit 34bd199a87daedeaeadd8e9ef48032c8307eaa94.

M       dist/threads-shared/shared.xs
M       dist/threads-shared/t/dualvar.t
-----------------------------------------------------------------------

Summary of changes:
 dist/threads-shared/shared.xs   |   80 +++++++++++++++++---------------------
 dist/threads-shared/t/dualvar.t |   24 ++++++++++-
 2 files changed, 57 insertions(+), 47 deletions(-)

diff --git a/dist/threads-shared/shared.xs b/dist/threads-shared/shared.xs
index 909643c..3dccc39 100644
--- a/dist/threads-shared/shared.xs
+++ b/dist/threads-shared/shared.xs
@@ -304,6 +304,24 @@ MGVTBL sharedsv_userlock_vtbl = {
 #endif
 };
 
+
+/* Support for dual-valued variables */
+#ifdef SVf_IVisUV
+#  define DUALVAR_FLAGS(sv)                             \
+    ((SvPOK(sv))                                        \
+        ? ((SvNOK(sv) || SvNOKp(sv)) ? SVf_NOK          \
+        : ((SvIsUV(sv)) ? (SVf_IOK | SVf_IVisUV)        \
+        : ((SvIOK(sv) || SvIOKp(sv)) ? SVf_IOK : 0)))   \
+        : 0)
+#else
+#  define DUALVAR_FLAGS(sv)                             \
+    ((SvPOK(sv))                                        \
+        ? ((SvNOK(sv) || SvNOKp(sv)) ? SVf_NOK          \
+        : ((SvIOK(sv) || SvIOKp(sv)) ? SVf_IOK : 0))    \
+        : 0)
+#endif
+
+
 /*
  * Access to shared things is heavily based on MAGIC
  *      - in mg.h/mg.c/sv.c sense
@@ -326,32 +344,7 @@ extern MGVTBL sharedsv_elem_vtbl;      /* Elements of 
hashes and arrays have
 
 /* Get shared aggregate SV pointed to by threads::shared::tie magic object */
 
-STATIC SV *
-S_sharedsv_from_obj(pTHX_ SV *sv)
-{
-    return ((SvROK(sv)) ? INT2PTR(SV *, SvIV(SvRV(sv))) : NULL);
-}
-
-
-/* Return SV flags associated with dual-valued variables */
-U32
-S_get_dualvar_flags(pTHX_ SV *sv)
-{
-    if (SvPOK(sv) && (SvNIOK(sv) || SvNIOKp(sv))) {
-        if (SvNOK(sv) || SvNOKp(sv)) {
-            return SVf_NOK;
-        }
-#ifdef SVf_IVisUV
-        if (SvIsUV(sv)) {
-            return (SVf_IOK | SVf_IVisUV);
-        }
-#endif
-        if (SvIOK(sv) || SvIOKp(sv)) {
-            return SVf_IOK;
-        }
-    }
-    return 0;
-}
+#define SHAREDSV_FROM_OBJ(sv) ((SvROK(sv)) ? INT2PTR(SV *, SvIV(SvRV(sv))) : 
NULL)
 
 
 /* Return the user_lock structure (if any) associated with a shared SV.
@@ -426,7 +419,7 @@ Perl_sharedsv_find(pTHX_ SV *sv)
     }
     /* Just for tidyness of API also handle tie objects */
     if (SvROK(sv) && sv_derived_from(sv, "threads::shared::tie")) {
-        return (S_sharedsv_from_obj(aTHX_ sv));
+        return (SHAREDSV_FROM_OBJ(sv));
     }
     return (NULL);
 }
@@ -906,7 +899,7 @@ int
 sharedsv_elem_mg_FETCH(pTHX_ SV *sv, MAGIC *mg)
 {
     dTHXc;
-    SV *saggregate = S_sharedsv_from_obj(aTHX_ mg->mg_obj);
+    SV *saggregate = SHAREDSV_FROM_OBJ(mg->mg_obj);
     SV** svp = NULL;
 
     ENTER_LOCK;
@@ -956,9 +949,9 @@ int
 sharedsv_elem_mg_STORE(pTHX_ SV *sv, MAGIC *mg)
 {
     dTHXc;
-    SV *saggregate = S_sharedsv_from_obj(aTHX_ mg->mg_obj);
+    SV *saggregate = SHAREDSV_FROM_OBJ(mg->mg_obj);
     SV **svp;
-    U32 dualvar_flags;
+    U32 dualvar_flags = DUALVAR_FLAGS(sv);
 
     /* Theory - SV itself is magically shared - and we have ordered the
        magic such that by the time we get here it has been stored
@@ -986,7 +979,6 @@ sharedsv_elem_mg_STORE(pTHX_ SV *sv, MAGIC *mg)
         svp = hv_fetch((HV*) saggregate, key, len, 1);
     }
     CALLER_CONTEXT;
-    dualvar_flags = S_get_dualvar_flags(aTHX_ sv);
     Perl_sharedsv_associate(aTHX_ sv, *svp);
     sharedsv_scalar_store(aTHX_ sv, *svp);
     SvFLAGS(*svp) |= dualvar_flags;
@@ -1001,7 +993,7 @@ sharedsv_elem_mg_DELETE(pTHX_ SV *sv, MAGIC *mg)
 {
     dTHXc;
     MAGIC *shmg;
-    SV *saggregate = S_sharedsv_from_obj(aTHX_ mg->mg_obj);
+    SV *saggregate = SHAREDSV_FROM_OBJ(mg->mg_obj);
 
     /* Object may not exist during global destruction */
     if (! saggregate) {
@@ -1042,7 +1034,7 @@ int
 sharedsv_elem_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *param)
 {
     PERL_UNUSED_ARG(param);
-    SvREFCNT_inc_void(S_sharedsv_from_obj(aTHX_ mg->mg_obj));
+    SvREFCNT_inc_void(SHAREDSV_FROM_OBJ(mg->mg_obj));
     assert(mg->mg_flags & MGf_DUP);
     return (0);
 }
@@ -1286,12 +1278,12 @@ void
 PUSH(SV *obj, ...)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         int ii;
         for (ii = 1; ii < items; ii++) {
             SV* tmp = newSVsv(ST(ii));
             SV *stmp;
-            U32 dualvar_flags = S_get_dualvar_flags(aTHX_ tmp);
+            U32 dualvar_flags = DUALVAR_FLAGS(tmp);
             ENTER_LOCK;
             stmp = S_sharedsv_new_shared(aTHX_ tmp);
             sharedsv_scalar_store(aTHX_ tmp, stmp);
@@ -1308,7 +1300,7 @@ void
 UNSHIFT(SV *obj, ...)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         int ii;
         ENTER_LOCK;
         SHARED_CONTEXT;
@@ -1316,7 +1308,7 @@ UNSHIFT(SV *obj, ...)
         CALLER_CONTEXT;
         for (ii = 1; ii < items; ii++) {
             SV *tmp = newSVsv(ST(ii));
-            U32 dualvar_flags = S_get_dualvar_flags(aTHX_ tmp);
+            U32 dualvar_flags = DUALVAR_FLAGS(tmp);
             SV *stmp = S_sharedsv_new_shared(aTHX_ tmp);
             sharedsv_scalar_store(aTHX_ tmp, stmp);
             SHARED_CONTEXT;
@@ -1333,7 +1325,7 @@ void
 POP(SV *obj)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         SV* ssv;
         ENTER_LOCK;
         SHARED_CONTEXT;
@@ -1350,7 +1342,7 @@ void
 SHIFT(SV *obj)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         SV* ssv;
         ENTER_LOCK;
         SHARED_CONTEXT;
@@ -1367,7 +1359,7 @@ void
 EXTEND(SV *obj, IV count)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         SHARED_EDIT;
         av_extend((AV*)sobj, count);
         SHARED_RELEASE;
@@ -1377,7 +1369,7 @@ void
 STORESIZE(SV *obj,IV count)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         SHARED_EDIT;
         av_fill((AV*) sobj, count);
         SHARED_RELEASE;
@@ -1387,7 +1379,7 @@ void
 EXISTS(SV *obj, SV *index)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         bool exists;
         if (SvTYPE(sobj) == SVt_PVAV) {
             SHARED_EDIT;
@@ -1412,7 +1404,7 @@ void
 FIRSTKEY(SV *obj)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         char* key = NULL;
         I32 len = 0;
         HE* entry;
@@ -1437,7 +1429,7 @@ void
 NEXTKEY(SV *obj, SV *oldkey)
     CODE:
         dTHXc;
-        SV *sobj = S_sharedsv_from_obj(aTHX_ obj);
+        SV *sobj = SHAREDSV_FROM_OBJ(obj);
         char* key = NULL;
         I32 len = 0;
         HE* entry;
diff --git a/dist/threads-shared/t/dualvar.t b/dist/threads-shared/t/dualvar.t
index 11d2cf4..cc8df21 100644
--- a/dist/threads-shared/t/dualvar.t
+++ b/dist/threads-shared/t/dualvar.t
@@ -13,7 +13,7 @@ use ExtUtils::testlib;
 
 BEGIN {
     $| = 1;
-    print("1..219\n");    ### Number of tests that will be run ###
+    print("1..226\n");    ### Number of tests that will be run ###
 }
 
 use threads;
@@ -133,8 +133,6 @@ ok_uv($suv, $uv);
 {
     print("# Shared array element assignment - shared scalars\n");
 
-    # FAILS
-
     my @ary :shared;
     $ary[0] = $siv;
     $ary[1] = $snv;
@@ -419,9 +417,29 @@ ok_uv($suv, $uv);
     ok_uv($$copy{'uv'}, $uv);
 }
 
+print("# Mix it up with a thread\n");
+my @ary :shared;
+my %hsh :shared;
+
+threads->create(sub {
+                    @ary = ($siv);
+                    push(@ary, $snv);
+
+                    %hsh = ( 'nv' => $ary[1] );
+                    $hsh{'iv'} = $ary[0];
+                    $hsh{'uv'} = $suv;
+
+                    $ary[2] = $hsh{'uv'};
+                })->join();
+
+ok_iv($hsh{'iv'}, $ary[0]);
+ok_nv($hsh{'nv'}, $ary[1]);
+ok_uv($hsh{'uv'}, $ary[2]);
+
 # $! behaves like a dualvar, but is really implemented as a tied SV.
 # As a result sharing $! directly only propagates the string value.
 # However, we can create a dualvar from it.
+print("# Errno\n");
 $! = 1;
 my $ss :shared = dualvar($!,$!);
 ok_iv($ss, $!);

--
Perl5 Master Repository

Reply via email to