add missing locks for op refcounts
Gurusamy Sarathy [Wed, 8 Mar 2000 12:08:17 +0000 (12:08 +0000)]
p4raw-id: //depot/perl@5610

dosish.h
embedvar.h
makedef.pl
op.c
op.h
perl.c
perlapi.h
perlvars.h
sv.c
unixish.h
vms/vmsish.h

index 7b2a1bd..be7020d 100644 (file)
--- a/dosish.h
+++ b/dosish.h
@@ -30,7 +30,7 @@
 #  endif
 #endif /* DJGPP */
 
-#define PERL_SYS_TERM() MALLOC_TERM
+#define PERL_SYS_TERM() OP_REFCNT_TERM; MALLOC_TERM
 #define dXSUB_SYS
 
 /*
index f754940..f8387c5 100644 (file)
 #define PL_do_undump           (PL_Vars.Gdo_undump)
 #define PL_hexdigit            (PL_Vars.Ghexdigit)
 #define PL_malloc_mutex                (PL_Vars.Gmalloc_mutex)
+#define PL_op_mutex            (PL_Vars.Gop_mutex)
 #define PL_patleave            (PL_Vars.Gpatleave)
 #define PL_thr_key             (PL_Vars.Gthr_key)
 
 #define PL_Gdo_undump          PL_do_undump
 #define PL_Ghexdigit           PL_hexdigit
 #define PL_Gmalloc_mutex       PL_malloc_mutex
+#define PL_Gop_mutex           PL_op_mutex
 #define PL_Gpatleave           PL_patleave
 #define PL_Gthr_key            PL_thr_key
 
index 1170ba5..0aec81e 100644 (file)
@@ -413,6 +413,7 @@ unless ($define{'USE_5005THREADS'}) {
 unless ($define{'USE_ITHREADS'}) {
     skip_symbols [qw(
                    PL_ptr_table
+                   PL_op_mutex
                    Perl_dirp_dup
                    Perl_cx_dup
                    Perl_si_dup
diff --git a/op.c b/op.c
index 11ff181..d6a16db 100644 (file)
--- a/op.c
+++ b/op.c
 
 /* #define PL_OP_SLAB_ALLOC */
 
-/* XXXXXX testing */
-#ifdef USE_ITHREADS
-#  define OP_REFCNT_LOCK               NOOP
-#  define OP_REFCNT_UNLOCK             NOOP
-#  define OpREFCNT_set(o,n)            ((o)->op_targ = (n))
-#  define OpREFCNT_dec(o)              (--(o)->op_targ)
-#else
-#  define OP_REFCNT_LOCK               NOOP
-#  define OP_REFCNT_UNLOCK             NOOP
-#  define OpREFCNT_set(o,n)            NOOP
-#  define OpREFCNT_dec(o)              0
-#endif
-
 #ifdef PL_OP_SLAB_ALLOC 
 #define SLAB_SIZE 8192
 static char    *PL_OpPtr  = NULL;
diff --git a/op.h b/op.h
index c9ec2df..da03aa4 100644 (file)
--- a/op.h
+++ b/op.h
@@ -401,3 +401,20 @@ struct loop {
 #define OA_SCALARREF 7
 #define OA_OPTIONAL 8
 
+#ifdef USE_ITHREADS
+#  define OP_REFCNT_INIT               MUTEX_INIT(&PL_op_mutex)
+#  define OP_REFCNT_LOCK               MUTEX_LOCK(&PL_op_mutex)
+#  define OP_REFCNT_UNLOCK             MUTEX_UNLOCK(&PL_op_mutex)
+#  define OP_REFCNT_TERM               MUTEX_DESTROY(&PL_op_mutex)
+#  define OpREFCNT_set(o,n)            ((o)->op_targ = (n))
+#  define OpREFCNT_inc(o)              ((o) ? (++(o)->op_targ, (o)) : Nullop)
+#  define OpREFCNT_dec(o)              (--(o)->op_targ)
+#else
+#  define OP_REFCNT_INIT               NOOP
+#  define OP_REFCNT_LOCK               NOOP
+#  define OP_REFCNT_UNLOCK             NOOP
+#  define OP_REFCNT_TERM               NOOP
+#  define OpREFCNT_set(o,n)            NOOP
+#  define OpREFCNT_inc(o)              (o)
+#  define OpREFCNT_dec(o)              0
+#endif
diff --git a/perl.c b/perl.c
index 2dbfc8e..715f4da 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -64,8 +64,12 @@ static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
            PERL_SET_INTERP(my_perl);           \
            INIT_THREADS;                       \
            ALLOC_THREAD_KEY;                   \
+           PERL_SET_THX(my_perl);              \
+           OP_REFCNT_INIT;                     \
+       }                                       \
+       else {                                  \
+           PERL_SET_THX(my_perl);              \
        }                                       \
-       PERL_SET_THX(my_perl);                  \
     } STMT_END
 #  else
 #  define INIT_TLS_AND_INTERP \
index 70a2187..5e5ac28 100644 (file)
--- a/perlapi.h
+++ b/perlapi.h
@@ -878,6 +878,8 @@ START_EXTERN_C
 #define PL_hexdigit            (*Perl_Ghexdigit_ptr(NULL))
 #undef  PL_malloc_mutex
 #define PL_malloc_mutex                (*Perl_Gmalloc_mutex_ptr(NULL))
+#undef  PL_op_mutex
+#define PL_op_mutex            (*Perl_Gop_mutex_ptr(NULL))
 #undef  PL_patleave
 #define PL_patleave            (*Perl_Gpatleave_ptr(NULL))
 #undef  PL_thr_key
index 4df31bb..bd07adc 100644 (file)
@@ -34,3 +34,7 @@ PERLVARI(Gdo_undump,  bool,   FALSE)  /* -u or dump seen? */
 #if defined(MYMALLOC) && (defined(USE_THREADS) || defined(USE_ITHREADS))
 PERLVAR(Gmalloc_mutex, perl_mutex)     /* Mutex for malloc */
 #endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Gop_mutex,     perl_mutex)     /* Mutex for op refcounting */
+#endif
diff --git a/sv.c b/sv.c
index 6f40d6f..ff21757 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -6382,10 +6382,6 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
 #  include "error: USE_THREADS and USE_ITHREADS are incompatible"
 #endif
 
-#ifndef OpREFCNT_inc
-#  define OpREFCNT_inc(o)      ((o) ? (++(o)->op_targ, (o)) : Nullop)
-#endif
-
 #ifndef GpREFCNT_inc
 #  define GpREFCNT_inc(gp)     ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
 #endif
index 24da429..1168d29 100644 (file)
--- a/unixish.h
+++ b/unixish.h
 #endif
 
 #ifndef PERL_SYS_TERM
-#define PERL_SYS_TERM()                MALLOC_TERM
+#define PERL_SYS_TERM()                OP_REFCNT_TERM; MALLOC_TERM
 #endif
 
 #define BIT_BUCKET "/dev/null"
index a09d2be..6c5c506 100644 (file)
 
 #define BIT_BUCKET "_NLA0:"
 #define PERL_SYS_INIT(c,v)     vms_image_init((c),(v)); MALLOC_INIT
-#define PERL_SYS_TERM()                MALLOC_TERM
+#define PERL_SYS_TERM()                OP_REFCNT_TERM; MALLOC_TERM
 #define dXSUB_SYS
 #define HAS_KILL
 #define HAS_WAIT