Bug #5240 » rb-th.diff
| ruby1.9.1-1.9.3~preview1+svn33077/thread_pthread.c | ||
|---|---|---|
|
static int timer_thread_pipe[2] = {-1, -1};
|
||
|
static int timer_thread_pipe_owner_process;
|
||
|
#if 0
|
||
|
static inline int
|
||
|
timer_thread_running() {
|
||
|
return timer_thread_pipe_owner_process == getpid() ? 1 : 0;
|
||
|
}
|
||
|
|
||
|
static inline void timer_thread_set() {
|
||
|
timer_thread_pipe_owner_process = getpid();
|
||
|
}
|
||
|
|
||
|
void timer_thread_child_at_fork() {
|
||
|
}
|
||
|
#else
|
||
|
static inline int
|
||
|
timer_thread_running() {
|
||
|
return timer_thread_pipe_owner_process;
|
||
|
}
|
||
|
|
||
|
static inline void timer_thread_set() {
|
||
|
timer_thread_pipe_owner_process = 1;
|
||
|
}
|
||
|
|
||
|
void timer_thread_child_at_fork() {
|
||
|
timer_thread_pipe_owner_process = 0;
|
||
|
}
|
||
|
#endif
|
||
|
#define TT_DEBUG 0
|
||
|
#define WRITE_CONST(fd, str) (void)(write((fd),(str),sizeof(str)-1)<0)
|
||
| ... | ... | |
|
ssize_t result;
|
||
|
/* already opened */
|
||
|
if (timer_thread_pipe_owner_process == getpid()) {
|
||
|
if (timer_thread_running()) {
|
||
|
const char *buff = "!";
|
||
|
retry:
|
||
|
if ((result = write(timer_thread_pipe[1], buff, 1)) <= 0) {
|
||
| ... | ... | |
|
#endif
|
||
|
/* communication pipe with timer thread and signal handler */
|
||
|
if (timer_thread_pipe_owner_process != getpid()) {
|
||
|
if (!timer_thread_running()) {
|
||
|
if (timer_thread_pipe[0] != -1) {
|
||
|
/* close pipe of parent process */
|
||
|
close_communication_pipe();
|
||
| ... | ... | |
|
#endif /* defined(HAVE_FCNTL) && defined(F_GETFL) && defined(F_SETFL) */
|
||
|
/* validate pipe on this process */
|
||
|
timer_thread_pipe_owner_process = getpid();
|
||
|
timer_thread_set();
|
||
|
}
|
||
|
/* create timer thread */
|
||