This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
threads is no longer customized, as of commit c0ff91434b
[perl5.git] / ext / DynaLoader / dlutils.c
index 29d9b91..96ea8be 100644 (file)
 #endif
 #define MY_CXT_KEY "DynaLoader::_guts" XS_VERSION
 
+/* disable version checking since DynaLoader can't be DynaLoaded */
+#undef dXSBOOTARGSXSAPIVERCHK
+#define dXSBOOTARGSXSAPIVERCHK dXSBOOTARGSNOVERCHK
+
 typedef struct {
     SV*                x_dl_last_error;        /* pointer to allocated memory for
                                           last error message */
+#if defined(PERL_IN_DL_HPUX_XS) || defined(PERL_IN_DL_DLOPEN_XS)
     int                x_dl_nonlazy;           /* flag for immediate rather than lazy
                                           linking (spots unresolved symbol) */
+#endif
 #ifdef DL_LOADONCEONLY
     HV *       x_dl_loaded_files;      /* only needed on a few systems */
 #endif
@@ -39,7 +45,9 @@ typedef struct {
 START_MY_CXT
 
 #define dl_last_error  (SvPVX(MY_CXT.x_dl_last_error))
+#if defined(PERL_IN_DL_HPUX_XS) || defined(PERL_IN_DL_DLOPEN_XS)
 #define dl_nonlazy     (MY_CXT.x_dl_nonlazy)
+#endif
 #ifdef DL_LOADONCEONLY
 #define dl_loaded_files        (MY_CXT.x_dl_loaded_files)
 #endif
@@ -71,12 +79,13 @@ dl_unload_all_files(pTHX_ void *unused)
 
     if ((sub = get_cvs("DynaLoader::dl_unload_file", 0)) != NULL) {
         dl_librefs = get_av("DynaLoader::dl_librefs", 0);
+        EXTEND(SP,1);
         while ((dl_libref = av_pop(dl_librefs)) != &PL_sv_undef) {
            dSP;
            ENTER;
            SAVETMPS;
            PUSHMARK(SP);
-           XPUSHs(sv_2mortal(dl_libref));
+           PUSHs(sv_2mortal(dl_libref));
            PUTBACK;
            call_sv((SV*)sub, G_DISCARD | G_NODEBUG);
            FREETMPS;
@@ -89,11 +98,12 @@ dl_unload_all_files(pTHX_ void *unused)
 static void
 dl_generic_private_init(pTHX)  /* called by dl_*.xs dl_private_init() */
 {
+#if defined(PERL_IN_DL_HPUX_XS) || defined(PERL_IN_DL_DLOPEN_XS)
     char *perl_dl_nonlazy;
+#endif
     MY_CXT_INIT;
 
     MY_CXT.x_dl_last_error = newSVpvs("");
-    dl_nonlazy = 0;
 #ifdef DL_LOADONCEONLY
     dl_loaded_files = NULL;
 #endif
@@ -103,10 +113,15 @@ dl_generic_private_init(pTHX)     /* called by dl_*.xs dl_private_init() */
        dl_debug = sv ? SvIV(sv) : 0;
     }
 #endif
+
+#if defined(PERL_IN_DL_HPUX_XS) || defined(PERL_IN_DL_DLOPEN_XS)
     if ( (perl_dl_nonlazy = getenv("PERL_DL_NONLAZY")) != NULL )
-       dl_nonlazy = atoi(perl_dl_nonlazy);
+       dl_nonlazy = grok_atou(perl_dl_nonlazy, NULL);
+    else
+       dl_nonlazy = 0;
     if (dl_nonlazy)
        DLDEBUG(1,PerlIO_printf(Perl_debug_log, "DynaLoader bind mode is 'non-lazy'\n"));
+#endif
 #ifdef DL_LOADONCEONLY
     if (!dl_loaded_files)
        dl_loaded_files = newHV(); /* provide cache for dl_*.xs if needed */
@@ -122,7 +137,6 @@ dl_generic_private_init(pTHX)       /* called by dl_*.xs dl_private_init() */
 static void
 SaveError(pTHX_ const char* pat, ...)
 {
-    dMY_CXT;
     va_list args;
     SV *msv;
     const char *message;
@@ -137,9 +151,12 @@ SaveError(pTHX_ const char* pat, ...)
     message = SvPV(msv,len);
     len++;             /* include terminating null char */
 
+    {
+       dMY_CXT;
     /* Copy message into dl_last_error (including terminating null char) */
-    sv_setpvn(MY_CXT.x_dl_last_error, message, len) ;
-    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",dl_last_error));
+       sv_setpvn(MY_CXT.x_dl_last_error, message, len) ;
+       DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",dl_last_error));
+    }
 }
 #endif