PERFORCE change 12699 for review

[email protected] (Chris Nandor) Fri, 26 Oct 2001 19:11:37 -0400
Newsgroups perl.perl5.changes.mac
Message-ID <p05100302b7ff9e1fcbc7@[10.0.1.177]>
Change 12699 by pudge@pudge-mobile on 2001/10/26 20:49:00

	Integrate a buncha things from maintperl.

Affected files ...

... //depot/maint-5.6/macperl/ext/B/B.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DB_File/DB_File.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_aix.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_beos.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_dld.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_dllload.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_dlopen.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_dyld.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_hpux.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_mac.xs#3 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_mpeix.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_next.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_vmesa.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dl_vms.xs#2 integrate
... //depot/maint-5.6/macperl/ext/DynaLoader/dlutils.c#2 integrate
... //depot/maint-5.6/macperl/ext/File/Glob/Glob.xs#2 integrate
... //depot/maint-5.6/macperl/ext/ODBM_File/ODBM_File.xs#2 integrate
... //depot/maint-5.6/macperl/ext/Opcode/Opcode.xs#2 integrate
... //depot/maint-5.6/macperl/ext/re/re.xs#2 integrate
... //depot/maint-5.6/macperl/gv.c#4 integrate
... //depot/maint-5.6/macperl/iperlsys.h#2 integrate
... //depot/maint-5.6/macperl/makedef.pl#3 integrate
... //depot/maint-5.6/macperl/mg.c#3 integrate
... //depot/maint-5.6/macperl/op.c#3 integrate
... //depot/maint-5.6/macperl/perl.h#5 integrate
... //depot/maint-5.6/macperl/scope.c#2 integrate
... //depot/maint-5.6/macperl/toke.c#4 integrate
... //depot/maint-5.6/macperl/util.c#4 integrate
... //depot/maint-5.6/macperl/win32/dl_win32.xs#2 integrate
... //depot/maint-5.6/macperl/win32/vmem.h#2 integrate
... //depot/maint-5.6/macperl/win32/win32.c#5 integrate
... //depot/maint-5.6/macperl/win32/win32iop.h#2 integrate

Differences ...

==== //depot/maint-5.6/macperl/ext/B/B.xs#2 (text) ====
Index: perl/ext/B/B.xs
--- perl/ext/B/B.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/B/B.xs	Fri Oct 26 15:00:05 2001
@@ -79,9 +79,17 @@
     "B::COP"	
 };
 
-static int walkoptree_debug = 0;	/* Flag for walkoptree debug hook */
+#define MY_CXT_KEY "B::_guts" XS_VERSION
+
+typedef struct {
+    int		x_walkoptree_debug;	/* Flag for walkoptree debug hook */
+    SV *	x_specialsv_list[6];
+} my_cxt_t;
+
+START_MY_CXT
 
-static SV *specialsv_list[6];
+#define walkoptree_debug	(MY_CXT.x_walkoptree_debug)
+#define specialsv_list		(MY_CXT.x_specialsv_list)
 
 static opclass
 cc_opclass(pTHX_ OP *o)
