p153
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. <HEAD><TITLE>discuss@charon.mit.edu: [153] in "Pthreads Bugs"</TITLE>
  2. <H1>[153] in Pthreads Bugs</H1></HEAD>
  3. <A HREF="/"><IMG SRC="/i-d.gif" ALT="root"></A>
  4. <A HREF="?153"><IMG SRC="/i-back.gif" ALT="meeting"></A>
  5. <A HREF="/help.html"><IMG SRC="/i-help.gif" ALT="help"></A>
  6. <A HREF="1"><IMG SRC="/i-first.gif" ALT="first"></A>
  7. <A HREF="151"><IMG SRC="/i-fref.gif" ALT="first in chain"></A>
  8. <A HREF="152"><IMG SRC="/i-pref.gif" ALT="previous in chain"></A>
  9. <A HREF="152"><IMG SRC="/i-prev.gif" ALT="previous"></A>
  10. <A HREF="154"><IMG SRC="/i-next.gif" ALT="next"></A>
  11. <IMG SRC="/n-nref.gif" ALT="">
  12. <IMG SRC="/n-lref.gif" ALT="">
  13. <A HREF="161"><IMG SRC="/i-last.gif" ALT="last"></A>
  14. <HR><H2>Re: sleep / SIGALRM problem in 1_60_beta6</H2>
  15. <H3>daemon@ATHENA.MIT.EDU (Mon Dec  9 19:32:22 1996
  16. )</H3>
  17. <PRE>
  18. Date: Mon, 09 Dec 1996 17:22:50 -0700
  19. From: "Mark M. Evans" &lt;mevans@cti-ltd.com&gt;
  20. To: Tim Hinderliter &lt;kyd@internap.com&gt;
  21. Cc: pthreads-bugs@MIT.EDU
  22. I think I found what caused fd_kern_wait() to block for the entire
  23. hour (instead of waking up due to the SIGALRM).  Basically, the
  24. SIGALRM that would move the sleeping thread to the run queue occurs
  25. while pthread_kernel_lock is set, but *before* the critical section in
  26. fd_kern_wait() that sets __fd_kern_wait_timeout.tv_sec to 3600.  So,
  27. sig_handler_real() clears __fd_kern_wait_timeout.tv_sec "too soon."
  28. I've worked around this by checking sig_to_process in the critical
  29. section to determine if we are truly idle.  To do this I had to make
  30. sig_to_process publicly available.
  31. Here are the diffs (relative to the pthreads/pthreads directory):
  32. diff -c -r1.2 -r1.3
  33. *** signal.c 1996/11/20 05:09:50 1.2
  34. --- signal.c 1996/12/09 23:14:52 1.3
  35. ***************
  36. *** 65,71 ****
  37.    */
  38.   
  39.   static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, };
  40. ! static sig_atomic_t sig_to_process = 0;
  41.   
  42.   /* static volatile sigset_t sig_to_process; */
  43.   static volatile int sig_count = 0;
  44. --- 65,71 ----
  45.    */
  46.   
  47.   static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, };
  48. ! sig_atomic_t sig_to_process = 0;
  49.   
  50.   /* static volatile sigset_t sig_to_process; */
  51.   static volatile int sig_count = 0;
  52. *** fd_kern.c 1996/12/03 04:14:59 1.6
  53. --- fd_kern.c 1996/12/09 23:14:51 1.7
  54. ***************
  55. *** 215,221 ****
  56.    * Called when there is no active thread to run.
  57.    */
  58.   extern struct timeval __fd_kern_wait_timeout;
  59.   void fd_kern_wait()
  60.   {
  61.    fd_set fd_set_read, fd_set_write, fd_set_except;
  62. --- 215,221 ----
  63.    * Called when there is no active thread to run.
  64.    */
  65.   extern struct timeval __fd_kern_wait_timeout;
  66. ! extern volatile sig_atomic_t sig_to_process;
  67.   void fd_kern_wait()
  68.   {
  69.    fd_set fd_set_read, fd_set_write, fd_set_except;
  70. ***************
  71. *** 254,260 ****
  72.   
  73.    machdep_unset_thread_timer(NULL); 
  74.    __fd_kern_wait_timeout.tv_usec = 0;
  75. !  __fd_kern_wait_timeout.tv_sec = 3600;
  76.   
  77.    machdep_sys_sigprocmask(SIG_UNBLOCK, &amp;sig_to_block, &amp;oset);
  78.   
  79. --- 254,260 ----
  80.   
  81.    machdep_unset_thread_timer(NULL); 
  82.    __fd_kern_wait_timeout.tv_usec = 0;
  83. !  __fd_kern_wait_timeout.tv_sec = (sig_to_process) ? 0 : 3600;
  84.   
  85.    machdep_sys_sigprocmask(SIG_UNBLOCK, &amp;sig_to_block, &amp;oset);