Test script for DynaLoader
[p5sagit/p5-mst-13.2.git] / ext / DynaLoader / dl_mac.xs
index 136e6d5..826caf2 100644 (file)
 
 #include <CodeFragments.h>
 
+typedef CFragConnectionID ConnectionID;
 
-#include "dlutils.c"   /* SaveError() etc      */
+typedef struct {
+    ConnectionID **    x_connections;
+} my_cxtx_t;           /* this *must* be named my_cxtx_t */
 
-typedef CFragConnectionID ConnectionID;
+#define DL_CXT_EXTRA   /* ask for dl_cxtx to be defined in dlutils.c */
+#include "dlutils.c"   /* SaveError() etc      */
 
-static ConnectionID ** connections;
+#define dl_connections (dl_cxtx.x_connections)
 
-static void terminate(void)
+static void terminate(pTHX_ void *ptr)
 {
-    int size = GetHandleSize((Handle) connections) / sizeof(ConnectionID);
-    HLock((Handle) connections);
+    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
@@ -63,22 +68,23 @@ dl_load_file(filename, flags=0)
     Ptr                        mainAddr;
     Str255             errName;
     CODE:
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
+    DLDEBUG(1,PerlIO_printf(Perl_debug_log,"dl_load_file(%s):\n", filename));
     err = GUSIPath2FSp(filename, &spec);
     if (!err)
        err = 
            GetDiskFragment(
                &spec, 0, 0, spec.name, kLoadCFrag, &connID, &mainAddr, errName);
     if (!err) {
-       if (!connections) {
-           connections = (ConnectionID **)NewHandle(0);
-           atexit(terminate);
+       dMY_CXT;
+       if (!dl_connections) {
+           dl_connections = (ConnectionID **)NewHandle(0);
+           call_atexit(terminate, (void*)0);
        }
-        PtrAndHand((Ptr) &connID, (Handle) connections, sizeof(ConnectionID));
+        PtrAndHand((Ptr) &connID, (Handle) dl_connections, sizeof(ConnectionID));
        RETVAL = connID;
     } else
        RETVAL = (ConnectionID) 0;
-    DLDEBUG(2,fprintf(stderr," libref=%d\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%d\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (err)
        SaveError(aTHX_ "DynaLoader error [%d, %#s]", err, errName) ;
@@ -94,13 +100,13 @@ dl_find_symbol(connID, symbol)
        OSErr               err;
        Ptr                 symAddr;
        CFragSymbolClass    symClass;
-       DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%#s)\n",
+       DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%#s)\n",
            connID, symbol));
        err = FindSymbol(connID, symbol, &symAddr, &symClass);
        if (err)
            symAddr = (Ptr) 0;
        RETVAL = (void *) symAddr;
-       DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+       DLDEBUG(2,PerlIO_printf(Perl_debug_log,"  symbolref = %x\n", RETVAL));
        ST(0) = sv_newmortal() ;
        if (err)
            SaveError(aTHX_ "DynaLoader error [%d]!", err) ;
@@ -122,15 +128,19 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *             symref 
     char *             filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n",
                perl_name, symref));
-    ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+    ST(0) = sv_2mortal(newRV((SV*)newXS_flags(perl_name,
+                                             (void(*)(pTHX_ CV *))symref,
+                                             filename, NULL,
+                                             XS_DYNAMIC_FILENAME)));
 
 
 char *
 dl_error()
     CODE:
-    RETVAL = LastError ;
+    dMY_CXT;
+    RETVAL = dl_last_error ;
     OUTPUT:
     RETVAL