[M3devel] thread calls on non-modula3 threads, win32 vs. posix

Tony Hosking hosking at cs.purdue.edu
Sun Sep 26 15:13:09 CEST 2010


Why does a native thread need M3-supported thread locals?  The idea is to keep native and M3 threads separate, right?

On 26 Sep 2010, at 08:21, Jay K wrote:

> 
> I think it is problematic in both.
> If I understand you.
> 
> 
> The thread locals could be allocated on-demand which might
> address some situations. Though that can also fail.
> 
> 
> A reasonable seeming place to allocate thread locals is m3core.DllMain(thread attach).
>   That even allows you to fail (due to low memory).
> However that doesn't work as well as one might hope.
> In particular, any number of threads can be created before a particular .dll is loaded.
> And a .dll can be unloaded while the threads still exist -- making also thread detach
> not so ideal for freeing. What you have to do is:
>   - be willing to allocate on demand  
>   - have some story for failure 
>   - track all the thread locals through a global (!) and free them in thread/process detach 
>    (but note that there are two .dll unload scenarios: FreeLibrary and ExitProcess;
>    there is a parameter that distinguishes them; best to do nothing, quickly in
>    the ExitProcess).
> 
> 
> Best really really really really best to avoid thread locals.
> But that is probably impossible.
> 
> 
> Cygwin does wacky stuff where it puts its thread locals at the top of the stack.
> Which doesn't solve the problems.
> 
> 
>  - Jay
> 
> ----------------------------------------
>> From: hosking at cs.purdue.edu
>> Date: Sat, 25 Sep 2010 10:32:21 -0400
>> To: jay.krell at cornell.edu
>> CC: m3devel at elegosoft.com
>> Subject: Re: [M3devel] thread calls on non-modula3 threads, win32 vs. posix
>> 
>> Is it ok in the WIn32 implementation for the thread to be native.
>> I think it is ok for pthread.
>> 
>> On 25 Sep 2010, at 05:35, Jay K wrote:
>> 
>>> 
>>> PROCEDURE AlertWait (m: Mutex; c: Condition) RAISES {Alerted} =
>>> (* LL = m *)
>>> VAR self := GetActivation();
>>> BEGIN
>>> IF DEBUG THEN ThreadDebug.AlertWait(m, c); END;
>>> IF self = NIL THEN Die(ThisLine(), "AlertWait called from non-Modula-3 thread") END;
>>> XWait(m, c, self, alertable := TRUE);
>>> END AlertWait;
>>> 
>>> 
>>> The pthread code doesn't have the check for NIL and call to Die.
>>> Nor for that matter, the uses of ThreadDebug -- which I added.
>>> 
>>> I think these should be more similar.
>>> 
>>> What I was really wondering about, again, is more common code between Win32 and Posix
>>> in the thread code...
>>> 
>>> - Jay
>>> 
>> 
> 		 	   		  




More information about the M3devel mailing list