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

MySQL数据库

开发平台:

Visual C++

  1. <HEAD><TITLE>discuss@charon.mit.edu: [155] in "Pthreads Bugs"</TITLE>
  2. <H1>[155] in Pthreads Bugs</H1></HEAD>
  3. <A HREF="/"><IMG SRC="/i-d.gif" ALT="root"></A>
  4. <A HREF="?155"><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. <IMG SRC="/n-fref.gif" ALT="">
  8. <IMG SRC="/n-pref.gif" ALT="">
  9. <A HREF="154"><IMG SRC="/i-prev.gif" ALT="previous"></A>
  10. <A HREF="156"><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>pthread_kill() Bug</H2>
  15. <H3>daemon@ATHENA.MIT.EDU (Thu Dec 26 20:34:45 1996
  16. )</H3>
  17. <PRE>
  18. From: Chris Colohan &lt;colohan@eecg.toronto.edu&gt;
  19. To: pthreads-bugs@MIT.EDU, proven@MIT.EDU
  20. Date:  Thu, 26 Dec 1996 20:33:48 -0500
  21. pthread_kill() has a problem in PThreads 1.60beta6.  It checks to see
  22. if the target thread is in the state PS_SIGWAIT, and if it is it
  23. reschedules it.  But it does not check if there is more than one
  24. thread in the PS_SIGWAIT state, and hence mangles the pthread_sigwait
  25. linked list, potentially resulting in threads getting blocked forever,
  26. and signals never being delivered.  I have a *very* contrived test
  27. case that demonstrates this problem if you would like it.  Please let
  28. me know...
  29. Chris
  30. ===
  31. Diffs created with diff -c:
  32. *** /home/colohan/thesis/t/pthreads-1_60_beta6/pthreads/pthread_kill.c Tue Feb 21 03:07:18 1995
  33. --- pthread_kill.c Thu Dec 26 19:50:22 1996
  34. ***************
  35. *** 41,51 ****
  36. --- 41,58 ----
  37.   
  38.   #include &lt;pthread.h&gt;
  39.   
  40. + /* Defined in sig.c, a linked list of threads currently
  41. +  * blocked in sigwait(): */
  42. + extern struct pthread * pthread_sigwait;
  43.   /* ==========================================================================
  44.    * pthread_kill()
  45.    */
  46.   int pthread_kill(struct pthread * pthread, int sig)
  47.   {
  48. +  struct pthread ** pthread_ptr;
  49.    pthread_sched_prevent();
  50.   
  51.    /* Check who is the current owner of pthread */
  52. ***************
  53. *** 53,62 ****
  54.    if (0) {
  55.    } else {
  56.    if (pthread-&gt;state == PS_SIGWAIT) {
  57. !  if (sigismember(pthread-&gt;data.sigwait, sig)) {
  58. !  *(int *)(pthread-&gt;ret) = sig;
  59. !  pthread_sched_other_resume(pthread);
  60. !  return(OK);
  61.    }
  62.    }
  63.    sigaddset(&amp;(pthread-&gt;sigpending), sig);
  64. --- 60,84 ----
  65.    if (0) {
  66.    } else {
  67.    if (pthread-&gt;state == PS_SIGWAIT) {
  68. !  if(sigismember(pthread-&gt;data.sigwait, sig)) {
  69. !      for (pthread_ptr = &amp;pthread_sigwait;
  70. !   (*pthread_ptr);
  71. !   pthread_ptr = &amp;((*pthread_ptr)-&gt;next)) {
  72. !  if ((*pthread_ptr) == pthread) {
  73. !      /* Take the thread out of the
  74. !       * pthread_sigwait linked list: */
  75. !      *pthread_ptr=(*pthread_ptr)-&gt;next;
  76. !      *(int *)(pthread-&gt;ret) = sig;
  77. !      pthread_sched_other_resume(pthread);
  78. !      return(OK);
  79. !  }
  80. !      }
  81. !      /* A thread should not be in the state PS_SIGWAIT
  82. !       * without being in the pthread_sigwait linked
  83. !       * list: */
  84. !      PANIC();
  85.    }
  86.    }
  87.    sigaddset(&amp;(pthread-&gt;sigpending), sig);