avoid race condition in the CAPI extension bootstrap handler
Gurusamy Sarathy [Thu, 24 Jun 1999 22:41:17 +0000 (22:41 +0000)]
p4raw-id: //depot/perl@3549

lib/ExtUtils/xsubpp
win32/GenCAPI.pl

index 416c1d5..83ad03a 100755 (executable)
@@ -1327,8 +1327,7 @@ print Q<<"EOF";
 ##endif
 #XSCAPI(boot_$Module_cname)
 #[[
-#    SetCPerlObj(pPerl);
-#    boot__CAPI_entry(cv);
+#    boot_CAPI_handler(cv, boot__CAPI_entry, pPerl);
 #]]
 ##endif        /* PERL_CAPI */
 EOF
index 60d199d..63688af 100644 (file)
@@ -527,6 +527,7 @@ readvars %globvar, '..\perlvars.h','G';
 open(HDRFILE, ">$hdrfile") or die "$0: Can't open $hdrfile: $!\n";
 print HDRFILE <<ENDCODE;
 void SetCPerlObj(void* pP);
+void boot_CAPI_handler(CV *cv, void (*subaddr)(CV *c), void *pP);
 CV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename);
 
 ENDCODE
@@ -598,6 +599,14 @@ U32 *      _Perl_opargs(void)
     return pPerl->Perl_get_opargs();
 }
 
+void boot_CAPI_handler(CV *cv, void (*subaddr)(CV *c), void *pP)
+{
+#ifndef NO_XSLOCKS
+    XSLock localLock((CPerlObj*)pP);
+#endif
+    subaddr(cv);
+}
+
 void xs_handler(CV* cv, CPerlObj* p)
 {
     void(*func)(CV*);