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