[Lazarus] Why development remains constant for msdos?

Mark Morgan Lloyd markMLl.lazarus at telemetry.co.uk
Wed Sep 25 12:45:31 CEST 2013


Nikolay Nikolov wrote:
> On 09/25/2013 11:26 AM, Michael Schnell wrote:
>> On 09/24/2013 10:58 AM, Nikolay Nikolov wrote:
>>>
>>> When you try to create a thread, your program terminates and writes a 
>>> message that threading is not supported.
>>
>> While this absolutely does make sense, one could think about 
>> alternatives.
>>
>> AFAIK, (at least for some archs) there is a variant of the pthread 
>> (="POSIX thread") library, that internally does "user-land 
>> multithreading". IIRC, the original POSIX definition was done with 
>> exactly this in mind and, regarding Linux, the original Linux 
>> implementations (aka "Linux Threads")  was not fully compatible with 
>> POSIX. Only some years ago, the Linux changed it's way of Kernel-based 
>> thread handling to the POSIX compatible "NPTL" implementation.
>>
>> Thus it should be possible to link fpc projects to a user-land thread 
>> enabled version of pthreadlib and allow for working with TThread in DOS.
> 
> I've actually thought about implementing some sort of multithreading for 
> DOS for a long time. The problems are the following:
> 
> 1) DOS functions are not reetrant and are thus not safe to call from 
> different threads. There's an undocumented InDOS flag that indicates 
> whether a DOS function is safe to call:
> 
> http://stanislavs.org/helppc/int_21-34.html
> 
> But the RTL currently doesn't check it before every call and normally 
> it's only used when writing TSRs.

It's more complex than that: there's undocumented provision in DOS for 
context switching under certain well-defined conditions, and each 
context can invoke int 21h irrespective of other contexts' states. That 
sort of thing was used fairly extensively by- for example- IBM real-time 
control executives (RIC card etc.) but it wasn't until the 1990s that it 
leaked to general knowledge see Ralph Brown's list).

> 2) In DPMI protected mode applications (such as go32v2), you cannot 
> modify the return address from within an interrupt handler, which means 
> you cannot implement your task scheduler as a timer interrupt handler, 
> because you won't be able to switch to a different context from there. 
> Doing this would require modifications to the DPMI host (cwsdpmi.exe) 
> and will not work if another DPMI host is active (such as when running 
> in a windows dos prompt, etc.)
> 
> 3) Even if you solve 2), DPMI requires that all code and data touched 
> from an interrupt handler to be locked, so that it cannot be swapped 
> out. This is a tedious and error prone task to do from a high level 
> language such as pascal. You should ensure that your entire scheduler's 
> code and data are locked. An alternative option is to switch to a DPMI 
> host, that doesn't support swapping (i.e. cwsdpr0.exe), but then you 
> lose the virtual memory support (and thus the ability to run on machines 
> that don't have enough memory).
> 
> 2) and 3) do not apply to 16-bit MS-DOS.
> 
> Another option is to implement cooperative multitasking, which would 
> require each thread to call periodically an yield function. This solves 
> 1), 2) and 3), but threaded code written for other OSes will require 
> modifications to run under DOS. However, that's still better than not 
> running at all.

The DPMI issue sounds... interesting, but if I recall correctly what you 
do is provide a per-thread entry point analogous to a unix signal. A 
preemption interrupt transfers control to this, and then a coroutine 
mechanism- outside the ISR- transfers control to the most deserving thread.

Sorry if that's a bit vague, it's been many years since I played with 
this. Implementation left as an exercise :-)

Whether it's really worth tackling, and whether any implementation can 
be really reliable, are questions to be considered.

-- 
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]




More information about the Lazarus mailing list