This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline changes into win32 branch. Now would be a good time
authorGurusamy Sarathy <gsar@cpan.org>
Fri, 14 Nov 1997 22:04:58 +0000 (22:04 +0000)
committerGurusamy Sarathy <gsar@cpan.org>
Fri, 14 Nov 1997 22:04:58 +0000 (22:04 +0000)
to reverse integrate the win32 branch into mainline.

p4raw-id: //depot/win32/perl@253

1  2 
MANIFEST
perl.c
perl.h
pp_ctl.c
thread.h

diff --combined MANIFEST
+++ b/MANIFEST
@@@ -212,15 -212,19 +212,19 @@@ ext/Thread/Notes        Thread note
  ext/Thread/README     Thread README
  ext/Thread/Thread/Queue.pm    Thread synchronised queue objects
  ext/Thread/Thread/Semaphore.pm        Thread semaphore objects
+ ext/Thread/Thread/Specific.pm Thread specific data access
  ext/Thread/Thread.pm  Thread extension Perl module
  ext/Thread/Thread.xs  Thread extension external subroutines
  ext/Thread/create.t   Test thread creation
+ ext/Thread/die.t      Test thread die()
+ ext/Thread/die2.t     Test thread die() differently
  ext/Thread/io.t               Test threads doing simple I/O
  ext/Thread/join.t     Test thread joining
  ext/Thread/join2.t    Test thread joining differently
  ext/Thread/list.t     Test getting list of all threads
  ext/Thread/lock.t     Test lock primitive
  ext/Thread/queue.t    Test Thread::Queue module
+ ext/Thread/specific.t Test thread-specific user data
  ext/Thread/sync.t     Test thread synchronisation
  ext/Thread/sync2.t    Test thread synchronisation
  ext/Thread/typemap    Thread extension interface types
@@@ -880,6 -884,8 +884,6 @@@ win32/runperl.c            Win32 por
  win32/splittree.pl    Win32 port
  win32/win32.c         Win32 port
  win32/win32.h         Win32 port
 -win32/win32io.c               Win32 port
 -win32/win32io.h               Win32 port
  win32/win32iop.h      Win32 port
  win32/win32sck.c      Win32 port
  win32/win32thread.h   Win32 port mapping to threads
