From: Gurusamy Sarathy Date: Wed, 8 Mar 2000 12:08:17 +0000 (+0000) Subject: add missing locks for op refcounts X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=534825c439e9bf017f3cdaf88d284d58d5eac6bd;p=p5sagit%2Fp5-mst-13.2.git add missing locks for op refcounts p4raw-id: //depot/perl@5610 --- diff --git a/dosish.h b/dosish.h index 7b2a1bd..be7020d 100644 --- 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 /* diff --git a/embedvar.h b/embedvar.h index f754940..f8387c5 100644 --- a/embedvar.h +++ b/embedvar.h @@ -1648,6 +1648,7 @@ #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) @@ -1659,6 +1660,7 @@ #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 diff --git a/makedef.pl b/makedef.pl index 1170ba5..0aec81e 100644 --- a/makedef.pl +++ b/makedef.pl @@ -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 --- a/op.c +++ b/op.c @@ -22,19 +22,6 @@ /* #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 --- 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 --- 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 \ diff --git a/perlapi.h b/perlapi.h index 70a2187..5e5ac28 100644 --- 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 diff --git a/perlvars.h b/perlvars.h index 4df31bb..bd07adc 100644 --- a/perlvars.h +++ b/perlvars.h @@ -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 --- 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 diff --git a/unixish.h b/unixish.h index 24da429..1168d29 100644 --- a/unixish.h +++ b/unixish.h @@ -135,7 +135,7 @@ #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" diff --git a/vms/vmsish.h b/vms/vmsish.h index a09d2be..6c5c506 100644 --- a/vms/vmsish.h +++ b/vms/vmsish.h @@ -257,7 +257,7 @@ #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