[M3devel] User-level threading

Tony Hosking hosking at cs.purdue.edu
Wed Jul 4 22:12:47 CEST 2007


In looking at things again, I am more and more convinced that  
ThreadPosix should be implemented against the standard API for  
makecontext/getcontext/setcontext/swapcontext.  Platforms that do not  
provide these will need to provide an equivalent implementation of  
these routines, similar to what you suggest.  Right now, I know all of
SOLgnu, I386_DARWIN, LINUXLIBC6, FreeBSD should have the necessary  
support.

On Jul 4, 2007, at 2:31 PM, Elmar Stellnberger wrote:

> It seems to be the same message, which I have sent to you.
> Has there been anything new you wanted to tell me?
> Is the setjmp/longjmp replacement of interest?
>
> Elmar Stellnberger wrote:
>> Not long ago I have fixed this problem by replacing setjmp/longjmp  
>> with my own i386 - implementations of these functions for SRC-M3.  
>> The result seems to be stable and correct. However this may be  
>> less favourable than using makecontext since the assembler  
>> routines will only work on i386 hardware. Moreover setjmp/longjmp  
>> are said that they may cause the loss of assignents, because they  
>> do not save certain registers(cx,dx) -> see "Exception semantics"  
>> at http://modula3.elegosoft.com/pm3/pkg/m3compiler/src/ 
>> restrictions.html. Nevertheless possible future changes on make/ 
>> get/setcontext will not be able to affect Modula-3 when extracting  
>> the SP from the context record any more if it does not rely on  
>> glibc functions. Another solution is to link against the old glibc  
>> files (unpacked into /lib/anc):
>>> ldd $(which m3build)
>> linux-gate.so.1 => (0xffffe000) libm3front.so.1 => /usr/local/m3/ 
>> lib/m3/pkg/m3front/LINUXLIBC6/libm3front.so.1 (0xb7dd2000) libm.so. 
>> 6 => /lib/anc/9.3/libm.so.6 (0xb7daf000) libc.so.6 => /lib/anc/9.3/ 
>> libc.so.6 (0xb7c95000) /lib/anc/9.3/ld-linux.so.2 (0xb7ef8000)  
>> Please tell me if you are intereseted in any of both solutions. I  
>> would suppose a solution for CM3 not to differ that much. Yours,  
>> Elmar Stellnberger Tony Hosking wrote:
>>> I have a question that may influence the direction we take with  
>>> user-level threading support. Currently, user-level threading is  
>>> broken on platforms that implement secure setjmp/longjmp via  
>>> encryption since hacking the jump buffers the way we currently do  
>>> for user-level threading triggers longjmp errors. A better  
>>> alternative is to use makecontext/getcontext/setcontext on  
>>> platforms that support it. For example, I know of the following  
>>> situation for the targets I track: Target System (pthreads)  
>>> threads User (setjmp/longjmp) threads User (getcontext/ 
>>> setcontext) threads LINUXLIBC6 YES NO unimplemented SOLgnu YES  
>>> unimplemented YES (but not using makecontext) PPC_DARWIN YES NO  
>>> no getcontext/setcontext I386_DARWIN YES NO no getcontext/ 
>>> setcontext FreeBSD NO YES unimplemented Ideally, we would  
>>> implement all user-level threading using makecontext and friends,  
>>> but my question is how many of our user-level threading targets  
>>> actually support that API? One strategy would be to re-implement  
>>> user-level threading using makecontext, etc., but fake up  
>>> makecontext support, etc., on those targets that don't have it. I  
>>> would hate to lose the user-level thread support just because it  
>>> makes sense in some situations (e.g., embedded, uni-processor).
>




More information about the M3devel mailing list