Mail Archives: djgpp-workers/1997/09/10/05:54:00
Eli Zaretskii wrote:
> This is incorrect. The child program is a different process, it has
> its own DPMI-related structures; in particular, the selectors are
> different. It even has its own PSP, so even DOS knows they are two
> different programs.
OK. Got it.
> Yes, but remember that while the child runs, the parent is parked
> inside a single DOS call--the call to Exec function that runs the
> child. So, from the parent's point of view, only a single function
> call was done, and the data in the tb is supposed to be the same.
Uhm... I wouldn't assume that a call to write() doesen't change tb.
IMVHO it's not a good programming practice to assume that.
> It is the same as a single call to `_write': when `_write' returns,
> you'd expect to find the same data in the tb as what you put there.
Why ? Why should I SUSPECT that a tb in DOS memory is used ?
I pass to write() a buffer that can be everywhere in memory. Then
write() itself handles tb. I hope the user have NEVER to worry about
even the EXISTENCE of a tb in DOS memory. The passed buffer shouldn't be
altered without notice. tb is something 'for internal use only'. :-)
> Because nobody said it does. Suppose you put something in a buffer.
> Would you expect the contents of the buffer to change under your feet,
> unless the docs says so? tb is just another buffer. It is documented
> to be overwritten by every system call, but not *inside* system calls.
That's true for the buffer pointed to by the pointer I pass to write().
Just an example. Suppose you have to write an 800K buffer to a file. You
can do it with a single call to write(), right ? Well, if I'm not
missing something, write() calls multiple times DOS services, filling
multiple times the tb with different data. So the tb is altered more
than once with a single call...
> Of course, you could save and restore the contents of tb, but that's
> not how it works now.
It could be changed, if needed, right ? :-) That should need no more
than 20 lines of code, or 2 function calls (saveTB and restoreTB).
- Raw text -