[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