Message16487
Logged In: YES
user_id=6380
(You had me confused for a bit -- I thought you meant Python
2.3, but you meant file revision 2.3, which was in 1994...)
It can't be as simple as that; the 1994 code (rev 2.3)
initializes both main_pid and main_thread, and checks one or
the other in different places. The NOTES in that version
don't shed much light on the issue except claiming that
checking getpid() is a hack that works on three platforms
named: SGI, Solaris, and POSIX threads.
The code that is re-initializing main_pid in
PyOS_AfterFork()was added much later (rev 2.30, in 1997).
Here's my theory.
On SGI IRIX, like on pre-2.6-kernel-Linux, getpid() differs
per thread, and SIGINT is sent to each thread. The getpid()
test here does the right thing: it only sets the flag once
(in the handler in the main thread).
On Solaris, the getpid() test is a no-op, which is fine sice
only one thread gets the signal handler.
Those were the only two cases that the getpid() test really
cared for; the NOTES section speculated that it would also
work with POSIX threads if the signal was only delivered to
the main thread.
Conclusion: the getpid() test was *not* a mistake, and
replacing it with a get_thread_ident() test is not the right
answer.
But the getpid() test is probably not correct for all
pthreads implementations, and some fix may be necessary.
I also agree that blocking all signals is too aggressive,
but am not sure what to do about this either. (It has caused
some problems in my own code where I was spawning a
subprocess in a thread, and the subprocess inherited the
blocked signals, causing it to be unkillable except through
SIGKILL.)
Am I off the hook now? |
|
Date |
User |
Action |
Args |
2007-08-23 14:14:05 | admin | link | issue756924 messages |
2007-08-23 14:14:05 | admin | create | |
|