[comp.os.mach] thread_assign

helene@umiacs.umd.edu (Helene Young-Myers) (05/26/91)

     I found a problem with thread_assign() that some of you
may want to know about.
     
     It is fatal for thread_assign() to assign a thread to a
processor set  that the  thread is  already assigned to.  In
this  case,   Mach  forgets   to  reset  a  state  variable,
thread->may_assign.   The next  time a  kernel operation  is
performed on the thread, the requesting thread goes to sleep
forever, which  makes the  task an  uninterruptable process.
The task cannot be terminated, so the processors assigned to
the task  are never  released.   The next  time a cpu_server
function is called by another task, the cpu_server goes into
an infinite  loop.   Mach must  be rebooted  to correct  the
situation.
     
     Some may  wonder why  one would  assign a  thread to  a
processor set  that the thread is already assigned to.  This
happens when  there are  more C  threads to be assigned than
there are  processor sets,  and  some  C  threads  terminate
before others  are forked.   Because  the C  Threads package
recycles Mach  threads for efficiency, a new C thread may be
the same  Mach thread  as a  previously terminated C thread.
So, if  one is assigning each C thread to a processor set as
the C  thread is forked, it is possible that the actual Mach
thread will  be assigned  to a  processor set  that the Mach
thread is already assigned to.
     
     The way  to get around the problem right now is to keep
track  of  the  Mach  threads  that  are  assigned  to  each
processor set.  The Mach thread port ID is gotten by calling
thread_self().
     
     CMU is now aware of this problem.
     
                                   Helene