sundry cleanups for cloned interpreters (only known failure mode
[p5sagit/p5-mst-13.2.git] / win32 / perllib.c
index e8d59cd..2b4d778 100644 (file)
@@ -548,6 +548,12 @@ PerlLIOIsatty(struct IPerlLIO *I, int fd)
     return isatty(fd);
 }
 
+int
+PerlLIOLink(struct IPerlLIO *I, const char*oldname, const char *newname)
+{
+    return win32_link(oldname, newname);
+}
+
 long
 PerlLIOLseek(struct IPerlLIO *I, int handle, long offset, int origin)
 {
@@ -652,6 +658,7 @@ struct IPerlLIO perlLIO =
     PerlLIOFileStat,
     PerlLIOIOCtl,
     PerlLIOIsatty,
+    PerlLIOLink,
     PerlLIOLseek,
     PerlLIOLstat,
     PerlLIOMktemp,
@@ -1520,7 +1527,7 @@ EXTERN_C DllExport int
 RunPerl(int argc, char **argv, char **env)
 {
     int exitstatus;
-    PerlInterpreter *my_perl;
+    PerlInterpreter *my_perl, *new_perl = NULL;
     struct perl_thread *thr;
 
 #ifndef __BORLANDC__
@@ -1556,11 +1563,27 @@ RunPerl(int argc, char **argv, char **env)
 
     exitstatus = perl_parse(my_perl, xs_init, argc, argv, env);
     if (!exitstatus) {
+#ifdef USE_ITHREADS            /* XXXXXX testing */
+       extern PerlInterpreter * perl_clone(pTHXx_ IV flags);
+
+       new_perl = perl_clone(my_perl, 0);
+       Perl_push_scope(new_perl); /* ENTER; (hack in lieu of perl_destruct()) */
+       exitstatus = perl_run( new_perl );
+       SetPerlInterpreter(my_perl);
+#else
        exitstatus = perl_run( my_perl );
+#endif
     }
 
     perl_destruct( my_perl );
     perl_free( my_perl );
+#ifdef USE_ITHREADS
+    if (new_perl) {
+       SetPerlInterpreter(new_perl);
+       perl_destruct(new_perl);
+       perl_free(new_perl);
+    }
+#endif
 
     PERL_SYS_TERM();