thread-priority>? Marc Feeley 15 Apr 2000 02:16 UTC

It's nice to see the flurry of exchanges today!  Let me summarize the
main problems I see with the existence of a settable thread-priority>?
procedure.

1) Scheduling order depends on the definition of thread-priority>?
   which means libraries (and any code not written by the one setting
   thread-priority>?) can't depend on a particular semantics for
   threads (in essence, threads can't be used in such code).  In
   particular this means that the runtime system can't use threads
   internally (to implement I/O, real-time clock, event listener,
   etc).

2) The meaning of (current-thread), (current-exception-handler), and
   the dynamic environment in general during the execution of
   thread-priority>? is undefined.

3) The thread-priority>? procedure must be written with several
   restrictions to prevent the scheduler from being called.
   These restrictions are implementation dependent.  For example,
   for the Gambit-C system the restrictions are:

    - no preemption timer interrupt must occur (because this might
      cause the scheduler to access an inconsistent queue of runnable
      threads)

    - no exception can be raised (because the exception handler is
      undefined)

    - no memory allocation can occur (because it could call the GC,
      which might try to display a GC report, which will try to lock
      an I/O buffer mutex, which might cause the current thread to
      block; and also because a heap overflow exception might be
      raised; and also because a user defined finalization procedure
      might be run which does "wild" things like terminate a thread),
      note that calling + and < and many other variable arity
      primitives may cause memory to be allocated for the rest
      parameter

   The restrictions may be completely different for other systems.  If
   we use a system that is lower-level some of these restrictions may
   disappear.  For example, if we just assume a system with the power
   of C, the first restriction can be solved by masking the timer
   signal, the second restriction does not apply because C does not
   have exceptions, and the third restriction does not apply because C
   does not have a GC.  thread-priority>? is easy to write in C
   because you have control over every little detail of the execution.
   thread-priority>? is impossible to write in standard Scheme because
   there are unknown implicit operations that occur that the user
   can't control.  On the other hand, the implementor of a Scheme
   system can implement thread-priority>? internally because he/she
   knows how to prevent problematic operations.  Trust me, the
   implementation I will supply with SRFI-18 will be non-portable!

So if SRFI-18 specified a settable thread-priority>? procedure, the
specification would have to be so vague that it couldn't be used in
portable code.  In essence, the user would have to define
thread-priority>?  differently on each Scheme system.  I think it is
best to leave thread-priority>? out of SRFI-18 and let each Scheme
system that can and wants to support a settable thread-priority>? to
provide it as an extension to SRFI-18 and document the specific
restrictions.

Personally, even though it is possible to support a settable
thread-priority>? in Gambit-C (with the above restrictions), I will
not provide such support because the documentation would involve and
expose too much of the inner workings of the system (such as which
primitives allocate memory under what conditions and which don't) and
it is likely that too much user code would break in subtle ways from
one release of the compiler to the next.  I guess what I'm saying is
that I don't want Scheme to acquire the bad qualities of low-level
programming languages.

Marc