X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fperllib.c;h=3acfca120433675edbfaf3a2e6423e91d3d07202;hb=1c7d9af3bd40a8ae4d0b1feabf16378e4446d90a;hp=48843f92da7aca69f6a1b2b316d63b306d48d491;hpb=83b075c35b61a28ca7e2629bb5d6e26f9e0354fe;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/perllib.c b/win32/perllib.c index 48843f9..3acfca1 100644 --- a/win32/perllib.c +++ b/win32/perllib.c @@ -1,15 +1,10 @@ /* * "The Road goes ever on and on, down from the door where it began." */ - - +#define PERLIO_NOT_STDIO 0 #include "EXTERN.h" #include "perl.h" -#ifdef PERL_OBJECT -#define NO_XSLOCKS -#endif - #include "XSUB.h" #ifdef PERL_IMPLICIT_SYS @@ -21,23 +16,43 @@ /* Register any extra external extensions */ char *staticlinkmodules[] = { "DynaLoader", + /* other similar records will be included from "perllibst.h" */ +#define STATIC1 +#include "perllibst.h" NULL, }; -EXTERN_C void boot_DynaLoader (pTHXo_ CV* cv); +EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); +/* other similar records will be included from "perllibst.h" */ +#define STATIC2 +#include "perllibst.h" static void -xs_init(pTHXo) +xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); + /* other similar records will be included from "perllibst.h" */ +#define STATIC3 +#include "perllibst.h" } #ifdef PERL_IMPLICIT_SYS #include "perlhost.h" +void +win32_checkTLS(PerlInterpreter *host_perl) +{ + dTHX; + if (host_perl != my_perl) { + int *nowhere = NULL; + *nowhere = 0; + abort(); + } +} + EXTERN_C void perl_get_host_info(struct IPerlMemInfo* perlMemInfo, struct IPerlMemInfo* perlMemSharedInfo, @@ -109,10 +124,8 @@ perl_alloc_override(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared, pHost->m_pHostperlSock, pHost->m_pHostperlProc); if (my_perl) { -#ifdef PERL_OBJECT - CPerlObj* pPerl = (CPerlObj*)my_perl; -#endif w32_internal_host = pHost; + pHost->host_perl = my_perl; } } return my_perl; @@ -134,10 +147,8 @@ perl_alloc(void) pHost->m_pHostperlSock, pHost->m_pHostperlProc); if (my_perl) { -#ifdef PERL_OBJECT - CPerlObj* pPerl = (CPerlObj*)my_perl; -#endif w32_internal_host = pHost; + pHost->host_perl = my_perl; } } return my_perl; @@ -150,108 +161,6 @@ win32_delete_internal_host(void *h) delete host; } -#ifdef PERL_OBJECT - -EXTERN_C void -perl_construct(PerlInterpreter* my_perl) -{ - CPerlObj* pPerl = (CPerlObj*)my_perl; - try - { - Perl_construct(); - } - catch(...) - { - win32_fprintf(stderr, "%s\n", - "Error: Unable to construct data structures"); - perl_free(my_perl); - } -} - -EXTERN_C void -perl_destruct(PerlInterpreter* my_perl) -{ - CPerlObj* pPerl = (CPerlObj*)my_perl; -#ifdef DEBUGGING - Perl_destruct(); -#else - try - { - Perl_destruct(); - } - catch(...) - { - } -#endif -} - -EXTERN_C void -perl_free(PerlInterpreter* my_perl) -{ - CPerlObj* pPerl = (CPerlObj*)my_perl; - void *host = w32_internal_host; -#ifdef DEBUGGING - Perl_free(); -#else - try - { - Perl_free(); - } - catch(...) - { - } -#endif - win32_delete_internal_host(host); - PERL_SET_THX(NULL); -} - -EXTERN_C int -perl_run(PerlInterpreter* my_perl) -{ - CPerlObj* pPerl = (CPerlObj*)my_perl; - int retVal; -#ifdef DEBUGGING - retVal = Perl_run(); -#else - try - { - retVal = Perl_run(); - } - catch(...) - { - win32_fprintf(stderr, "Error: Runtime exception\n"); - retVal = -1; - } -#endif - return retVal; -} - -EXTERN_C int -perl_parse(PerlInterpreter* my_perl, void (*xsinit)(CPerlObj*), int argc, char** argv, char** env) -{ - int retVal; - CPerlObj* pPerl = (CPerlObj*)my_perl; -#ifdef DEBUGGING - retVal = Perl_parse(xsinit, argc, argv, env); -#else - try - { - retVal = Perl_parse(xsinit, argc, argv, env); - } - catch(...) - { - win32_fprintf(stderr, "Error: Parse exception\n"); - retVal = -1; - } -#endif - *win32_errno() = 0; - return retVal; -} - -#undef PL_perl_destruct_level -#define PL_perl_destruct_level int dummy - -#endif /* PERL_OBJECT */ #endif /* PERL_IMPLICIT_SYS */ EXTERN_C HANDLE w32_perldll_handle; @@ -267,7 +176,6 @@ RunPerl(int argc, char **argv, char **env) * want to free() argv after main() returns. As luck would have it, * Borland's CRT does the right thing to argv[0] already. */ char szModuleName[MAX_PATH]; - char *ptr; GetModuleFileName(NULL, szModuleName, sizeof(szModuleName)); (void)win32_longpath(szModuleName); @@ -296,23 +204,7 @@ RunPerl(int argc, char **argv, char **env) exitstatus = perl_parse(my_perl, xs_init, argc, argv, env); if (!exitstatus) { #if defined(TOP_CLONE) && defined(USE_ITHREADS) /* XXXXXX testing */ -# ifdef PERL_OBJECT - CPerlHost *h = new CPerlHost(); - new_perl = perl_clone_using(my_perl, 1, - h->m_pHostperlMem, - h->m_pHostperlMemShared, - h->m_pHostperlMemParse, - h->m_pHostperlEnv, - h->m_pHostperlStdIO, - h->m_pHostperlLIO, - h->m_pHostperlDir, - h->m_pHostperlSock, - h->m_pHostperlProc - ); - CPerlObj *pPerl = (CPerlObj*)new_perl; -# else new_perl = perl_clone(my_perl, 1); -# endif exitstatus = perl_run(new_perl); PERL_SET_THX(my_perl); #else @@ -371,9 +263,14 @@ DllMain(HANDLE hModule, /* DLL module handle */ * process termination or call to FreeLibrary. */ case DLL_PROCESS_DETACH: - PerlIO_cleanup(); + /* As long as we use TerminateProcess()/TerminateThread() etc. for mimicing kill() + anything here had better be harmless if: + A. Not called at all. + B. Called after memory allocation for Heap has been forcibly removed by OS. + PerlIO_cleanup() was done here but fails (B). + */ EndSockets(); -#if defined(USE_THREADS) || defined(USE_ITHREADS) +#if defined(USE_ITHREADS) if (PL_curinterp) FREE_THREAD_KEY; #endif @@ -392,3 +289,27 @@ DllMain(HANDLE hModule, /* DLL module handle */ } return TRUE; } + +#if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS) +EXTERN_C PerlInterpreter * +perl_clone_host(PerlInterpreter* proto_perl, UV flags) { + dTHX; + CPerlHost *h; + h = new CPerlHost(*(CPerlHost*)PL_sys_intern.internal_host); + proto_perl = perl_clone_using(proto_perl, flags, + h->m_pHostperlMem, + h->m_pHostperlMemShared, + h->m_pHostperlMemParse, + h->m_pHostperlEnv, + h->m_pHostperlStdIO, + h->m_pHostperlLIO, + h->m_pHostperlDir, + h->m_pHostperlSock, + h->m_pHostperlProc + ); + proto_perl->Isys_intern.internal_host = h; + h->host_perl = proto_perl; + return proto_perl; + +} +#endif