[fpc-devel] StdOut capture for FPC RTL
Michael Van Canneyt
michael at freepascal.org
Fri Nov 26 11:11:32 CET 2010
On Fri, 26 Nov 2010, Jonas Maebe wrote:
>
> On 25 Nov 2010, at 20:15, Anton Kavalenka wrote:
>
>> At 25.11.2010 19:57, Jonas Maebe wrote:
>>> Actually, that won't work because the different threads will then work on
>>> a common buffer but with distinct pointers into it. A better solution is
>>> probably to do this in the intialisation code of each thread instead:
>>>
>>> {$ifdef unix}
>>> fpclose(ttextrec(stdout).handle);
>>> {$elsif defined(MSWINDOWS)}
>>> { this is a copy of do_close() from the rtl, I don't know whether
>>> a new handle from a thread can actually have any of these values }
>>> if (handle<> StdInputHandle) and
>>> (handle<> StdOutputHandle) and
>>> (handle<> StdErrorHandle) then
>>> CloseHandle(ttextrec(stdout).handle);
>>> {$else}
>>> {$error Add support for this platform}
>>> {$endif}
>>>
>>> ttextrec(stdout).handle:=myglobalstdouthandle;
>>>
>> That's unsuitable. I have lots of modules and lost of threads. Many modules
>> built with C++ runtime, others with C.
>
> The C++ and C threads won't have their input/output handles replaced by
> default, since they are not started via the FPC RTL. The only exception is in
> case they call back into Pascal code and they are subsequently hooked by the
> RTL because the Pascal code (indirectly) accesses a threadvar.
>
> Coincidentally, just the other day we were discussing introducing the ability
> to install hooks that will be called automatically whenever an external
> thread is hooked by the RTL (since the RTL has to initialise a bunch of
> things at such a point, so may user code). You could do whatever
> initialisation you need to do at that point.
>
> I think we could extend such a callback mechanism to all threads, possibly
> with a boolean parameter indicating whether the thread was started via the
> FPC RTL or not in case the difference is important in some use cases.
I think this is not bad; the question is whether we can do it on unix.
On Unix, we can currently only check when a threadvar is accessed.
Michael.
More information about the fpc-devel
mailing list