patcat88 has asked for the wisdom of the Perl Monks concerning the following question:
Below is same sample script with PERL_SET_CONTEXT being run.C:\Documents and Settings\Owner\Desktop>perl w32inethttpsample.pl Perl perl land thread id=27716 callback=0, constant=-1 PerlCallback: entering PerlCallback: got context=1 mystatus=60 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=27716 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC r=13369352 Connection num=0,text=The operation completed successfully. callback INTERNET_STATUS_HANDLE_CREATED 13369352 PerlCallback: entering PerlCallback: got context=2 mystatus=60 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=27716 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC callback INTERNET_STATUS_HANDLE_CREATED 13369356 OpenRequest num=122,text=The data area passed to a system call is too +small. We are at last point before SendRequest(), which will trigger the cras +h Press any key to continue . . . SendRequest num=997,text=Overlapped I/O operation is in progress. callback INTERNET_STATUS_HANDLE_CREATED 13369356 sleeping while downloading PerlCallback: entering PerlCallback: got context=2 mystatus=320 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=6728 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00000000 sleeping while downloading sleeping while downloading sleeping while downloading sleeping while downloading C:\Documents and Settings\Owner\Desktop>
Heres the sample script I am using to generate the above 2 test runs.C:\Documents and Settings\Owner\Desktop>perl w32inethttpsample.pl Perl perl land thread id=48644 callback=0, constant=-1 PerlCallback: entering PerlCallback: got context=1 mystatus=60 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=48644 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC r=13369352 Connection num=0,text=The operation completed successfully. callback INTERNET_STATUS_HANDLE_CREATED 13369352 PerlCallback: entering PerlCallback: got context=2 mystatus=60 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=48644 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC callback INTERNET_STATUS_HANDLE_CREATED 13369356 OpenRequest num=122,text=The data area passed to a system call is too +small. We are at last point before SendRequest(), which will trigger the cras +h Press any key to continue . . . SendRequest num=997,text=Overlapped I/O operation is in progress. callback INTERNET_STATUS_HANDLE_CREATED 13369356 sleeping while downloading PerlCallback: entering PerlCallback: got context=2 mystatus=320 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=10 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=11 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=20 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=21 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=30 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=31 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=40 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=41 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=110 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =10035 PerlCallback: GetLastError() =10035 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=320 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=10 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=11 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=20 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=21 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=30 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=31 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=40 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=41 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=2 mystatus=100 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=45252 PerlCallback: GetLastError() =0 PerlCallback: GetLastError() =0 PerlCallback: pointer from Perl_get_context() =00233BFC HTTP code = 200 callback INTERNET_STATUS_REQUEST_COMPLETE 0 first 40 chars of file are "<!doctype html><html><head><meta http-eq" PerlCallback: entering PerlCallback: got context=2 mystatus=70 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=48644 PerlCallback: GetLastError() =10035 PerlCallback: GetLastError() =10035 PerlCallback: pointer from Perl_get_context() =00233BFC PerlCallback: entering PerlCallback: got context=1 mystatus=70 PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC PerlCallback: ThreadId=48644 PerlCallback: GetLastError() =10035 PerlCallback: GetLastError() =10035 PerlCallback: pointer from Perl_get_context() =00233BFC C:\Documents and Settings\Owner\Desktop>
The below is the patch file against Internet.xs#!/usr/bin/perl -w use Win32; #for Win32::GetCurrentThreadId() use Win32::Internet; %s = ( '10' => 'INTERNET_STATUS_RESOLVING_NAME', '11' => 'INTERNET_STATUS_NAME_RESOLVED', '20' => 'INTERNET_STATUS_CONNECTING_TO_SERVER', '21' => 'INTERNET_STATUS_CONNECTED_TO_SERVER', '30' => 'INTERNET_STATUS_SENDING_REQUEST', '31' => 'INTERNET_STATUS_REQUEST_SENT', '40' => 'INTERNET_STATUS_RECEIVING_RESPONSE', '41' => 'INTERNET_STATUS_RESPONSE_RECEIVED', '42' => 'INTERNET_STATUS_CTL_RESPONSE_RECEIVED', '43' => 'INTERNET_STATUS_PREFETCH', '50' => 'INTERNET_STATUS_CLOSING_CONNECTION', '51' => 'INTERNET_STATUS_CONNECTION_CLOSED', '60' => 'INTERNET_STATUS_HANDLE_CREATED', '70' => 'INTERNET_STATUS_HANDLE_CLOSING', '80' => 'INTERNET_STATUS_DETECTING_PROXY', '100' => 'INTERNET_STATUS_REQUEST_COMPLETE', '110' => 'INTERNET_STATUS_REDIRECT', '120' => 'INTERNET_STATUS_INTERMEDIATE_RESPONSE', '140' => 'INTERNET_STATUS_USER_INPUT_REQUIRED', '200' => 'INTERNET_STATUS_STATE_CHANGE', '320' => 'INTERNET_STATUS_COOKIE_SENT', '321' => 'INTERNET_STATUS_COOKIE_RECEIVED', '324' => 'INTERNET_STATUS_PRIVACY_IMPACTED', '325' => 'INTERNET_STATUS_P3P_HEADER', '326' => 'INTERNET_STATUS_P3P_POLICYREF', '327' => 'INTERNET_STATUS_COOKIE_HISTORY' ); $c = new Win32::Internet({'flags'=>INTERNET_FLAG_ASYNC}); print "Perl perl land thread id=".Win32::GetCurrentThreadId()."\n"; $c->SetStatusCallback(); print 'r='.$c->HTTP($http, "google.com", undef, undef, undef, undef, 1 +)."\n"; ($num, $text) = $c->Error(); print "Connection num=$num,text=$text\n"; #($status, $info) = $c->GetStatusCallback(1); #print 'callback '.$s{$status}." $info \n"; $http->OpenRequest($req, '/', 'GET', 'HTTP/1.1', '', undef, 0, 2); #($status, $info) = $c->GetStatusCallback(2); #print 'callback '.$s{$status}." $info \n"; ($num, $text) = $http->Error(); print "OpenRequest num=$num,text=$text\n"; print "We are at last point before SendRequest(), which will trigger t +he crash\n"; system('pause'); $req->SendRequest(); ($num, $text) = $http->Error(); print "SendRequest num=$num,text=$text\n"; #($status, $info) = $c->GetStatusCallback(2); #print 'callback '.$s{$status}." $info \n"; while($req->QueryInfo("",HTTP_QUERY_STATUS_CODE) == 0) {print "sleepin +g while downloading\n"; sleep 1;} print "HTTP code = ".$req->QueryInfo("",HTTP_QUERY_STATUS_CODE)."\n"; #($status, $info) = $c->GetStatusCallback(2); #print 'callback '.$s{$status}." $info \n"; $file = $req->ReadEntireFile(); print 'first 40 chars of file are "'.substr($file,0,40)."\"\n"; $http->Close();
If anyone wants, here is my modified makefile.pl patch--- internet.xs.old 2008-04-15 20:01:52.000000000 -0400 +++ internet.xs 2010-10-05 03:18:24.609375000 -0400 @@ -57,7 +57,7 @@ // VALUES FILLED IN BY PerlCallback DWORD status = -1; - +static PerlInterpreter *myWin32InternetPerlInterpreterPtr; static time_t ft2timet(FILETIME *ft) { SYSTEMTIME st; @@ -824,7 +824,22 @@ // ;) // if(mystatus!=status) { - dSP; + SV **sp; + void * myptr; + printf("PerlCallback: entering\n"); + printf("PerlCallback: got context=%d mystatus=%d\n",context,m +ystatus); + printf("PerlCallback: myWin32InternetPerlInterpreterPtr=%p\n" +,myWin32InternetPerlInterpreterPtr); + + //comment below out to trigger original crash/bug in Win32::I +nternet and recompile + PERL_SET_CONTEXT(myWin32InternetPerlInterpreterPtr); + + printf("PerlCallback: ThreadId=%d\n",GetCurrentThreadId()); + printf("PerlCallback: GetLastError() =%d\n",GetLastError()); + myptr = PERL_GET_CONTEXT; + printf("PerlCallback: GetLastError() =%d\n",GetLastError()); + printf("PerlCallback: pointer from Perl_get_context() =%p\n", +myptr); + //can't use dSP because we are after variable declarations + sp = PL_stack_sp; ENTER; SAVETMPS; PUSHMARK(sp); @@ -889,6 +904,7 @@ LPCTSTR proxybypass DWORD flags CODE: + myWin32InternetPerlInterpreterPtr = my_perl; RETVAL = InternetOpen(agent,type,proxy,proxybypass,flags); OUTPUT: RETVAL
--- makefile.pl.old 2008-02-22 18:41:48.000000000 -0500 +++ makefile.pl 2010-10-03 21:23:51.500000000 -0400 @@ -22,16 +22,18 @@ use Config qw(%Config); sub const_loadlibs { my ($self) = @_; - if ($^O eq "MSWin32") { - if ($Config{cc} =~ /^gcc/i) { - $self->{LDLOADLIBS} .= " -lwininet"; - } - elsif ($Config{cc} =~ /^bcc/i) { - $self->{LDLOADLIBS} .= " inet.lib"; - } - elsif ($] == 5.006 && $Config{cc} =~ /^cl/i) { - $self->{LDLOADLIBS} .= " wininet.lib"; - } - } + $self->{LDLOADLIBS} .= " wininet.lib"; + +# if ($^O eq "MSWin32") { +# if ($Config{cc} =~ /^gcc/i) { +# $self->{LDLOADLIBS} .= " -lwininet"; +# } +# elsif ($Config{cc} =~ /^bcc/i) { +# $self->{LDLOADLIBS} .= " inet.lib"; +# } +# elsif ($] == 5.006 && $Config{cc} =~ /^cl/i) { +# $self->{LDLOADLIBS} .= " wininet.lib"; +# } + # } return $self->SUPER::const_loadlibs; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Win32::Internet crash, XS, callbacks, perl stack & context, windows api, interpreter thread safety, 1 perl, many C threads by windows
by BrowserUk (Patriarch) on Oct 06, 2010 at 08:54 UTC | |
|
Re: Win32::Internet crash, XS, callbacks, perl stack & context, windows api, interpreter thread safety, 1 perl, many C threads by windows
by locked_user sundialsvc4 (Abbot) on Oct 06, 2010 at 13:17 UTC | |
by patcat88 (Deacon) on Oct 07, 2010 at 05:32 UTC | |
by BrowserUk (Patriarch) on Oct 07, 2010 at 07:12 UTC |