in reply to Re: Read STDOUT from Win32::Job while process is running in thread Read STDOUT from Win32::Job while process is running
Thank you for that great answer. In theory I understand completely what your code is doing.
But my problem is that I don't get it running. I get the following messages:
Starting Build Preprocess Stage
Finished Build Preprocess Stage
Starting Build Parse Stage
Finished Build Parse Stage
Starting Build Glue 1 Stage
Finished Build Glue 1 Stage
Starting Build Glue 2 Stage
Finished Build Glue 2 Stage
Starting Build Glue 3 Stage
Finished Build Glue 3 Stage
Starting Build Compile Stage
Starting "perl Makefile.PL" Stage
Set up gcc environment - 3.4.5 (mingw-vista special r3)
Writing Makefile for JobObject
Finished "perl Makefile.PL" Stage
Starting "make" Stage
warning: extra args ignored after '-e'
And then the script continues running endlessly without starting any processes.
When I tried it with the debugger I could not even reach the first perl statement and got the same messages.
When your code is running here on my computer, I'd like to put your code into a module and then post it here.
I ask myself if I'm doing weird things because nobody seems to need this functionality. I would assume that many people would need this useful functionality.
Thank you alot.
Re^3: Read STDOUT from Win32::Job while process is running
by BrowserUk (Patriarch) on Mar 09, 2012 at 11:08 UTC
|
I can't help you with I::C on mingw. Hopefully, syphilis will wander by sometime.
In the meantime, I've built a crude package -- no docs or tests etc. -- from the 3 functions. It builds and runs here. If you give me your mail addy (via /msg) I'll send you the dist.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
| [reply] [Watch: Dir/Any] |
Re^3: Read STDOUT from Win32::Job while process is running
by syphilis (Archbishop) on Mar 09, 2012 at 18:43 UTC
|
warning: extra args ignored after '-e'
This warning doesn't ring any bells with me. How did you install Inline ? (You need to build and install it from source - eg doing a 'ppm install' won't do.) Knowing the output of 'perl -V' would also help - as, too, would knowing any additional diagnostics that you're getting.
The code, as posted by BrowserUk, won't compile for me using the MinGW port of gcc-3.4.5, because of a deficiency in winnt.h. In that file you'll need to add:
#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x2000
For some reason (that I haven't yet investigated), with ActivePerl I then get undefined references to `CreateJobObjectA', `SetInformationJobObject', `AssignProcessToJobObject' - which is odd, because these symbols are all defined in libbkernel32.a and we link to that library. (It may just be that we need to link to libkernel32.a *before* JobObject.o.) Anyway, if you get to the same snag we can dig a bit deeper then. First we need to work out what that warning is all about.
Cheers, Rob | [reply] [Watch: Dir/Any] [d/l] |
|
For some reason (that I haven't yet investigated), with ActivePerl I then get undefined references to `CreateJobObjectA', `SetInformationJobObject', `AssignProcessToJobObject'
Well ... I investigated and investigated ... then investigated a bit more ... and still couldn't see what the problem was. So I then gave up and posted to the ActiveState users list - and about half an hour later Mark Dootson replied with the explanation and solution.
When this linking problem occurs, we'll find that lib/CORE/win32.h begins with something like:
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
#endif
But we need _WIN32_WINNT to be >= 0x0500 - which I achieved by altering the above code to:
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0500
#endif
That then enables the script to run to completion, and I think it also takes care of the '...undefined; assuming extern returning int' warnings with Microsoft compilers.
Cheers, Rob
| [reply] [Watch: Dir/Any] [d/l] [select] |
|
Wow, thank you so much for taking time to investigate and even writing to ActiveState. It's working now and I'm happy.
Here the successful output:
E:\perl\Win32-JobAdd-0.01>dmake
cp lib/Win32/JobAdd.pm blib\lib\Win32\JobAdd.pm
C:\Perl\bin\perl.exe C:\Perl\lib\ExtUtils\xsubpp -typemap C:\Perl\lib
+\ExtUtils\
typemap JobAdd.xs > JobAdd.xsc && C:\Perl\bin\perl.exe -MExtUtils::Co
+mmand -e "
mv" -- JobAdd.xsc JobAdd.c
Please specify prototyping behavior for JobAdd.xs (see perlxs manual)
C:/Perl/site/bin/gcc.exe -c -I. -DNDEBUG -DWIN32 -D_CONSOLE -D
+NO_STRICT
-DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMP
+LICIT_CONT
EXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX -DHASATTRIB
+UTE -fno-s
trict-aliasing -mms-bitfields -O2 -DVERSION=\"0.01\" -DXS_V
+ERSION=\"0
.01\" "-IC:\Perl\lib\CORE" JobAdd.c
JobAdd.xs: In function `createJobObject':
JobAdd.xs:18: warning: passing arg 1 of `SetInformationJobObject' make
+s pointer
from integer without a cast
JobAdd.xs: In function `assignProcessToJobObject':
JobAdd.xs:24: warning: passing arg 1 of `AssignProcessToJobObject' mak
+es pointer
from integer without a cast
Running Mkbootstrap for Win32::JobAdd ()
C:\Perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 644 JobAdd.bs
C:\Perl\bin\perl.exe -MExtUtils::Mksymlists \
-e "Mksymlists('NAME'=>\"Win32::JobAdd\", 'DLBASE' => 'JobAdd', '
+DL_FUNCS'
=> { }, 'FUNCLIST' => [], 'IMPORTS' => { }, 'DL_VARS' => []);"
Set up gcc environment - 3.4.5 (mingw-vista special r3)
dlltool --def JobAdd.def --output-exp dll.exp
C:\Perl\site\bin\g++.exe -o blib\arch\auto\Win32\JobAdd\JobAdd.dll -Wl
+,--base-fi
le -Wl,dll.base -mdll -L"C:\Perl\lib\CORE" JobAdd.o -Wl,--image-base,0
+x2e0b0000
C:\Perl\lib\CORE\perl510.lib -lkernel32 -luser32 -lgdi32 -lwinspool -
+lcomdlg32
-ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lm
+pr -lwinmm
-lversion -lodbc32 -lodbccp32 -lcomctl32 -lmsvcrt dll.exp
dlltool --def JobAdd.def --base-file dll.base --output-exp dll.exp
C:\Perl\site\bin\g++.exe -o blib\arch\auto\Win32\JobAdd\JobAdd.dll -md
+ll -L"C:\P
erl\lib\CORE" JobAdd.o -Wl,--image-base,0x2e0b0000 C:\Perl\lib\CORE\p
+erl510.lib
-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell3
+2 -lole32
-loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32
+ -lodbccp3
2 -lcomctl32 -lmsvcrt dll.exp
C:\Perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 755 blib\arch\a
+uto\Win32\
JobAdd\JobAdd.dll
C:\Perl\bin\perl.exe -MExtUtils::Command -e "cp" -- JobAdd.bs blib\arc
+h\auto\Win
32\JobAdd\JobAdd.bs
C:\Perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 644 blib\arch\a
+uto\Win32\
JobAdd\JobAdd.bs
| [reply] [Watch: Dir/Any] [d/l] |
|
Well ... I investigated and investigated ... then investigated a bit more ... and still couldn't see what the problem was.
So I then gave up and posted to the ActiveState users list - and about half an hour later Mark Dootson replied with the explanation and solution.
Well done and thank you.++
Rather than requiring the Perl sources modification -- which might be needed by something somewhere -- adding the define before the inclusion of the Perl headers achieves the same thing in a self-contained way. I've also cleaned up a couple of the warnings -- though traded them for others in some cases, but I'm not sure there is a better way?
The result looks like this:
#define _WIN32_WINNT 0x0500
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifndef JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x2000
#endif
int createJobObject( char *name ) {
HANDLE job;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0, };
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_J
+OB_CLOSE;
job = CreateJobObjectA( NULL, name );
SetInformationJobObject( job, 9, &jeli, sizeof(jeli) );
return (int)job;
}
int assignProcessToJobObject( int job, int pid ) {
HANDLE hProc = OpenProcess( PROCESS_SET_QUOTA |PROCESS_TERMINATE,
+0, pid );
return (int)AssignProcessToJobObject( (HANDLE)job, hProc );
}
int closeHandle( int handle ) {
return (int)CloseHandle( (HANDLE)handle );
}
MODULE = Win32::JobAdd PACKAGE = Win32::JobAdd
int
createJobObject (name)
char * name
int
assignProcessToJobObject (job, pid)
int job
int pid
int
closeHandle (handle)
int handle
Salient part of the build trace: JobAdd.c
JobAdd.xs(18) : warning C4311: 'type cast' : pointer truncation from '
+HANDLE' to 'int'
JobAdd.xs(24) : warning C4312: 'type cast' : conversion from 'int' to
+'HANDLE' of greater size
JobAdd.xs(28) : warning C4312: 'type cast' : conversion from 'int' to
+'HANDLE' of greater size
link -out:blib\arch\auto\Win32\JobAdd\JobAdd.dll -dll -nologo
+-nodefaultlib -debug -opt:ref,icf -ltcg ...
Creating library blib\arch\auto\Win32\JobAdd\JobAdd.lib and object
+blib\arch\auto\Win32\JobAdd\JobAdd.exp
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
| [reply] [Watch: Dir/Any] [d/l] [select] |
|
|
|
|
|
Thanks alot for your answer. I installed it via "ppm". I'll install it via cpan to avoid the warning.
Now BrowserUk developed a Win32-JobAdd package which contains the same C code in a xs file. And you're right I had to set the value 0x2000 for the constant. And now I get exactly the undefined references which you describe.
Here the messages:
E:\perl\Win32-JobAdd-0.01>dmake
cp lib/Win32/JobAdd.pm blib\lib\Win32\JobAdd.pm
C:\Perl\bin\perl.exe C:\Perl\lib\ExtUtils\xsubpp -typemap C:\Perl\lib
+\ExtUtils\
typemap JobAdd.xs > JobAdd.xsc && C:\Perl\bin\perl.exe -MExtUtils::Co
+mmand -e "
mv" -- JobAdd.xsc JobAdd.c
Please specify prototyping behavior for JobAdd.xs (see perlxs manual)
C:/Perl/site/bin/gcc.exe -c -I. -DNDEBUG -DWIN32 -D_CONSOLE -D
+NO_STRICT
-DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMP
+LICIT_CONT
EXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX -DHASATTRIB
+UTE -fno-s
trict-aliasing -mms-bitfields -O2 -DVERSION=\"0.01\" -DXS_V
+ERSION=\"0
.01\" "-IC:\Perl\lib\CORE" JobAdd.c
Running Mkbootstrap for Win32::JobAdd ()
C:\Perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 644 JobAdd.bs
C:\Perl\bin\perl.exe -MExtUtils::Mksymlists \
-e "Mksymlists('NAME'=>\"Win32::JobAdd\", 'DLBASE' => 'JobAdd', '
+DL_FUNCS'
=> { }, 'FUNCLIST' => [], 'IMPORTS' => { }, 'DL_VARS' => []);"
Set up gcc environment - 3.4.5 (mingw-vista special r3)
dlltool --def JobAdd.def --output-exp dll.exp
C:\Perl\site\bin\g++.exe -o blib\arch\auto\Win32\JobAdd\JobAdd.dll -Wl
+,--base-fi
le -Wl,dll.base -mdll -L"C:\Perl\lib\CORE" JobAdd.o -Wl,--image-base,0
+x2e0b0000
C:\Perl\lib\CORE\perl510.lib -lkernel32 -luser32 -lgdi32 -lwinspool -
+lcomdlg32
-ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lm
+pr -lwinmm
-lversion -lodbc32 -lodbccp32 -lcomctl32 -lmsvcrt dll.exp
JobAdd.o:JobAdd.c:(.text+0x3f): undefined reference to `CreateJobObjec
+tA'
JobAdd.o:JobAdd.c:(.text+0x5f): undefined reference to `SetInformation
+JobObject'
JobAdd.o:JobAdd.c:(.text+0xa1): undefined reference to `AssignProcessT
+oJobObject
'
collect2: ld returned 1 exit status
dmake.exe: Error code 129, while making 'blib\arch\auto\Win32\JobAdd\
+JobAdd.dll
'
Cheers,
Dirk | [reply] [Watch: Dir/Any] [d/l] |
|
And now I get exactly the undefined references which you describe
Heh ... timing. The solution probably hit the list while you were composing your reply ;-)
At least, that *should* be the solution - let us know if it doesn't do the trick for you.
Cheers, Rob
| [reply] [Watch: Dir/Any] |
|
|