Allow $SIG{CHLD}='IGNORE' to work on Solaris
[p5sagit/p5-mst-13.2.git] / sv.h
diff --git a/sv.h b/sv.h
index 4dfa2c2..d75ec5a 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -72,13 +72,42 @@ struct io {
 #define SvFLAGS(sv)    (sv)->sv_flags
 #define SvREFCNT(sv)   (sv)->sv_refcnt
 
+#ifdef USE_THREADS
+
+#  ifdef EMULATE_ATOMIC_REFCOUNTS
+#    define ATOMIC_INC(count) STMT_START {     \
+       MUTEX_LOCK(&svref_mutex);               \
+       ++count;                                \
+       MUTEX_UNLOCK(&svref_mutex);             \
+     } STMT_END
+#    define ATOMIC_DEC_AND_TEST(res,count) STMT_START {        \
+       MUTEX_LOCK(&svref_mutex);                       \
+       res = (--count == 0);                           \
+       MUTEX_UNLOCK(&svref_mutex);                     \
+     } STMT_END
+#  else
+#    define ATOMIC_INC(count) atomic_inc(&count)
+#    define ATOMIC_DEC_AND_TEST(res,count) (res = atomic_dec_and_test(&count))
+#  endif /* EMULATE_ATOMIC_REFCOUNTS */
+#else
+#  define ATOMIC_INC(count) (++count)
+#  define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))
+#endif /* USE_THREADS */
+
 #ifdef __GNUC__
-#  define SvREFCNT_inc(sv) ({SV* nsv=(SV*)(sv); if(nsv) ++SvREFCNT(nsv); nsv;})
+#  define SvREFCNT_inc(sv)             \
+    ({                                 \
+       SV *nsv = (SV*)(sv);            \
+       if (nsv)                        \
+            ATOMIC_INC(SvREFCNT(nsv)); \
+       nsv;                            \
+    })
 #else
 #  if defined(CRIPPLED_CC) || defined(USE_THREADS)
 #    define SvREFCNT_inc(sv) sv_newref((SV*)sv)
 #  else
-#    define SvREFCNT_inc(sv) ((Sv=(SV*)(sv)), (Sv && ++SvREFCNT(Sv)), (SV*)Sv)
+#    define SvREFCNT_inc(sv)   \
+       ((Sv=(SV*)(sv)), (Sv && ATOMIC_INC(SvREFCNT(Sv))), (SV*)Sv)
 #  endif
 #endif
 
@@ -120,6 +149,8 @@ struct io {
 
 #ifdef OVERLOAD
 #define SVf_AMAGIC    0x10000000      /* has magical overloaded methods */
+#else
+#define SVf_AMAGIC    0               /* can be or-ed without effect */
 #endif /* OVERLOAD */
 
 #define PRIVSHIFT 8
@@ -166,6 +197,7 @@ struct xpvnv {
     double     xnv_nv;         /* numeric value, if any */
 };
 
+/* These structure must match the beginning of struct xpvhv in hv.h. */
 struct xpvmg {
     char *     xpv_pv;         /* pointer to malloced string */
     STRLEN     xpv_cur;        /* length of xpv_pv as a C string */
@@ -237,7 +269,7 @@ struct xpvfm {
     HV *       xcv_stash;
     OP *       xcv_start;
     OP *       xcv_root;
-    void      (*xcv_xsub)_((CV*));
+    void      (*xcv_xsub)_((CV* _CPERLproto));
     ANY                xcv_xsubany;
     GV *       xcv_gv;
     GV *       xcv_filegv;
@@ -294,13 +326,8 @@ struct xpvio {
                                                  SVp_IOK|SVp_NOK))
 
 #define SvOK(sv)               (SvFLAGS(sv) & SVf_OK)
-
-#ifdef OVERLOAD
 #define SvOK_off(sv)           (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC),   \
                                                        SvOOK_off(sv))
-#else
-#define SvOK_off(sv)           (SvFLAGS(sv) &= ~SVf_OK, SvOOK_off(sv))
-#endif /* OVERLOAD */
 
 #define SvOKp(sv)              (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK))
 #define SvIOKp(sv)             (SvFLAGS(sv) & SVp_IOK)
@@ -314,7 +341,7 @@ struct xpvio {
 #define SvIOK_on(sv)           (SvOOK_off(sv), \
                                    SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
 #define SvIOK_off(sv)          (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK))
-#define SvIOK_only(sv)         (SvOOK_off(sv), SvOK_off(sv), \
+#define SvIOK_only(sv)         (SvOK_off(sv), \
                                    SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
 
 #define SvNOK(sv)              (SvFLAGS(sv) & SVf_NOK)
@@ -326,14 +353,8 @@ struct xpvio {
 #define SvPOK(sv)              (SvFLAGS(sv) & SVf_POK)
 #define SvPOK_on(sv)           (SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 #define SvPOK_off(sv)          (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
-
-#ifdef OVERLOAD
-#define SvPOK_only(sv)            (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC),   \
-                                   SvFLAGS(sv) |= (SVf_POK|SVp_POK))
-#else
-#define SvPOK_only(sv)            (SvFLAGS(sv) &= ~SVf_OK, \
+#define SvPOK_only(sv)         (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC),   \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
-#endif /* OVERLOAD */
 
 #define SvOOK(sv)              (SvFLAGS(sv) & SVf_OOK)
 #define SvOOK_on(sv)           (SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
@@ -345,12 +366,7 @@ struct xpvio {
 
 #define SvROK(sv)              (SvFLAGS(sv) & SVf_ROK)
 #define SvROK_on(sv)           (SvFLAGS(sv) |= SVf_ROK)
-
-#ifdef OVERLOAD
 #define SvROK_off(sv)          (SvFLAGS(sv) &= ~(SVf_ROK|SVf_AMAGIC))
-#else
-#define SvROK_off(sv)          (SvFLAGS(sv) &= ~SVf_ROK)
-#endif /* OVERLOAD */
 
 #define SvMAGICAL(sv)          (SvFLAGS(sv) & (SVs_GMG|SVs_SMG|SVs_RMG))
 #define SvMAGICAL_on(sv)       (SvFLAGS(sv) |= (SVs_GMG|SVs_SMG|SVs_RMG))
@@ -600,16 +616,6 @@ struct xpvio {
 #endif /* !CRIPPLED_CC */
 
 #define newRV_inc(sv)  newRV(sv)
-#ifdef __GNUC__
-#  undef newRV_noinc
-#  define newRV_noinc(sv) ({SV *nsv=newRV((sv)); --SvREFCNT(SvRV(nsv)); nsv;})
-#else
-#  if defined(CRIPPLED_CC) || defined(USE_THREADS) || defined(PERL_OBJECT)
-#  else
-#    undef newRV_noinc
-#    define newRV_noinc(sv)    ((Sv = newRV(sv)), --SvREFCNT(SvRV(Sv)), Sv)
-#  endif
-#endif /* __GNUC__ */
 
 /* the following macros update any magic values this sv is associated with */