@@ -201,6 +209,7 @@
 {
     char *type = 0;
     IV iv;
+    dMY_CXT;
     
     for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
 	if (sv == specialsv_list[iv]) {
@@ -321,7 +330,8 @@
 {
     dSP;
     OP *o;
-    
+    dMY_CXT;
+
     if (!SvROK(opsv))
 	croak("opsv is not a reference");
     opsv = sv_mortalcopy(opsv);
@@ -382,6 +392,7 @@
 {
     HV *stash = gv_stashpvn("B", 1, TRUE);
     AV *export_ok = perl_get_av("B::EXPORT_OK",TRUE);
+    MY_CXT_INIT;
     specialsv_list[0] = Nullsv;
     specialsv_list[1] = &PL_sv_undef;
     specialsv_list[2] = &PL_sv_yes;
@@ -449,6 +460,7 @@
 int
 walkoptree_debug(...)
     CODE:
+	dMY_CXT;
 	RETVAL = walkoptree_debug;
 	if (items > 0 && SvTRUE(ST(1)))
 	    walkoptree_debug = 1;

==== //depot/maint-5.6/macperl/ext/DB_File/DB_File.xs#2 (text) ====
Index: perl/ext/DB_File/DB_File.xs
--- perl/ext/DB_File/DB_File.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DB_File/DB_File.xs	Fri Oct 26 15:00:05 2001
@@ -420,10 +420,21 @@
 
 
 /* Internal Global Data */
-static recno_t Value ; 
-static recno_t zero = 0 ;
-static DB_File CurrentDB ;
-static DBTKEY empty ;
+#define MY_CXT_KEY "DB_File::_guts" XS_VERSION
+
+typedef struct {
+    recno_t	x_Value; 
+    recno_t	x_zero;
+    DB_File	x_CurrentDB;
+    DBTKEY	x_empty;
+} my_cxt_t;
+
+START_MY_CXT
+
+#define Value		(MY_CXT.x_Value)
+#define zero		(MY_CXT.x_zero)
+#define CurrentDB	(MY_CXT.x_CurrentDB)
+#define empty		(MY_CXT.x_empty)
 
 #ifdef DB_VERSION_MAJOR
 
@@ -517,6 +528,7 @@
     dTHX;
 #endif    
     dSP ;
+    dMY_CXT;
     void * data1, * data2 ;
     int retval ;
     int count ;
@@ -588,6 +600,7 @@
     dTHX;
 #endif    
     dSP ;
+    dMY_CXT;
     void * data1, * data2 ;
     int retval ;
     int count ;
@@ -666,6 +679,7 @@
     dTHX;
 #endif    
     dSP ;
+    dMY_CXT;
     int retval ;
     int count ;
 
@@ -841,6 +855,7 @@
     void *	openinfo = NULL ;
     INFO	* info  = &RETVAL->info ;
     STRLEN	n_a;
+    dMY_CXT;
 
 /* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ;  */
     Zero(RETVAL, 1, DB_File_type) ;
@@ -1114,6 +1129,7 @@
     DB *	dbp ;
     STRLEN	n_a;
     int		status ;
+    dMY_CXT;
 
 /* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ;  */
     Zero(RETVAL, 1, DB_File_type) ;
@@ -1596,6 +1612,7 @@
 
 BOOT:
   {
+    MY_CXT_INIT;
     __getBerkeleyDBInfo() ;
  
     DBT_clear(empty) ; 
@@ -1637,6 +1654,8 @@
 int
 db_DESTROY(db)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	INIT:
 	  CurrentDB = db ;
 	CLEANUP:
@@ -1668,6 +1687,8 @@
 	DB_File		db
 	DBTKEY		key
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	INIT:
 	  CurrentDB = db ;
 
@@ -1676,6 +1697,8 @@
 db_EXISTS(db, key)
 	DB_File		db
 	DBTKEY		key
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	{
           DBT		value ;
@@ -1692,6 +1715,8 @@
 	DB_File		db
 	DBTKEY		key
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	{
             DBT		value ;
@@ -1710,6 +1735,8 @@
 	DBTKEY		key
 	DBT		value
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	INIT:
 	  CurrentDB = db ;
 
@@ -1717,6 +1744,8 @@
 int
 db_FIRSTKEY(db)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	{
 	    DBTKEY	key ;
@@ -1734,6 +1763,8 @@
 db_NEXTKEY(db, key)
 	DB_File		db
 	DBTKEY		key
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	{
 	    DBT		value ;
@@ -1753,6 +1784,8 @@
 unshift(db, ...)
 	DB_File		db
 	ALIAS:		UNSHIFT = 1
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	{
 	    DBTKEY	key ;
@@ -1794,6 +1827,8 @@
 I32
 pop(db)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	ALIAS:		POP = 1
 	CODE:
 	{
@@ -1821,6 +1856,8 @@
 I32
 shift(db)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	ALIAS:		SHIFT = 1
 	CODE:
 	{
@@ -1848,6 +1885,8 @@
 I32
 push(db, ...)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	ALIAS:		PUSH = 1
 	CODE:
 	{
@@ -1890,6 +1929,8 @@
 I32
 length(db)
 	DB_File		db
+	PREINIT:
+	  dMY_CXT;
 	ALIAS:		FETCHSIZE = 1
 	CODE:
 	    CurrentDB = db ;
@@ -1907,6 +1948,8 @@
 	DB_File		db
 	DBTKEY		key
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 	  RETVAL = db_del(db, key, flags) ;
@@ -1926,6 +1969,8 @@
 	DBTKEY		key
 	DBT		value = NO_INIT
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 	  DBT_clear(value) ; 
@@ -1946,6 +1991,8 @@
 	DBTKEY		key
 	DBT		value
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 	  RETVAL = db_put(db, key, value, flags) ;
@@ -1963,6 +2010,8 @@
 db_fd(db)
 	DB_File		db
 	int		status = 0 ;
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 #ifdef DB_VERSION_MAJOR
@@ -1984,6 +2033,8 @@
 db_sync(db, flags=0)
 	DB_File		db
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 	  RETVAL = db_sync(db, flags) ;
@@ -2001,6 +2052,8 @@
 	DBTKEY		key 
 	DBT		value = NO_INIT
 	u_int		flags
+	PREINIT:
+	  dMY_CXT;
 	CODE:
 	  CurrentDB = db ;
 	  DBT_clear(value) ; 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_aix.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_aix.xs
--- perl/ext/DynaLoader/dl_aix.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_aix.xs	Fri Oct 26 15:00:05 2001
@@ -118,23 +118,35 @@
 	ExportPtr	exports;	/* the array of exports */
 } Module, *ModulePtr;
 
-/*
- * We keep a list of all loaded modules to be able to reference count
- * duplicate dlopen's.
- */
-static ModulePtr modList;		/* XXX threaded */
+typedef struct {
+    /*
+     * We keep a list of all loaded modules to be able to reference count
+     * duplicate dlopen's.
+     */
+    ModulePtr	x_modList;
+
+    /*
+     * The last error from one of the dl* routines is kept in static
+     * variables here. Each error is returned only once to the caller.
+     */
+    char	x_errbuf[BUFSIZ];
+    int		x_errvalid;
+    void *	x_mainModule;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
+#include "dlutils.c"	/* SaveError() etc	*/
 
-/*
- * The last error from one of the dl* routines is kept in static
- * variables here. Each error is returned only once to the caller.
- */
-static char errbuf[BUFSIZ];		/* XXX threaded */
-static int errvalid;			/* XXX threaded */
+#define dl_modList	(dl_cxtx.x_modList)
+#define dl_errbuf	(dl_cxtx.x_errbuf)
+#define dl_errvalid	(dl_cxtx.x_errvalid)
+#define dl_mainModule	(dl_cxtx.x_mainModule)
 
 static void caterr(char *);
 static int readExports(ModulePtr);
 static void *findMain(void);
 
+/* these statics are ok because they're constants */
 static char *strerror_failed   = "(strerror failed)";
 static char *strerror_r_failed = "(strerror_r failed)";
 
@@ -199,37 +211,37 @@
 void *dlopen(char *path, int mode)
 {
 	dTHX;
+	dMY_CXT;
 	register ModulePtr mp;
-	static void *mainModule;		/* XXX threaded */
 
 	/*
 	 * Upon the first call register a terminate handler that will
 	 * close all libraries.
 	 */
-	if (mainModule == NULL) {
-		if ((mainModule = findMain()) == NULL)
+	if (dl_mainModule == NULL) {
+		if ((dl_mainModule = findMain()) == NULL)
 			return NULL;
 	}
 	/*
 	 * Scan the list of modules if have the module already loaded.
 	 */
-	for (mp = modList; mp; mp = mp->next)
+	for (mp = dl_modList; mp; mp = mp->next)
 		if (strcmp(mp->name, path) == 0) {
 			mp->refCnt++;
 			return mp;
 		}
 	Newz(1000,mp,1,Module);
 	if (mp == NULL) {
-		errvalid++;
-		strcpy(errbuf, "Newz: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "Newz: ");
+		strerrorcat(dl_errbuf, errno);
 		return NULL;
 	}
 	
 	if ((mp->name = savepv(path)) == NULL) {
-		errvalid++;
-		strcpy(errbuf, "savepv: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "savepv: ");
+		strerrorcat(dl_errbuf, errno);
 		safefree(mp);
 		return NULL;
 	}
@@ -248,10 +260,10 @@
 		
 		safefree(mp->name);
 		safefree(mp);
-		errvalid++;
-		strcpy(errbuf, "dlopen: ");
-		strcat(errbuf, path);
-		strcat(errbuf, ": ");
+		dl_errvalid++;
+		strcpy(dl_errbuf, "dlopen: ");
+		strcat(dl_errbuf, path);
+		strcat(dl_errbuf, ": ");
 		/*
 		 * If AIX says the file is not executable, the error
 		 * can be further described by querying the loader about
@@ -260,19 +272,19 @@
 		if (saverrno == ENOEXEC) {
 			char *moreinfo[BUFSIZ/sizeof(char *)];
 			if (loadquery(L_GETMESSAGES, moreinfo, sizeof(moreinfo)) == -1)
-				strerrorcpy(errbuf, saverrno);
+				strerrorcpy(dl_errbuf, saverrno);
 			else {
 				char **p;
 				for (p = moreinfo; *p; p++)
 					caterr(*p);
 			}
 		} else
-			strerrorcat(errbuf, saverrno);
+			strerrorcat(dl_errbuf, saverrno);
 		return NULL;
 	}
 	mp->refCnt = 1;
-	mp->next = modList;
-	modList = mp;
+	mp->next = dl_modList;
+	dl_modList = mp;
 	/*
 	 * Assume anonymous exports come from the module this dlopen
 	 * is linked into, that holds true as long as dlopen and all
@@ -282,13 +294,13 @@
 	 * also reference Apache symbols.
 	 */
 	if (loadbind(0, (void *)dlopen, mp->entry) == -1 ||
-	    loadbind(0, mainModule, mp->entry)) {
+	    loadbind(0, dl_mainModule, mp->entry)) {
 	        int saverrno = errno;
 
 		dlclose(mp);
-		errvalid++;
-		strcpy(errbuf, "loadbind: ");
-		strerrorcat(errbuf, saverrno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "loadbind: ");
+		strerrorcat(dl_errbuf, saverrno);
 		return NULL;
 	}
 	if (readExports(mp) == -1) {
@@ -304,41 +316,45 @@
  */
 static void caterr(char *s)
 {
+	dTHX;
+	dMY_CXT;
 	register char *p = s;
 
 	while (*p >= '0' && *p <= '9')
 		p++;
 	switch(atoi(s)) {
 	case L_ERROR_TOOMANY:
-		strcat(errbuf, "too many errors");
+		strcat(dl_errbuf, "too many errors");
 		break;
 	case L_ERROR_NOLIB:
-		strcat(errbuf, "can't load library");
-		strcat(errbuf, p);
+		strcat(dl_errbuf, "can't load library");
+		strcat(dl_errbuf, p);
 		break;
 	case L_ERROR_UNDEF:
-		strcat(errbuf, "can't find symbol");
-		strcat(errbuf, p);
+		strcat(dl_errbuf, "can't find symbol");
+		strcat(dl_errbuf, p);
 		break;
 	case L_ERROR_RLDBAD:
-		strcat(errbuf, "bad RLD");
-		strcat(errbuf, p);
+		strcat(dl_errbuf, "bad RLD");
+		strcat(dl_errbuf, p);
 		break;
 	case L_ERROR_FORMAT:
-		strcat(errbuf, "bad exec format in");
-		strcat(errbuf, p);
+		strcat(dl_errbuf, "bad exec format in");
+		strcat(dl_errbuf, p);
 		break;
 	case L_ERROR_ERRNO:
-		strerrorcat(errbuf, atoi(++p));
+		strerrorcat(dl_errbuf, atoi(++p));
 		break;
 	default:
-		strcat(errbuf, s);
+		strcat(dl_errbuf, s);
 		break;
 	}
 }
 
 void *dlsym(void *handle, const char *symbol)
 {
+	dTHX;
+	dMY_CXT;
 	register ModulePtr mp = (ModulePtr)handle;
 	register ExportPtr ep;
 	register int i;
@@ -350,23 +366,27 @@
 	for (ep = mp->exports, i = mp->nExports; i; i--, ep++)
 		if (strcmp(ep->name, symbol) == 0)
 			return ep->addr;
-	errvalid++;
-	strcpy(errbuf, "dlsym: undefined symbol ");
-	strcat(errbuf, symbol);
+	dl_errvalid++;
+	strcpy(dl_errbuf, "dlsym: undefined symbol ");
+	strcat(dl_errbuf, symbol);
 	return NULL;
 }
 
 char *dlerror(void)
 {
-	if (errvalid) {
-		errvalid = 0;
-		return errbuf;
+	dTHX;
+	dMY_CXT;
+	if (dl_errvalid) {
+		dl_errvalid = 0;
+		return dl_errbuf;
 	}
 	return NULL;
 }
 
 int dlclose(void *handle)
 {
+	dTHX;
+	dMY_CXT;
 	register ModulePtr mp = (ModulePtr)handle;
 	int result;
 	register ModulePtr mp1;
@@ -375,8 +395,8 @@
 		return 0;
 	result = UNLOAD(mp->entry);
 	if (result == -1) {
-		errvalid++;
-		strerrorcpy(errbuf, errno);
+		dl_errvalid++;
+		strerrorcpy(dl_errbuf, errno);
 	}
 	if (mp->exports) {
 		register ExportPtr ep;
@@ -386,10 +406,10 @@
 				safefree(ep->name);
 		safefree(mp->exports);
 	}
-	if (mp == modList)
-		modList = mp->next;
+	if (mp == dl_modList)
+		dl_modList = mp->next;
 	else {
-		for (mp1 = modList; mp1; mp1 = mp1->next)
+		for (mp1 = dl_modList; mp1; mp1 = mp1->next)
 			if (mp1->next == mp) {
 				mp1->next = mp->next;
 				break;
@@ -421,6 +441,7 @@
 static int readExports(ModulePtr mp)
 {
 	dTHX;
+	dMY_CXT;
 	LDFILE *ldp = NULL;
 	AIX_SCNHDR sh;
 	AIX_LDHDR *lhp;
@@ -434,9 +455,9 @@
 		char *buf;
 		int size = 4*1024;
 		if (errno != ENOENT) {
-			errvalid++;
-			strcpy(errbuf, "readExports: ");
-			strerrorcat(errbuf, errno);
+			dl_errvalid++;
+			strcpy(dl_errbuf, "readExports: ");
+			strerrorcat(dl_errbuf, errno);
 			return -1;
 		}
 		/*
@@ -445,25 +466,25 @@
 		 * module using L_GETINFO.
 		 */
 		if ((buf = safemalloc(size)) == NULL) {
-			errvalid++;
-			strcpy(errbuf, "readExports: ");
-			strerrorcat(errbuf, errno);
+			dl_errvalid++;
+			strcpy(dl_errbuf, "readExports: ");
+			strerrorcat(dl_errbuf, errno);
 			return -1;
 		}
 		while ((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) {
 			safefree(buf);
 			size += 4*1024;
 			if ((buf = safemalloc(size)) == NULL) {
-				errvalid++;
-				strcpy(errbuf, "readExports: ");
-				strerrorcat(errbuf, errno);
+				dl_errvalid++;
+				strcpy(dl_errbuf, "readExports: ");
+				strerrorcat(dl_errbuf, errno);
 				return -1;
 			}
 		}
 		if (i == -1) {
-			errvalid++;
-			strcpy(errbuf, "readExports: ");
-			strerrorcat(errbuf, errno);
+			dl_errvalid++;
+			strcpy(dl_errbuf, "readExports: ");
+			strerrorcat(dl_errbuf, errno);
 			safefree(buf);
 			return -1;
 		}
@@ -485,9 +506,9 @@
 		}
 		safefree(buf);
 		if (!ldp) {
-			errvalid++;
-			strcpy(errbuf, "readExports: ");
-			strerrorcat(errbuf, errno);
+			dl_errvalid++;
+			strcpy(dl_errbuf, "readExports: ");
+			strerrorcat(dl_errbuf, errno);
 			return -1;
 		}
 	}
@@ -496,15 +517,15 @@
 #else
 	if (TYPE(ldp) != U802TOCMAGIC) {
 #endif
-		errvalid++;
-		strcpy(errbuf, "readExports: bad magic");
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: bad magic");
 		while(ldclose(ldp) == FAILURE)
 			;
 		return -1;
 	}
 	if (ldnshread(ldp, _LOADER, &sh) != SUCCESS) {
-		errvalid++;
-		strcpy(errbuf, "readExports: cannot read loader section header");
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: cannot read loader section header");
 		while(ldclose(ldp) == FAILURE)
 			;
 		return -1;
@@ -514,16 +535,16 @@
 	 * finding long symbol names residing in the string table easier.
 	 */
 	if ((ldbuf = (char *)safemalloc(sh.s_size)) == NULL) {
-		errvalid++;
-		strcpy(errbuf, "readExports: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: ");
+		strerrorcat(dl_errbuf, errno);
 		while(ldclose(ldp) == FAILURE)
 			;
 		return -1;
 	}
 	if (FSEEK(ldp, sh.s_scnptr, BEGINNING) != OKFSEEK) {
-		errvalid++;
-		strcpy(errbuf, "readExports: cannot seek to loader section");
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: cannot seek to loader section");
 		safefree(ldbuf);
 		while(ldclose(ldp) == FAILURE)
 			;
@@ -532,8 +553,8 @@
 /* This first case is a hack, since it assumes that the 3rd parameter to
    FREAD is 1. See the redefinition of FREAD above to see how this works. */
 	if (FREAD(ldbuf, sh.s_size, 1, ldp) != 1) {
-		errvalid++;
-		strcpy(errbuf, "readExports: cannot read loader section");
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: cannot read loader section");
 		safefree(ldbuf);
 		while(ldclose(ldp) == FAILURE)
 			;
@@ -551,9 +572,9 @@
 	}
 	Newz(1001, mp->exports, mp->nExports, Export);
 	if (mp->exports == NULL) {
-		errvalid++;
-		strcpy(errbuf, "readExports: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "readExports: ");
+		strerrorcat(dl_errbuf, errno);
 		safefree(ldbuf);
 		while(ldclose(ldp) == FAILURE)
 			;
@@ -593,6 +614,8 @@
  */
 static void * findMain(void)
 {
+	dTHX;
+	dMY_CXT;
 	struct ld_info *lp;
 	char *buf;
 	int size = 4*1024;
@@ -600,25 +623,25 @@
 	void *ret;
 
 	if ((buf = safemalloc(size)) == NULL) {
-		errvalid++;
-		strcpy(errbuf, "findMain: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "findMain: ");
+		strerrorcat(dl_errbuf, errno);
 		return NULL;
 	}
 	while ((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) {
 		safefree(buf);
 		size += 4*1024;
 		if ((buf = safemalloc(size)) == NULL) {
-			errvalid++;
-			strcpy(errbuf, "findMain: ");
-			strerrorcat(errbuf, errno);
+			dl_errvalid++;
+			strcpy(dl_errbuf, "findMain: ");
+			strerrorcat(dl_errbuf, errno);
 			return NULL;
 		}
 	}
 	if (i == -1) {
-		errvalid++;
-		strcpy(errbuf, "findMain: ");
-		strerrorcat(errbuf, errno);
+		dl_errvalid++;
+		strcpy(dl_errbuf, "findMain: ");
+		strerrorcat(dl_errbuf, errno);
 		safefree(buf);
 		return NULL;
 	}
@@ -654,9 +677,6 @@
 
 */
 
-#include "dlutils.c"	/* SaveError() etc	*/
-
-
 static void
 dl_private_init(pTHX)
 {
@@ -737,7 +757,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_beos.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_beos.xs
--- perl/ext/DynaLoader/dl_beos.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_beos.xs	Fri Oct 26 15:00:05 2001
@@ -110,7 +110,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_dld.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_dld.xs
--- perl/ext/DynaLoader/dl_dld.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_dld.xs	Fri Oct 26 15:00:05 2001
@@ -42,31 +42,41 @@
 #include <dld.h>	/* GNU DLD header file */
 #include <unistd.h>
 
+typedef struct {
+    AV *	x_resolve_using;
+    AV *	x_require_symbols;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
 #include "dlutils.c"	/* for SaveError() etc */
 
-static AV *dl_resolve_using   = Nullav;
-static AV *dl_require_symbols = Nullav;
+#define dl_resolve_using	(dl_cxtx.x_resolve_using)
+#define dl_require_symbols	(dl_cxtx.x_require_symbols)
 
 static void
 dl_private_init(pTHX)
 {
-    int dlderr;
     dl_generic_private_init(aTHX);
-    dl_resolve_using   = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
-    dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
+    {
+	int dlderr;
+	dMY_CXT;
+
+	dl_resolve_using   = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+	dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
 #ifdef __linux__
-    dlderr = dld_init("/proc/self/exe");
-    if (dlderr) {
+	dlderr = dld_init("/proc/self/exe");
+	if (dlderr) {
 #endif
-        dlderr = dld_init(dld_find_executable(PL_origargv[0]));
-        if (dlderr) {
-            char *msg = dld_strerror(dlderr);
-            SaveError(aTHX_ "dld_init(%s) failed: %s", PL_origargv[0], msg);
-            DLDEBUG(1,PerlIO_printf(Perl_debug_log, "%s", LastError));
-        }
+	    dlderr = dld_init(dld_find_executable(PL_origargv[0]));
+	    if (dlderr) {
+		char *msg = dld_strerror(dlderr);
+		SaveError(aTHX_ "dld_init(%s) failed: %s", PL_origargv[0], msg);
+		DLDEBUG(1,PerlIO_printf(Perl_debug_log, "%s", dl_last_error));
+	    }
 #ifdef __linux__
+	}
+#endif
     }
-#endif
 }
 
 
@@ -83,6 +93,7 @@
     PREINIT:
     int dlderr,x,max;
     GV *gv;
+    dMY_CXT;
     CODE:
     RETVAL = filename;
     DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
@@ -170,7 +181,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_dllload.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_dllload.xs
--- perl/ext/DynaLoader/dl_dllload.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_dllload.xs	Fri Oct 26 15:00:05 2001
@@ -182,7 +182,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_dlopen.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_dlopen.xs
--- perl/ext/DynaLoader/dl_dlopen.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_dlopen.xs	Fri Oct 26 15:00:05 2001
@@ -174,8 +174,11 @@
     }
 #endif
 #ifdef RTLD_NOW
-    if (dl_nonlazy)
-	mode = RTLD_NOW;
+    {
+	dMY_CXT;
+	if (dl_nonlazy)
+	    mode = RTLD_NOW;
+    }
 #endif
     if (flags & 0x01)
 #ifdef RTLD_GLOBAL
@@ -252,7 +255,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_dyld.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_dyld.xs
--- perl/ext/DynaLoader/dl_dyld.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_dyld.xs	Fri Oct 26 15:00:05 2001
@@ -41,19 +41,16 @@
 #include "perl.h"
 #include "XSUB.h"
 
-#define DL_LOADONCEONLY
-
-#include "dlutils.c"	/* SaveError() etc	*/
+#include "dlutils.c"	/* for SaveError() etc */
 
 #undef environ
 #undef bool
 #import <mach-o/dyld.h>
 
-static char * dl_last_error = (char *) 0;
-static AV *dl_resolve_using = Nullav;
-
 static char *dlerror()
 {
+    dTHX;
+    dMY_CXT;
     return dl_last_error;
 }
 
@@ -72,6 +69,7 @@
     (const char *path, enum dyldErrorSource type, int number)
 {
     dTHX;
+    dMY_CXT;
     char *error;
     unsigned int index;
     static char *OFIErrorStrings[] =
@@ -147,7 +145,6 @@
 dl_private_init(pTHX)
 {
     (void)dl_generic_private_init(aTHX);
-    dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
 }
 
 MODULE = DynaLoader     PACKAGE = DynaLoader
@@ -219,7 +216,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_hpux.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_hpux.xs
--- perl/ext/DynaLoader/dl_hpux.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_hpux.xs	Fri Oct 26 15:00:05 2001
@@ -26,17 +26,23 @@
 #include "perl.h"
 #include "XSUB.h"
 
+typedef struct {
+    AV *	x_resolve_using;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
 
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
 #include "dlutils.c"	/* for SaveError() etc */
 
-static AV *dl_resolve_using = Nullav;
+#define dl_resolve_using	(dl_cxtx.x_resolve_using)
 
-
 static void
 dl_private_init(pTHX)
 {
     (void)dl_generic_private_init(aTHX);
-    dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+    {
+	dMY_CXT;
+	dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+    }
 }
 
 MODULE = DynaLoader     PACKAGE = DynaLoader
@@ -52,6 +58,7 @@
     PREINIT:
     shl_t obj = NULL;
     int	i, max, bind_type;
+    dMY_CXT;
     CODE:
     DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
     if (flags & 0x01)
@@ -152,7 +159,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_mac.xs#3 (text) ====
Index: perl/ext/DynaLoader/dl_mac.xs
--- perl/ext/DynaLoader/dl_mac.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_mac.xs	Fri Oct 26 15:00:05 2001
@@ -23,21 +23,27 @@
 
 #include <CodeFragments.h>
 
+typedef CFragConnectionID ConnectionID;
+
+typedef struct {
+    ConnectionID **	x_connections;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
 
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
 #include "dlutils.c"	/* SaveError() etc	*/
 
-typedef CFragConnectionID ConnectionID;
+#define dl_connections	(dl_cxtx.x_connections)
 
-static ConnectionID **	connections;
-
 static void terminate(void)
 {
-    int size = GetHandleSize((Handle) connections) / sizeof(ConnectionID);
-    HLock((Handle) connections);
+    dTHX;
+    dMY_CXT;
+    int size = GetHandleSize((Handle) dl_connections) / sizeof(ConnectionID);
+    HLock((Handle) dl_connections);
     while (size)
-    	CloseConnection(*connections + --size);
-    DisposeHandle((Handle) connections);
-    connections = nil;
+    	CloseConnection(*dl_connections + --size);
+    DisposeHandle((Handle) dl_connections);
+    dl_connections = nil;
 }
 
 static void
@@ -70,11 +76,12 @@
 	    GetDiskFragment(
 	    	&spec, 0, 0, spec.name, kLoadCFrag, &connID, &mainAddr, errName);
     if (!err) {
-    	if (!connections) {
-	    connections = (ConnectionID **)NewHandle(0);
+	dMY_CXT;
+    	if (!dl_connections) {
+	    dl_connections = (ConnectionID **)NewHandle(0);
 	    atexit(terminate);
     	}
-        PtrAndHand((Ptr) &connID, (Handle) connections, sizeof(ConnectionID));
+        PtrAndHand((Ptr) &connID, (Handle) dl_connections, sizeof(ConnectionID));
     	RETVAL = connID;
     } else
     	RETVAL = (ConnectionID) 0;
@@ -130,7 +137,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_mpeix.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_mpeix.xs
--- perl/ext/DynaLoader/dl_mpeix.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_mpeix.xs	Fri Oct 26 15:00:05 2001
@@ -30,13 +30,10 @@
   char  filename[PATH_MAX + 3];
   } t_mpe_dld, *p_mpe_dld;
 
-static AV *dl_resolve_using = Nullav;
-
 static void
 dl_private_init(pTHX)
 {
     (void)dl_generic_private_init(aTHX);
-    dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
 }
 
 MODULE = DynaLoader     PACKAGE = DynaLoader
@@ -124,7 +121,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_next.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_next.xs
--- perl/ext/DynaLoader/dl_next.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_next.xs	Fri Oct 26 15:00:05 2001
@@ -44,14 +44,19 @@
 
 #define DL_LOADONCEONLY
 
+typedef struct {
+    AV *	x_resolve_using;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
 #include "dlutils.c"	/* SaveError() etc	*/
 
+#define dl_resolve_using	(dl_cxtx.x_resolve_using)
 
-static char * dl_last_error = (char *) 0;
-static AV *dl_resolve_using = Nullav;
-
 static char *dlerror()
 {
+    dTHX;
+    dMY_CXT;
     return dl_last_error;
 }
 
@@ -73,6 +78,7 @@
     (const char *path, enum dyldErrorSource type, int number)
 {
     dTHX;
+    dMY_CXT;
     char *error;
     unsigned int index;
     static char *OFIErrorStrings[] =
@@ -150,6 +156,8 @@
 {
     char *buffer;
     int len, maxlen;
+    dTHX;
+    dMY_CXT;
 
     if ( dl_last_error ) {
         Safefree(dl_last_error);
@@ -174,6 +182,8 @@
     char *result;
     char **p;
     STRLEN n_a;
+    dTHX;
+    dMY_CXT;
 	
     /* Do not load what is already loaded into this process */
     if (hv_fetch(dl_loaded_files, path, strlen(path), 0))
@@ -226,7 +236,10 @@
 dl_private_init(pTHX)
 {
     (void)dl_generic_private_init(aTHX);
-    dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+    {
+	dMY_CXT;
+	dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+    }
 }
  
 MODULE = DynaLoader     PACKAGE = DynaLoader
@@ -300,7 +313,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_vmesa.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_vmesa.xs
--- perl/ext/DynaLoader/dl_vmesa.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_vmesa.xs	Fri Oct 26 15:00:05 2001
@@ -168,7 +168,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL
  

==== //depot/maint-5.6/macperl/ext/DynaLoader/dl_vms.xs#2 (text) ====
Index: perl/ext/DynaLoader/dl_vms.xs
--- perl/ext/DynaLoader/dl_vms.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dl_vms.xs	Fri Oct 26 15:00:05 2001
@@ -49,12 +49,8 @@
 #include "perl.h"
 #include "XSUB.h"
 
-#include "dlutils.c"    /* dl_debug, LastError; SaveError not used  */
-
-static AV *dl_require_symbols = Nullav;
-
 /* N.B.:
- * dl_debug and LastError are static vars; you'll need to deal
+ * dl_debug and dl_last_error are static vars; you'll need to deal
  * with them appropriately if you need context independence
  */
 
@@ -78,35 +74,50 @@
   struct dsc$descriptor_s defspec;
 };
 
-/* Static data for dl_expand_filespec() - This is static to save
+typedef struct {
+    AV *	x_require_symbols;
+/* "Static" data for dl_expand_filespec() - This is static to save
  * initialization on each call; if you need context-independence,
  * just make these auto variables in dl_expandspec() and dl_load_file()
  */
-static char dlesa[NAM$C_MAXRSS], dlrsa[NAM$C_MAXRSS];
-static struct FAB dlfab;
-static struct NAM dlnam;
+    char	x_esa[NAM$C_MAXRSS];
+    char	x_rsa[NAM$C_MAXRSS];
+    struct FAB	x_fab;
+    struct NAM	x_nam;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
+#include "dlutils.c"    /* dl_debug, dl_last_error; SaveError not used  */
+
+#define dl_require_symbols	(dl_cxtx.x_require_symbols)
+#define dl_esa			(dl_cxtx.x_esa)
+#define dl_rsa			(dl_cxtx.x_rsa)
+#define dl_fab			(dl_cxtx.x_fab)
+#define dl_nam			(dl_cxtx.x_nam)
 
-/* $PutMsg action routine - records error message in LastError */
+/* $PutMsg action routine - records error message in dl_last_error */
 static vmssts
 copy_errmsg(msg,unused)
     struct dsc$descriptor_s *   msg;
     vmssts  unused;
 {
+    dTHX;
+    dMY_CXT;
     if (*(msg->dsc$a_pointer) == '%') { /* first line */
-      if (LastError)
-        strncpy((LastError = saferealloc(LastError,msg->dsc$w_length+1)),
+      if (dl_last_error)
+        strncpy((dl_last_error = saferealloc(dl_last_error,msg->dsc$w_length+1)),
                  msg->dsc$a_pointer, msg->dsc$w_length);
       else
-        strncpy((LastError = safemalloc(msg->dsc$w_length+1)),
+        strncpy((dl_last_error = safemalloc(msg->dsc$w_length+1)),
                  msg->dsc$a_pointer, msg->dsc$w_length);
-      LastError[msg->dsc$w_length] = '\0';
+      dl_last_error[msg->dsc$w_length] = '\0';
     }
     else { /* continuation line */
-      int errlen = strlen(LastError);
-      LastError = saferealloc(LastError, errlen + msg->dsc$w_length + 2);
-      LastError[errlen] = '\n';  LastError[errlen+1] = '\0';
-      strncat(LastError, msg->dsc$a_pointer, msg->dsc$w_length);
-      LastError[errlen+msg->dsc$w_length+1] = '\0';
+      int errlen = strlen(dl_last_error);
+      dl_last_error = saferealloc(dl_last_error, errlen + msg->dsc$w_length + 2);
+      dl_last_error[errlen] = '\n';  dl_last_error[errlen+1] = '\0';
+      strncat(dl_last_error, msg->dsc$a_pointer, msg->dsc$w_length);
+      dl_last_error[errlen+msg->dsc$w_length+1] = '\0';
     }
     return 0;
 }
@@ -134,7 +145,7 @@
     myvec[0] = args = usig[0] > 10 ? 9 : usig[0] - 1;
     while (--args) myvec[args] = usig[args];
     _ckvmssts(sys$putmsg(myvec,copy_errmsg,0,0));
-    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "findsym_handler: received\n\t%s\n",LastError));
+    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "findsym_handler: received\n\t%s\n",dl_last_error));
     return SS$_CONTINUE;
 }
 
@@ -157,15 +168,18 @@
 dl_private_init(pTHX)
 {
     dl_generic_private_init(aTHX);
-    dl_require_symbols = get_av("DynaLoader::dl_require_symbols", 0x4);
-    /* Set up the static control blocks for dl_expand_filespec() */
-    dlfab = cc$rms_fab;
-    dlnam = cc$rms_nam;
-    dlfab.fab$l_nam = &dlnam;
-    dlnam.nam$l_esa = dlesa;
-    dlnam.nam$b_ess = sizeof dlesa;
-    dlnam.nam$l_rsa = dlrsa;
-    dlnam.nam$b_rss = sizeof dlrsa;
+    {
+	dMY_CXT;
+	dl_require_symbols = get_av("DynaLoader::dl_require_symbols", 0x4);
+	/* Set up the static control blocks for dl_expand_filespec() */
+	dl_fab = cc$rms_fab;
+	dl_nam = cc$rms_nam;
+	dl_fab.fab$l_nam = &dl_nam;
+	dl_nam.nam$l_esa = dl_esa;
+	dl_nam.nam$b_ess = sizeof dl_esa;
+	dl_nam.nam$l_rsa = dl_rsa;
+	dl_nam.nam$b_rss = sizeof dl_rsa;
+    }
 }
 MODULE = DynaLoader PACKAGE = DynaLoader
 
@@ -179,54 +193,55 @@
     char vmsspec[NAM$C_MAXRSS], defspec[NAM$C_MAXRSS];
     size_t deflen;
     vmssts sts;
+    dMY_CXT;
 
     tovmsspec(filespec,vmsspec);
-    dlfab.fab$l_fna = vmsspec;
-    dlfab.fab$b_fns = strlen(vmsspec);
-    dlfab.fab$l_dna = 0;
-    dlfab.fab$b_dns = 0;
+    dl_fab.fab$l_fna = vmsspec;
+    dl_fab.fab$b_fns = strlen(vmsspec);
+    dl_fab.fab$l_dna = 0;
+    dl_fab.fab$b_dns = 0;
     DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_expand_filespec(%s):\n",vmsspec));
     /* On the first pass, just parse the specification string */
-    dlnam.nam$b_nop = NAM$M_SYNCHK;
-    sts = sys$parse(&dlfab);
+    dl_nam.nam$b_nop = NAM$M_SYNCHK;
+    sts = sys$parse(&dl_fab);
     DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tSYNCHK sys$parse = %d\n",sts));
     if (!(sts & 1)) {
-      dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
+      dl_set_error(dl_fab.fab$l_sts,dl_fab.fab$l_stv);
       ST(0) = &PL_sv_undef;
     }
     else {
       /* Now set up a default spec - everything but the name */
-      deflen = dlnam.nam$l_name - dlesa;
-      memcpy(defspec,dlesa,deflen);
-      memcpy(defspec+deflen,dlnam.nam$l_type,
-             dlnam.nam$b_type + dlnam.nam$b_ver);
-      deflen += dlnam.nam$b_type + dlnam.nam$b_ver;
-      memcpy(vmsspec,dlnam.nam$l_name,dlnam.nam$b_name);
+      deflen = dl_nam.nam$l_name - dl_esa;
+      memcpy(defspec,dl_esa,deflen);
+      memcpy(defspec+deflen,dl_nam.nam$l_type,
+             dl_nam.nam$b_type + dl_nam.nam$b_ver);
+      deflen += dl_nam.nam$b_type + dl_nam.nam$b_ver;
+      memcpy(vmsspec,dl_nam.nam$l_name,dl_nam.nam$b_name);
       DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tsplit filespec: name = %.*s, default = %.*s\n",
-                        dlnam.nam$b_name,vmsspec,deflen,defspec));
+                        dl_nam.nam$b_name,vmsspec,deflen,defspec));
       /* . . . and go back to expand it */
-      dlnam.nam$b_nop = 0;
-      dlfab.fab$l_dna = defspec;
-      dlfab.fab$b_dns = deflen;
-      dlfab.fab$b_fns = dlnam.nam$b_name;
-      sts = sys$parse(&dlfab);
+      dl_nam.nam$b_nop = 0;
+      dl_fab.fab$l_dna = defspec;
+      dl_fab.fab$b_dns = deflen;
+      dl_fab.fab$b_fns = dl_nam.nam$b_name;
+      sts = sys$parse(&dl_fab);
       DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tname/default sys$parse = %d\n",sts));
       if (!(sts & 1)) {
-        dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
+        dl_set_error(dl_fab.fab$l_sts,dl_fab.fab$l_stv);
         ST(0) = &PL_sv_undef;
       }
       else {
         /* Now find the actual file */
-        sts = sys$search(&dlfab);
+        sts = sys$search(&dl_fab);
         DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tsys$search = %d\n",sts));
         if (!(sts & 1)) {
-          dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
+          dl_set_error(dl_fab.fab$l_sts,dl_fab.fab$l_stv);
           ST(0) = &PL_sv_undef;
         }
         else {
-          ST(0) = sv_2mortal(newSVpvn(dlnam.nam$l_rsa,dlnam.nam$b_rsl));
+          ST(0) = sv_2mortal(newSVpvn(dl_nam.nam$l_rsa,dl_nam.nam$b_rsl));
           DLDEBUG(1,PerlIO_printf(Perl_debug_log, "\tresult = \\%.*s\\\n",
-                            dlnam.nam$b_rsl,dlnam.nam$l_rsa));
+                            dl_nam.nam$b_rsl,dl_nam.nam$l_rsa));
         }
       }
     }
@@ -237,6 +252,7 @@
     int		flags
     PREINIT:
     dTHX;
+    dMY_CXT;
     char vmsspec[NAM$C_MAXRSS];
     SV *reqSV, **reqSVhndl;
     STRLEN deflen;
@@ -360,7 +376,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
       RETVAL
 

==== //depot/maint-5.6/macperl/ext/DynaLoader/dlutils.c#2 (text) ====
Index: perl/ext/DynaLoader/dlutils.c
--- perl/ext/DynaLoader/dlutils.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/DynaLoader/dlutils.c	Fri Oct 26 15:00:05 2001
@@ -8,23 +8,49 @@
  *                      files when the interpreter exits
  */
 
+#ifndef XS_VERSION
+#  define XS_VERSION "0"
+#endif
+#define MY_CXT_KEY "DynaLoader::_guts" XS_VERSION
 
-/* pointer to allocated memory for last error message */
-static char *LastError  = (char*)NULL;
+typedef struct {
+    char *	x_dl_last_error;	/* pointer to allocated memory for
+					   last error message */
+    int		x_dl_nonlazy;		/* flag for immediate rather than lazy
+					   linking (spots unresolved symbol) */
+#ifdef DL_LOADONCEONLY
+    HV *	x_dl_loaded_files;	/* only needed on a few systems */
+#endif
+#ifdef DL_CXT_EXTRA
+    my_cxtx_t	x_dl_cxtx;		/* extra platform-specific data */
+#endif
+#ifdef DEBUGGING
+    int		x_dl_debug;	/* value copied from $DynaLoader::dl_debug */
+#endif
+} my_cxt_t;
 
-/* flag for immediate rather than lazy linking (spots unresolved symbol) */
-static int dl_nonlazy = 0;
+START_MY_CXT
 
+#define dl_last_error	(MY_CXT.x_dl_last_error)
+#define dl_nonlazy	(MY_CXT.x_dl_nonlazy)
 #ifdef DL_LOADONCEONLY
-static HV *dl_loaded_files = Nullhv;	/* only needed on a few systems */
+#define dl_loaded_files	(MY_CXT.x_dl_loaded_files)
+#endif
+#ifdef DL_CXT_EXTRA
+#define dl_cxtx		(MY_CXT.x_dl_cxtx)
+#endif
+#ifdef DEBUGGING
+#define dl_debug	(MY_CXT.x_dl_debug)
 #endif
 
-
 #ifdef DEBUGGING
-static int dl_debug = 0;	/* value copied from $DynaLoader::dl_debug */
-#define DLDEBUG(level,code)	if (dl_debug>=level) { code; }
+#define DLDEBUG(level,code) \
+    STMT_START {					\
+	dMY_CXT;					\
+	if (dl_debug>=level) { code; }			\
+    } STMT_END
 #else
-#define DLDEBUG(level,code)
+#define DLDEBUG(level,code)	NOOP
 #endif
 
 
@@ -57,9 +83,18 @@
 dl_generic_private_init(pTHXo)	/* called by dl_*.xs dl_private_init() */
 {
     char *perl_dl_nonlazy;
+    MY_CXT_INIT;
+
+    dl_last_error = NULL;
+    dl_nonlazy = 0;
+#ifdef DL_LOADONCEONLY
+    dl_loaded_files = Nullhv;
+#endif
 #ifdef DEBUGGING
-    SV *sv = get_sv("DynaLoader::dl_debug", 0);
-    dl_debug = sv ? SvIV(sv) : 0;
+    {
+	SV *sv = get_sv("DynaLoader::dl_debug", 0);
+	dl_debug = sv ? SvIV(sv) : 0;
+    }
 #endif
     if ( (perl_dl_nonlazy = getenv("PERL_DL_NONLAZY")) != NULL )
 	dl_nonlazy = atoi(perl_dl_nonlazy);
@@ -75,10 +110,11 @@
 }
 
 
-/* SaveError() takes printf style args and saves the result in LastError */
+/* SaveError() takes printf style args and saves the result in dl_last_error */
 static void
 SaveError(pTHXo_ char* pat, ...)
 {
+    dMY_CXT;
     va_list args;
     SV *msv;
     char *message;
@@ -94,13 +130,13 @@
     len++;		/* include terminating null char */
 
     /* Allocate some memory for the error message */
-    if (LastError)
-        LastError = (char*)saferealloc(LastError, len) ;
+    if (dl_last_error)
+        dl_last_error = (char*)saferealloc(dl_last_error, len);
     else
-        LastError = (char *) safemalloc(len) ;
+        dl_last_error = (char*)safemalloc(len);
 
-    /* Copy message into LastError (including terminating null char)	*/
-    strncpy(LastError, message, len) ;
-    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",LastError));
+    /* Copy message into dl_last_error (including terminating null char) */
+    strncpy(dl_last_error, message, len) ;
+    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",dl_last_error));
 }
 

==== //depot/maint-5.6/macperl/ext/File/Glob/Glob.xs#2 (text) ====
Index: perl/ext/File/Glob/Glob.xs
--- perl/ext/File/Glob/Glob.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/File/Glob/Glob.xs	Fri Oct 26 15:00:05 2001
@@ -4,8 +4,15 @@
 
 #include "bsd_glob.h"
 
-/* XXX: need some thread awareness */
-static int GLOB_ERROR = 0;
+#define MY_CXT_KEY "File::Glob::_guts" XS_VERSION
+
+typedef struct {
+    int		x_GLOB_ERROR;
+} my_cxt_t;
+
+START_MY_CXT
+
+#define GLOB_ERROR	(MY_CXT.x_GLOB_ERROR)
 
 static double
 constant(char *name, int arg)
@@ -53,8 +60,11 @@
 #else
 	    goto not_there;
 #endif
-        if (strEQ(name, "GLOB_ERROR"))
+        if (strEQ(name, "GLOB_ERROR")) {
+	    dTHX;
+	    dMY_CXT;
             return GLOB_ERROR;
+	}
         break;
     case 'F':
 	break;
@@ -172,6 +182,11 @@
 
 MODULE = File::Glob		PACKAGE = File::Glob
 
+BOOT:
+{
+    MY_CXT_INIT;
+}
+
 void
 doglob(pattern,...)
     char *pattern
@@ -184,6 +199,8 @@
     SV *tmp;
 PPCODE:
     {
+	dMY_CXT;
+
 	/* allow for optional flags argument */
 	if (items > 1) {
 	    flags = (int) SvIV(ST(1));

==== //depot/maint-5.6/macperl/ext/ODBM_File/ODBM_File.xs#2 (text) ====
Index: perl/ext/ODBM_File/ODBM_File.xs
--- perl/ext/ODBM_File/ODBM_File.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/ODBM_File/ODBM_File.xs	Fri Oct 26 15:00:05 2001
@@ -70,7 +70,15 @@
 #define odbm_FIRSTKEY(db)			firstkey()
 #define odbm_NEXTKEY(db,key)			nextkey(key)
 
-static int dbmrefcnt;
+#define MY_CXT_KEY "ODBM_File::_guts" XS_VERSION
+
+typedef struct {
+    int		x_dbmrefcnt;
+} my_cxt_t;
+
+START_MY_CXT
+
+#define dbmrefcnt	(MY_CXT.x_dbmrefcnt)
 
 #ifndef DBM_REPLACE
 #define DBM_REPLACE 0
@@ -78,6 +86,11 @@
 
 MODULE = ODBM_File	PACKAGE = ODBM_File	PREFIX = odbm_
 
+BOOT:
+{
+    MY_CXT_INIT;
+}
+
 ODBM_File
 odbm_TIEHASH(dbtype, filename, flags, mode)
 	char *		dbtype
@@ -88,6 +101,8 @@
 	{
 	    char *tmpbuf;
 	    void * dbp ;
+	    dMY_CXT;
+
 	    if (dbmrefcnt++)
 		croak("Old dbm can only open one database");
 	    New(0, tmpbuf, strlen(filename) + 5, char);
@@ -116,6 +131,7 @@
 DESTROY(db)
 	ODBM_File	db
 	CODE:
+	dMY_CXT;
 	dbmrefcnt--;
 	dbmclose();
 	safefree(db);

==== //depot/maint-5.6/macperl/ext/Opcode/Opcode.xs#2 (text) ====
Index: perl/ext/Opcode/Opcode.xs
--- perl/ext/Opcode/Opcode.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/Opcode/Opcode.xs	Fri Oct 26 15:00:05 2001
@@ -7,10 +7,21 @@
 #define OP_MASK_BUF_SIZE (MAXO + 100)
 
 /* XXX op_named_bits and opset_all are never freed */
-static HV *op_named_bits;	/* cache shared for whole process	*/
-static SV *opset_all;		/* mask with all bits set		*/
-static IV  opset_len;		/* length of opmasks in bytes		*/
-static int opcode_debug = 0;
+#define MY_CXT_KEY "Opcode::_guts" XS_VERSION
+
+typedef struct {
+    HV *	x_op_named_bits;	/* cache shared for whole process */
+    SV *	x_opset_all;		/* mask with all bits set	*/
+    IV		x_opset_len;		/* length of opmasks in bytes	*/
+    int		x_opcode_debug;
+} my_cxt_t;
+
+START_MY_CXT
+
+#define op_named_bits		(MY_CXT.x_op_named_bits)
+#define opset_all		(MY_CXT.x_opset_all)
+#define opset_len		(MY_CXT.x_opset_len)
+#define opcode_debug		(MY_CXT.x_opcode_debug)
 
 static SV  *new_opset (pTHX_ SV *old_opset);
 static int  verify_opset (pTHX_ SV *opset, int fatal);
@@ -34,6 +45,7 @@
     STRLEN len;
     char **op_names;
     char *bitmap;
+    dMY_CXT;
 
     op_named_bits = newHV();
     op_names = get_op_names();
@@ -66,6 +78,8 @@
 put_op_bitspec(pTHX_ char *optag, STRLEN len, SV *mask)
 {
     SV **svp;
+    dMY_CXT;
+
     verify_opset(aTHX_ mask,1);
     if (!len)
 	len = strlen(optag);
@@ -87,6 +101,8 @@
 get_op_bitspec(pTHX_ char *opname, STRLEN len, int fatal)
 {
     SV **svp;
+    dMY_CXT;
+
     if (!len)
 	len = strlen(opname);
     svp = hv_fetch(op_named_bits, opname, len, 0);
@@ -110,6 +126,8 @@
 new_opset(pTHX_ SV *old_opset)
 {
     SV *opset;
+    dMY_CXT;
+
     if (old_opset) {
 	verify_opset(aTHX_ old_opset,1);
 	opset = newSVsv(old_opset);
@@ -129,6 +147,8 @@
 verify_opset(pTHX_ SV *opset, int fatal)
 {
     char *err = Nullch;
+    dMY_CXT;
+
     if      (!SvOK(opset))              err = "undefined";
     else if (!SvPOK(opset))             err = "wrong type";
     else if (SvCUR(opset) != opset_len) err = "wrong size";
@@ -142,6 +162,7 @@
 static void
 set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, char *opname)
 {
+    dMY_CXT;
     if (SvIOK(bitspec)) {
 	int myopcode = SvIV(bitspec);
 	int offset = myopcode >> 3;
@@ -180,6 +201,7 @@
     char *bitmask;
     STRLEN len;
     int myopcode = 0;
+    dMY_CXT;
 
     verify_opset(aTHX_ opset,1);		/* croaks on bad opset	*/
 
@@ -204,6 +226,8 @@
 opmask_addlocal(pTHX_ SV *opset, char *op_mask_buf) /* Localise PL_op_mask then opmask_add() */
 {
     char *orig_op_mask = PL_op_mask;
+    dMY_CXT;
+
     SAVEVPTR(PL_op_mask);
 #if !defined(PERL_OBJECT)
     /* XXX casting to an ordinary function ptr from a member function ptr
@@ -227,12 +251,14 @@
 PROTOTYPES: ENABLE
 
 BOOT:
+{
+    MY_CXT_INIT;
     assert(PL_maxo < OP_MASK_BUF_SIZE);
     opset_len = (PL_maxo + 7) / 8;
     if (opcode_debug >= 1)
 	warn("opset_len %ld\n", (long)opset_len);
     op_names_init(aTHX);
-
+}
 
 void
 _safe_call_sv(Package, mask, codesv)
@@ -289,6 +315,8 @@
 CODE:
     {
     char *bitmap;
+    dMY_CXT;
+
     STRLEN len = opset_len;
     opset = sv_2mortal(new_opset(aTHX_ opset));	/* verify and clone opset */
     bitmap = SvPVX(opset);
@@ -311,6 +339,8 @@
     int i, j, myopcode;
     char *bitmap = SvPV(opset, len);
     char **names = (desc) ? get_op_descs() : get_op_names();
+    dMY_CXT;
+
     verify_opset(aTHX_ opset,1);
     for (myopcode=0, i=0; i < opset_len; i++) {
 	U16 bits = bitmap[i];
@@ -363,6 +393,7 @@
     SV *bitspec, *mask;
     char *bitmap, *opname;
     STRLEN len;
+    dMY_CXT;
 
     if (!SvROK(safe) || !SvOBJECT(SvRV(safe)) || SvTYPE(SvRV(safe))!=SVt_PVHV)
 	croak("Not a Safe object");
@@ -397,6 +428,7 @@
     STRLEN len;
     SV **args;
     char **op_desc = get_op_descs(); 
+    dMY_CXT;
     /* copy args to a scratch area since we may push output values onto	*/
     /* the stack faster than we read values off it if masks are used.	*/
     args = (SV**)SvPVX(sv_2mortal(newSVpvn((char*)&ST(0), items*sizeof(SV*))));
@@ -446,6 +478,7 @@
 void
 full_opset()
 CODE:
+    dMY_CXT;
     ST(0) = sv_2mortal(new_opset(aTHX_ opset_all));
 
 void

==== //depot/maint-5.6/macperl/ext/re/re.xs#2 (text) ====
Index: perl/ext/re/re.xs
--- perl/ext/re/re.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/ext/re/re.xs	Fri Oct 26 15:00:05 2001
@@ -18,44 +18,59 @@
 				    struct re_scream_pos_data_s *data);
 extern SV*	my_re_intuit_string (pTHX_ regexp *prog);
 
-static int oldfl;
+#define MY_CXT_KEY "re::_guts" XS_VERSION
+
+typedef struct {
+    int		x_oldflag;		/* debug flag */
+} my_cxt_t;
+
+START_MY_CXT
+
+#define oldflag		(MY_CXT.x_oldflag)
 
 #define R_DB 512
 
 static void
-deinstall(pTHX)
+uninstall(pTHX)
 {
+    dMY_CXT;
     PL_regexecp = Perl_regexec_flags;
     PL_regcompp = Perl_pregcomp;
     PL_regint_start = Perl_re_intuit_start;
     PL_regint_string = Perl_re_intuit_string;
     PL_regfree = Perl_pregfree;
 
-    if (!oldfl)
+    if (!oldflag)
 	PL_debug &= ~R_DB;
 }
 
 static void
 install(pTHX)
 {
+    dMY_CXT;
     PL_colorset = 0;			/* Allow reinspection of ENV. */
     PL_regexecp = &my_regexec;
     PL_regcompp = &my_regcomp;
     PL_regint_start = &my_re_intuit_start;
     PL_regint_string = &my_re_intuit_string;
     PL_regfree = &my_regfree;
-    oldfl = PL_debug & R_DB;
+    oldflag = PL_debug & R_DB;
     PL_debug |= R_DB;
 }
 
 MODULE = re	PACKAGE = re
 
+BOOT:
+{
+    MY_CXT_INIT;
+}
+
 void
 install()
   CODE:
     install(aTHX);
 
 void
-deinstall()
+uninstall()
   CODE:
-    deinstall(aTHX);
+    uninstall(aTHX);

==== //depot/maint-5.6/macperl/gv.c#4 (text) ====
Index: perl/gv.c
--- perl/gv.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/gv.c	Fri Oct 26 15:00:05 2001
@@ -398,8 +398,8 @@
 GV*
 Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
 {
-    static char autoload[] = "AUTOLOAD";
-    static STRLEN autolen = 8;
+    char autoload[] = "AUTOLOAD";
+    STRLEN autolen = sizeof(autoload)-1;
     GV* gv;
     CV* cv;
     HV* varstash;

==== //depot/maint-5.6/macperl/iperlsys.h#2 (text) ====
Index: perl/iperlsys.h
--- perl/iperlsys.h.~1~	Fri Oct 26 15:00:05 2001
+++ perl/iperlsys.h	Fri Oct 26 15:00:05 2001
@@ -692,11 +692,6 @@
 #define PerlEnv_putenv(str)		putenv((str))
 #define PerlEnv_getenv(str)		getenv((str))
 #define PerlEnv_getenv_len(str,l)	getenv_len((str), (l))
-#define PerlEnv_clearenv()		clearenv()
-#define PerlEnv_get_childenv()		get_childenv()
-#define PerlEnv_free_childenv(e)	free_childenv((e))
-#define PerlEnv_get_childdir()		get_childdir()
-#define PerlEnv_free_childdir(d)	free_childdir((d))
 #ifdef HAS_ENVGETENV
 #  define PerlEnv_ENVgetenv(str)	ENVgetenv((str))
 #  define PerlEnv_ENVgetenv_len(str,l)	ENVgetenv_len((str), (l))
@@ -712,6 +707,17 @@
 #define PerlEnv_sitelib_path(str)	win32_get_sitelib(str)
 #define PerlEnv_vendorlib_path(str)	win32_get_vendorlib(str)
 #define PerlEnv_get_child_IO(ptr)	win32_get_child_IO(ptr)
+#define PerlEnv_clearenv()		win32_clearenv()
+#define PerlEnv_get_childenv()		win32_get_childenv()
+#define PerlEnv_free_childenv(e)	win32_free_childenv((e))
+#define PerlEnv_get_childdir()		win32_get_childdir()
+#define PerlEnv_free_childdir(d)	win32_free_childdir((d))
+#else
+#define PerlEnv_clearenv()		clearenv()
+#define PerlEnv_get_childenv()		get_childenv()
+#define PerlEnv_free_childenv(e)	free_childenv((e))
+#define PerlEnv_get_childdir()		get_childdir()
+#define PerlEnv_free_childdir(d)	free_childdir((d))
 #endif
 
 #endif	/* PERL_IMPLICIT_SYS */

==== //depot/maint-5.6/macperl/makedef.pl#3 (xtext) ====
Index: perl/makedef.pl
--- perl/makedef.pl.~1~	Fri Oct 26 15:00:05 2001
+++ perl/makedef.pl	Fri Oct 26 15:00:05 2001
@@ -807,6 +807,11 @@
 			    win32_getpid
 			    win32_crypt
 			    win32_dynaload
+			    win32_get_childenv
+			    win32_free_childenv
+			    win32_clearenv
+			    win32_get_childdir
+			    win32_free_childdir
 			   ))
     {
 	try_symbol($symbol);

==== //depot/maint-5.6/macperl/mg.c#3 (text) ====
Index: perl/mg.c
--- perl/mg.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/mg.c	Fri Oct 26 15:00:05 2001
@@ -902,26 +902,9 @@
 #if defined(VMS) || defined(EPOC)
     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
 #else
-#   ifdef PERL_IMPLICIT_SYS
+#   if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
     PerlEnv_clearenv();
 #   else
-#	ifdef WIN32
-    char *envv = GetEnvironmentStrings();
-    char *cur = envv;
-    STRLEN len;
-    while (*cur) {
-	char *end = strchr(cur,'=');
-	if (end && end != cur) {
-	    *end = '\0';
-	    my_setenv(cur,Nullch);
-	    *end = '=';
-	    cur = end + strlen(end+1)+2;
-	}
-	else if ((len = strlen(cur)))
-	    cur += len+1;
-    }
-    FreeEnvironmentStrings(envv);
-#	else
 #if !defined(MACOS_TRADITIONAL)
 #	    ifndef PERL_USE_SAFE_PUTENV
     I32 i;
@@ -936,7 +919,6 @@
     environ[0] = Nullch;
 
 #endif /* !defined(MACOS_TRADITIONAL) */
-#	endif /* WIN32 */
 #   endif /* PERL_IMPLICIT_SYS */
 #endif /* VMS */
     return 0;
@@ -2123,7 +2105,9 @@
     return 0;
 }
 
+#if !defined(PERL_IMPLICIT_CONTEXT)
 static SV* sig_sv;
+#endif
 
 Signal_t
 Perl_sighandler(int sig)
@@ -2193,7 +2177,9 @@
     if(PL_psig_name[sig]) {
     	sv = SvREFCNT_inc(PL_psig_name[sig]);
 	flags |= 64;
+#if !defined(PERL_IMPLICIT_CONTEXT)
 	sig_sv = sv;
+#endif
     } else {
 	sv = sv_newmortal();
 	sv_setpv(sv,PL_sig_name[sig]);
@@ -2279,6 +2265,8 @@
     if (flags & 1)
 	PL_savestack_ix -= 5; /* Unprotect save in progress. */
     /* cxstack_ix-- Not needed, die already unwound it. */
+#if !defined(PERL_IMPLICIT_CONTEXT)
     if (flags & 64)
 	SvREFCNT_dec(sig_sv);
+#endif
 }

==== //depot/maint-5.6/macperl/op.c#3 (text) ====
Index: perl/op.c
--- perl/op.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/op.c	Fri Oct 26 15:00:05 2001
@@ -22,10 +22,10 @@
 
 /* #define PL_OP_SLAB_ALLOC */
 
-#ifdef PL_OP_SLAB_ALLOC 
+#if defined(PL_OP_SLAB_ALLOC) && !defined(PERL_IMPLICIT_CONTEXT)
 #define SLAB_SIZE 8192
-static char    *PL_OpPtr  = NULL;
-static int     PL_OpSpace = 0;
+static char    *PL_OpPtr  = NULL;	/* XXX threadead */
+static int     PL_OpSpace = 0;		/* XXX threadead */
 #define NewOp(m,var,c,type) do { if ((PL_OpSpace -= c*sizeof(type)) >= 0)     \
                               var =  (type *)(PL_OpPtr -= c*sizeof(type));    \
                              else                                             \

==== //depot/maint-5.6/macperl/perl.h#5 (text) ====
Index: perl/perl.h
--- perl/perl.h.~1~	Fri Oct 26 15:00:05 2001
+++ perl/perl.h	Fri Oct 26 15:00:05 2001
@@ -3379,6 +3379,83 @@
 #   endif
 #endif
 
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
+				  sizeof(MY_CXT_KEY)-1, TRUE)
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT	\
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvUV(my_cxt_sv)
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+	dMY_CXT_SV;							\
+	/* newSV() allocates one more than needed */			\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Zero(my_cxtp, 1, my_cxt_t);					\
+	sv_setuv(my_cxt_sv, (UV)my_cxtp)
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT		(*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT		my_cxt_t *my_cxtp
+#define pMY_CXT_	pMY_CXT,
+#define _pMY_CXT	,pMY_CXT
+#define aMY_CXT		my_cxtp
+#define aMY_CXT_	aMY_CXT,
+#define _aMY_CXT	,aMY_CXT
+
+#else /* USE_ITHREADS */
+
+#define START_MY_CXT	static my_cxt_t my_cxt;
+#define dMY_CXT_SV	dNOOP
+#define dMY_CXT		dNOOP
+#define MY_CXT_INIT	NOOP
+#define MY_CXT		my_cxt
+
+#define pMY_CXT		void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* !defined(USE_ITHREADS) */
+
 #ifdef I_FCNTL
 #  include <fcntl.h>
 #endif

==== //depot/maint-5.6/macperl/scope.c#2 (text) ====
Index: perl/scope.c
--- perl/scope.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/scope.c	Fri Oct 26 15:00:05 2001
@@ -50,20 +50,12 @@
 SV**
 Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
 {
-#if defined(DEBUGGING) && !defined(USE_THREADS)
-    static int growing = 0;
-    if (growing++)
-      abort();
-#endif
     PL_stack_sp = sp;
 #ifndef STRESS_REALLOC
     av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
 #else
     av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
 #endif
-#if defined(DEBUGGING) && !defined(USE_THREADS)
-    growing--;
-#endif
     return PL_stack_sp;
 }
 

==== //depot/maint-5.6/macperl/toke.c#4 (text) ====
Index: perl/toke.c
--- perl/toke.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/toke.c	Fri Oct 26 15:00:05 2001
@@ -5136,10 +5136,9 @@
 	case KEY_write:
 #ifdef EBCDIC
 	{
-	    static char ctl_l[2];
-
-	    if (ctl_l[0] == '\0')
- 		ctl_l[0] = toCTRL('L');
+	    char ctl_l[2];
+	    ctl_l[0] = toCTRL('L');
+	    ctl_l[1] = '\0';
 	    gv_fetchpv(ctl_l,TRUE, SVt_PV);
 	}
 #else

==== //depot/maint-5.6/macperl/util.c#4 (text) ====
Index: perl/util.c
--- perl/util.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/util.c	Fri Oct 26 15:00:05 2001
@@ -2561,7 +2561,8 @@
     return PerlProc_signal(signo, handler);
 }
 
-static int sig_trapped;
+static int sig_trapped;	/* XXX signals are process-wide anyway, so we
+			   ignore the implications of this for threading */
 
 static
 Signal_t

==== //depot/maint-5.6/macperl/win32/dl_win32.xs#2 (text) ====
Index: perl/win32/dl_win32.xs
--- perl/win32/dl_win32.xs.~1~	Fri Oct 26 15:00:05 2001
+++ perl/win32/dl_win32.xs	Fri Oct 26 15:00:05 2001
@@ -36,21 +36,27 @@
 
 #include "XSUB.h"
 
-static SV *error_sv;
+typedef struct {
+    SV *	x_error_sv;
+} my_cxtx_t;		/* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA	/* ask for dl_cxtx to be defined in dlutils.c */
+#include "dlutils.c"	/* SaveError() etc	*/
+
+#define dl_error_sv	(dl_cxtx.x_error_sv)
 
 static char *
 OS_Error_String(pTHXo)
 {
- DWORD err = GetLastError();
- STRLEN len;
- if (!error_sv)
-  error_sv = newSVpvn("",0);
- PerlProc_GetOSError(error_sv,err);
- return SvPV(error_sv,len);
+    dMY_CXT;
+    DWORD err = GetLastError();
+    STRLEN len;
+    if (!dl_error_sv)
+	dl_error_sv = newSVpvn("",0);
+    PerlProc_GetOSError(dl_error_sv,err);
+    return SvPV(dl_error_sv,len);
 }
 
-#include "dlutils.c"	/* SaveError() etc	*/
-
 static void
 dl_private_init(pTHXo)
 {
@@ -161,7 +167,8 @@
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error;
     OUTPUT:
     RETVAL
 

==== //depot/maint-5.6/macperl/win32/vmem.h#2 (text) ====
Index: perl/win32/vmem.h
--- perl/win32/vmem.h.~1~	Fri Oct 26 15:00:05 2001
+++ perl/win32/vmem.h	Fri Oct 26 15:00:05 2001
@@ -143,6 +143,9 @@
     long		m_lAllocSize;		    // current alloc size
     long		m_lRefCount;		    // number of current users
     CRITICAL_SECTION	m_cs;			    // access lock
+#ifdef _DEBUG_MEM
+    FILE*		m_pLog;
+#endif
 };
 
 // #define _DEBUG_MEM
@@ -185,6 +188,9 @@
     ASSERT(bRet);
 
     InitializeCriticalSection(&m_cs);
+#ifdef _DEBUG_MEM
+    m_pLog = 0;
+#endif
 
     Init();
 }
@@ -193,6 +199,9 @@
 {
     ASSERT(HeapValidate(m_hHeap, HEAP_NO_SERIALIZE, NULL));
     WALKHEAPTRACE();
+#ifdef _DEBUG_MEM
+    MemoryUsageMessage(NULL, 0, 0, 0);
+#endif
     DeleteCriticalSection(&m_cs);
     BOOL bRet = HeapDestroy(m_hHeap);
     ASSERT(bRet);
@@ -642,21 +651,21 @@
 }
 
 #ifdef _DEBUG_MEM
-#define LOG_FILENAME "P:\\Apps\\Perl\\Result.txt"
+#define LOG_FILENAME ".\\MemLog.txt"
 
 void MemoryUsageMessage(char *str, long x, long y, int c)
 {
-    static FILE* fp = NULL;
     char szBuffer[512];
     if(str) {
-	if(!fp)
-	    fp = fopen(LOG_FILENAME, "w");
+	if(!m_pLog)
+	    m_pLog = fopen(LOG_FILENAME, "w");
 	sprintf(szBuffer, str, x, y, c);
-	fputs(szBuffer, fp);
+	fputs(szBuffer, m_pLog);
     }
     else {
-	fflush(fp);
-	fclose(fp);
+	fflush(m_pLog);
+	fclose(m_pLog);
+	m_pLog = 0;
     }
 }
 

==== //depot/maint-5.6/macperl/win32/win32.c#5 (text) ====
Index: perl/win32/win32.c
--- perl/win32/win32.c.~1~	Fri Oct 26 15:00:05 2001
+++ perl/win32/win32.c	Fri Oct 26 15:00:05 2001
@@ -1801,7 +1801,7 @@
     return -1;
 }
 
-#ifndef PERL_OBJECT
+#ifndef PERL_IMPLICIT_CONTEXT
 
 static UINT timerid = 0;
 
@@ -1817,7 +1817,7 @@
 DllExport unsigned int
 win32_alarm(unsigned int sec)
 {
-#ifndef PERL_OBJECT
+#ifndef PERL_IMPLICIT_CONTEXT
     /* 
      * the 'obvious' implentation is SetTimer() with a callback
      * which does whatever receiving SIGALRM would do 
@@ -2303,7 +2303,31 @@
 DllExport FILE*
 win32_tmpfile(void)
 {
-    return tmpfile();
+    dTHXo;
+    char prefix[MAX_PATH+1];
+    char filename[MAX_PATH+1];
+    DWORD len = GetTempPath(MAX_PATH, prefix);
+    if (len && len < MAX_PATH) {
+	if (GetTempFileName(prefix, "plx", 0, filename)) {
+	    HANDLE fh = CreateFile(filename,
+				   DELETE | GENERIC_READ | GENERIC_WRITE,
+				   0,
+				   NULL,
+				   CREATE_ALWAYS,
+				   FILE_ATTRIBUTE_NORMAL
+				   | FILE_FLAG_DELETE_ON_CLOSE,
+				   NULL);
+	    if (fh != INVALID_HANDLE_VALUE) {
+		int fd = win32_open_osfhandle((long)fh, 0);
+		if (fd >= 0) {
+		    DEBUG_p(PerlIO_printf(Perl_debug_log,
+					  "Created tmpfile=%s\n",filename));
+		    return fdopen(fd, "w+b");
+		}
+	    }
+	}
+    }
+    return NULL;
 }
 
 DllExport void
@@ -3212,19 +3236,39 @@
  * environment and the current directory to CreateProcess
  */
 
-void*
-get_childenv(void)
+DllExport void*
+win32_get_childenv(void)
 {
     return NULL;
 }
 
-void
-free_childenv(void* d)
+DllExport void
+win32_free_childenv(void* d)
+{
+}
+
+DllExport void
+win32_clearenv(void)
 {
+    char *envv = GetEnvironmentStrings();
+    char *cur = envv;
+    STRLEN len;
+    while (*cur) {
+	char *end = strchr(cur,'=');
+	if (end && end != cur) {
+	    *end = '\0';
+	    SetEnvironmentVariable(cur, NULL);
+	    *end = '=';
+	    cur = end + strlen(end+1)+2;
+	}
+	else if ((len = strlen(cur)))
+	    cur += len+1;
+    }
+    FreeEnvironmentStrings(envv);
 }
 
-char*
-get_childdir(void)
+DllExport char*
+win32_get_childdir(void)
 {
     dTHXo;
     char* ptr;
@@ -3243,8 +3287,8 @@
     return ptr;
 }
 
-void
-free_childdir(char* d)
+DllExport void
+win32_free_childdir(char* d)
 {
     dTHXo;
     Safefree(d);
@@ -3490,12 +3534,12 @@
 
 #ifndef USE_PERL_SBRK
 
-static char *committed = NULL;
-static char *base      = NULL;
-static char *reserved  = NULL;
-static char *brk       = NULL;
-static DWORD pagesize  = 0;
-static DWORD allocsize = 0;
+static char *committed = NULL;		/* XXX threadead */
+static char *base      = NULL;		/* XXX threadead */
+static char *reserved  = NULL;		/* XXX threadead */
+static char *brk       = NULL;		/* XXX threadead */
+static DWORD pagesize  = 0;		/* XXX threadead */
+static DWORD allocsize = 0;		/* XXX threadead */
 
 void *
 sbrk(int need)

==== //depot/maint-5.6/macperl/win32/win32iop.h#2 (text) ====
Index: perl/win32/win32iop.h
--- perl/win32/win32iop.h.~1~	Fri Oct 26 15:00:05 2001
+++ perl/win32/win32iop.h	Fri Oct 26 15:00:05 2001
@@ -144,6 +144,12 @@
 
 DllExport char *	win32_crypt(const char *txt, const char *salt);
 
+DllExport void *	win32_get_childenv(void);
+DllExport void		win32_free_childenv(void* d);
+DllExport void		win32_clearenv(void);
+DllExport char *	win32_get_childdir(void);
+DllExport void		win32_free_childdir(char* d);
+
 END_EXTERN_C
 
 /*
@@ -298,6 +304,17 @@
 #undef crypt
 #define crypt(t,s)		win32_crypt(t,s)
 
+#undef get_childenv
+#undef free_childenv
+#undef clearenv
+#undef get_childdir
+#undef free_childdir
+#define get_childenv()		win32_get_childenv()
+#define free_childenv(d)	win32_free_childenv(d)
+#define clearenv()		win32_clearenv()
+#define get_childdir()		win32_get_childdir()
+#define free_childdir(d)	win32_free_childdir(d)
+
 #undef getenv
 #define getenv win32_getenv
 #undef putenv
End of Patch.