diff --combined perl.c
--- 1/perl.c
--- 2/perl.c
+++ b/perl.c
@@@ -1226,7 -1226,7 +1226,7 @@@ perl_call_sv(SV *sv, I32 flags
        markstack_ptr--;
        /* we're trying to emulate pp_entertry() here */
        {
-           register CONTEXT *cx;
+           register PERL_CONTEXT *cx;
            I32 gimme = GIMME_V;
            
            ENTER;
            SV **newsp;
            PMOP *newpm;
            I32 gimme;
-           register CONTEXT *cx;
+           register PERL_CONTEXT *cx;
            I32 optype;
  
            POPBLOCK(cx,newpm);
@@@ -1798,7 -1798,6 +1798,7 @@@ init_main_stash(void
      curstash = defstash;
      compiling.cop_stash = defstash;
      debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
 +    globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
      /* We must init $/ before switches are processed. */
      sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
  }
@@@ -2449,8 -2448,8 +2449,8 @@@ init_stacks(ARGSproto
      stack_sp = stack_base;
      stack_max = stack_base + 127;
  
-     cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
-     New(50,cxstack,cxstack_max + 1,CONTEXT);
+     cxstack_max = 8192 / sizeof(PERL_CONTEXT) - 2;    /* Use most of 8K. */
+     New(50,cxstack,cxstack_max + 1,PERL_CONTEXT);
      cxstack_ix        = -1;
  
      New(50,tmps_stack,128,SV*);
@@@ -2844,13 -2843,9 +2844,13 @@@ init_main_thread(
  
  #ifdef HAVE_THREAD_INTERN
      init_thread_intern(thr);
 +#endif
 +
 +#ifdef SET_THREAD_SELF
 +    SET_THREAD_SELF(thr);
  #else
      thr->self = pthread_self();
 -#endif /* HAVE_THREAD_INTERN */
 +#endif /* SET_THREAD_SELF */
      SET_THR(thr);
  
      /*
@@@ -2991,7 -2986,7 +2991,7 @@@ static voi
  my_exit_jump(void)
  {
      dTHR;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 gimme;
      SV **newsp;
  
diff --combined perl.h
--- 1/perl.h
--- 2/perl.h
+++ b/perl.h
@@@ -29,9 -29,6 +29,9 @@@
  
  #include "embed.h"
  
 +#undef START_EXTERN_C
 +#undef END_EXTERN_C
 +#undef EXTERN_C
  #ifdef __cplusplus
  #  define START_EXTERN_C extern "C" {
  #  define END_EXTERN_C }
@@@ -884,11 -881,6 +884,6 @@@ register struct op *op asm(stringify(OP
  
  #endif
  
- /* Digital UNIX defines a typedef CONTEXT when pthreads is in use */ 
- #if defined(__osf__)
- #  define CONTEXT PERL_CONTEXT
- #endif
  typedef MEM_SIZE STRLEN;
  
  typedef struct op OP;
@@@ -917,7 -909,7 +912,7 @@@ typedef struct regexp REGEXP
  typedef struct gp GP;
  typedef struct gv GV;
  typedef struct io IO;
- typedef struct context CONTEXT;
+ typedef struct context PERL_CONTEXT;
  typedef struct block BLOCK;
  
  typedef struct magic MAGIC;
@@@ -1897,7 -1889,6 +1892,7 @@@ IEXT AV *       Idbargs;        /* args to call list
  IEXT HV *     Idefstash;      /* main symbol table */
  IEXT HV *     Icurstash;      /* symbol table for current package */
  IEXT HV *     Idebstash;      /* symbol table for perldb package */
 +IEXT HV *     Iglobalstash;   /* global keyword overrides imported here */
  IEXT SV *     Icurstname;     /* name of current package */
  IEXT AV *     Ibeginav;       /* names of BEGIN subroutines */
  IEXT AV *     Iendav;         /* names of END subroutines */
@@@ -1949,11 -1940,12 +1944,11 @@@ IEXT OP *    Ieval_start
  IEXT COP * VOL        Icurcop IINIT(&compiling);
  IEXT COP *    Icurcopdb IINIT(NULL);
  IEXT line_t   Icopline IINIT(NOLINE);
- IEXT CONTEXT *        Icxstack;
+ IEXT PERL_CONTEXT *   Icxstack;
  IEXT I32      Icxstack_ix IINIT(-1);
  IEXT I32      Icxstack_max IINIT(128);
  IEXT JMPENV   Istart_env;     /* empty startup sigjmp() environment */
  IEXT JMPENV * Itop_env;       /* ptr. to current sigjmp() environment */
 -IEXT I32      Irunlevel;
  
  /* stack stuff */
  IEXT AV *     Icurstack;              /* THE STACK */
diff --combined pp_ctl.c
+++ b/pp_ctl.c
@@@ -105,7 -105,7 +105,7 @@@ PP(pp_substcont
  {
      djSP;
      register PMOP *pm = (PMOP*) cLOGOP->op_other;
-     register CONTEXT *cx = &cxstack[cxstack_ix];
+     register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
      register SV *dstr = cx->sb_dstr;
      register char *s = cx->sb_s;
      register char *m = cx->sb_m;
@@@ -688,7 -688,7 +688,7 @@@ PP(pp_sort
      if (sortcop) {
        if (max > 1) {
            AV *oldstack;
-           CONTEXT *cx;
+           PERL_CONTEXT *cx;
            SV** newsp;
            bool oldcatch = CATCH_GET;
  
@@@ -846,7 -846,7 +846,7 @@@ dopoptolabel(char *label
  {
      dTHR;
      register I32 i;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
  
      for (i = cxstack_ix; i >= 0; i--) {
        cx = &cxstack[i];
@@@ -915,7 -915,7 +915,7 @@@ dopoptosub(I32 startingblock
  {
      dTHR;
      I32 i;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      for (i = startingblock; i >= 0; i--) {
        cx = &cxstack[i];
        switch (cx->cx_type) {
@@@ -935,7 -935,7 +935,7 @@@ dopoptoeval(I32 startingblock
  {
      dTHR;
      I32 i;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      for (i = startingblock; i >= 0; i--) {
        cx = &cxstack[i];
        switch (cx->cx_type) {
@@@ -954,7 -954,7 +954,7 @@@ dopoptoloop(I32 startingblock
  {
      dTHR;
      I32 i;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      for (i = startingblock; i >= 0; i--) {
        cx = &cxstack[i];
        switch (cx->cx_type) {
@@@ -986,7 -986,7 +986,7 @@@ voi
  dounwind(I32 cxix)
  {
      dTHR;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      SV **newsp;
      I32 optype;
  
@@@ -1021,7 -1021,7 +1021,7 @@@ die_where(char *message
      dTHR;
      if (in_eval) {
        I32 cxix;
-       register CONTEXT *cx;
+       register PERL_CONTEXT *cx;
        I32 gimme;
        SV **newsp;
  
@@@ -1110,7 -1110,7 +1110,7 @@@ PP(pp_caller
  {
      djSP;
      register I32 cxix = dopoptosub(cxstack_ix);
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 dbcxix;
      I32 gimme;
      SV *sv;
@@@ -1271,7 -1271,7 +1271,7 @@@ PP(pp_dbstate
      {
        SV **sp;
        register CV *cv;
-       register CONTEXT *cx;
+       register PERL_CONTEXT *cx;
        I32 gimme = G_ARRAY;
        I32 hasargs;
        GV *gv;
@@@ -1314,7 -1314,7 +1314,7 @@@ PP(pp_scope
  PP(pp_enteriter)
  {
      djSP; dMARK;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 gimme = GIMME_V;
      SV **svp;
  
  PP(pp_enterloop)
  {
      djSP;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 gimme = GIMME_V;
  
      ENTER;
  PP(pp_leaveloop)
  {
      djSP;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      struct block_loop cxloop;
      I32 gimme;
      SV **newsp;
@@@ -1404,7 -1404,7 +1404,7 @@@ PP(pp_return
  {
      djSP; dMARK;
      I32 cxix;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      struct block_sub cxsub;
      bool popsub2 = FALSE;
      I32 gimme;
@@@ -1480,7 -1480,7 +1480,7 @@@ PP(pp_last
  {
      djSP;
      I32 cxix;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      struct block_loop cxloop;
      struct block_sub cxsub;
      I32 pop2 = 0;
  PP(pp_next)
  {
      I32 cxix;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 oldsave;
  
      if (op->op_flags & OPf_SPECIAL) {
  PP(pp_redo)
  {
      I32 cxix;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 oldsave;
  
      if (op->op_flags & OPf_SPECIAL) {
@@@ -1663,7 -1663,7 +1663,7 @@@ PP(pp_goto
      djSP;
      OP *retop = 0;
      I32 ix;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
  #define GOTO_DEPTH 64
      OP *enterops[GOTO_DEPTH];
      char *label;
        /* This egregious kludge implements goto &subroutine */
        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
            I32 cxix;
-           register CONTEXT *cx;
+           register PERL_CONTEXT *cx;
            CV* cv = (CV*)SvRV(sv);
            SV** mark;
            I32 items = 0;
@@@ -2055,18 -2055,20 +2055,18 @@@ docatch(OP *o
  {
      dTHR;
      int ret;
 -    I32 oldrunlevel = runlevel;
      OP *oldop = op;
      dJMPENV;
  
      op = o;
  #ifdef DEBUGGING
      assert(CATCH_GET == TRUE);
 -    DEBUG_l(deb("(Setting up local jumplevel, runlevel = %ld)\n", (long)runlevel+1));
 +    DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, top_env));
  #endif
      JMPENV_PUSH(ret);
      switch (ret) {
      default:                          /* topmost level handles it */
        JMPENV_POP;
 -      runlevel = oldrunlevel;
        op = oldop;
        JMPENV_JUMP(ret);
        /* NOTREACHED */
        break;
      }
      JMPENV_POP;
 -    runlevel = oldrunlevel;
      op = oldop;
      return Nullop;
  }
@@@ -2172,7 -2175,7 +2172,7 @@@ doeval(int gimme
      if (yyparse() || error_count || !eval_root) {
        SV **newsp;
        I32 gimme;
-       CONTEXT *cx;
+       PERL_CONTEXT *cx;
        I32 optype;
  
        op = saveop;
  PP(pp_require)
  {
      djSP;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      SV *sv;
      char *name;
      char *tryname;
@@@ -2393,7 -2396,7 +2393,7 @@@ PP(pp_dofile
  PP(pp_entereval)
  {
      djSP;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      dPOPss;
      I32 gimme = GIMME_V, was = sub_generation;
      char tmpbuf[TYPE_DIGITS(long) + 12];
@@@ -2457,7 -2460,7 +2457,7 @@@ PP(pp_leaveeval
      SV **newsp;
      PMOP *newpm;
      I32 gimme;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      OP *retop;
      U8 save_flags = op -> op_flags;
      I32 optype;
  PP(pp_entertry)
  {
      djSP;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 gimme = GIMME_V;
  
      ENTER;
@@@ -2573,7 -2576,7 +2573,7 @@@ PP(pp_leavetry
      SV **newsp;
      PMOP *newpm;
      I32 gimme;
-     register CONTEXT *cx;
+     register PERL_CONTEXT *cx;
      I32 optype;
  
      POPBLOCK(cx,newpm);
diff --combined thread.h
+++ b/thread.h
@@@ -204,13 -204,14 +204,13 @@@ struct thread 
      U8                Tlocalizing;
      COP *     Tcurcop;
  
-     CONTEXT * Tcxstack;
+     PERL_CONTEXT *    Tcxstack;
      I32               Tcxstack_ix;
      I32               Tcxstack_max;
  
      AV *      Tcurstack;
      AV *      Tmainstack;
      JMPENV *  Ttop_env;
 -    I32               Trunlevel;
  
      /* XXX Sort stuff, firstgv, secongv and so on? */
  
@@@ -242,10 -243,10 +242,10 @@@ typedef struct thread *Thread
  #define THRf_ZOMBIE   3
  #define THRf_DEAD     4
  
- #define THRf_DIE_FATAL        8
+ #define THRf_DID_DIE  8
  
  /* ThrSTATE(t) and ThrSETSTATE(t) must only be called while holding t->mutex */
- #define ThrSTATE(t) ((t)->flags)
+ #define ThrSTATE(t) ((t)->flags & THRf_STATE_MASK)
  #define ThrSETSTATE(t, s) STMT_START {                \
        (t)->flags &= ~THRf_STATE_MASK;         \
        (t)->flags |= (s);                      \
@@@ -308,9 -309,9 +308,9 @@@ typedef struct condpair 
  #undef        chopset
  #undef        formtarget
  #undef        bodytarget
 +#undef  start_env
  #undef        toptarget
  #undef        top_env
 -#undef        runlevel
  #undef        in_eval
  #undef        restartop
  #undef        delaymagic
  #define localizing    (thr->Tlocalizing)
  
  #define       top_env         (thr->Ttop_env)
 -#define       runlevel        (thr->Trunlevel)
  #define start_env       (thr->Tstart_env)
  
  #else