Article View: comp.arch
Article #11008Re: <None> (Should be Open Systems, bloody NEWS system...)
From: Peter Mayne
Date: Tue, 29 Dec 1992 01:22
Date: Tue, 29 Dec 1992 01:22
108 lines
4606 bytes
4606 bytes
In article <id.SQ3W.IB6@ferranti.com>, peter@ferranti.com (peter da silva) writes:
>> Now, much of the run-time stuff in UNIX is non-reentrant.
>
>Much of the *C* run-time in *any* language is non-reentrant, and I would
>be surprised if the VMS library was any better. If I get an AST while I'm
>in the runtime (say, in the Fortran library in the middle of a formatted
>I/O statement) I would expect dire consequences from calling the language
>runtime. I have never written an asyncronous signal handler under any
>operating system (out of UNIX, RMX, AmigaOS, and RSX-11) where I didn't
>have to watch for that sort of thing. In RSX all you can do from an AST,
>pretty much, is access memory.
>
>> In particular, the
>> use of errno springs to mind. If the AST (or APC) was introduced into the
>> UNIX model,
>
>It's in there.
>
>> how can I use these non-reentrant routines safely in an AST
>> routine without screwing things up?
>
>You can't. Can you really do
>
> WRITE (*,10) AA
> 10 FORMAT (1X,80A1)
>
>in an AST under VMS?
>
The following is from the tempnam thread in comp.unix.ultrix. (Is open(2)
considered part of the C run-time library, or the UNIX kernel?) Note that
in the example given below, it doesn't even matter if open(2) is reentrant
or not: you still have problems looking up the error. (See the sentence
marked **.)
>> Begin quote >>
aaa@pixar.com (Tony Apodaca) writes:
> The point is that a smart programmer
>checks errno after every system call.
The *wise* programmer checks the approriate return value of the
system call, and if it returns a value indicating an error, then the errno
value is used.
Consider the following:
int fd;
fd = open("foo",O_RDWR|O_CREAT,0600);
if(errno != 0)
perror("foo");
Versus:
int fd;
if((fd = open("foo",O_RDWR|O_CREAT,0600)) < 0)
perror("foo");
Now, the manual page on open(2) states explicitly:
RETURN VALUE
The value -1 is returned if an error occurs, and external
variable errno is set to indicate the cause of the error.
There's a good reason for writing your code this way. You are
using the return value from the function, rather than a global value
which can get stepped on by something unusual you don't know about.
This means that your code doesn't have to care about what is a system
call versus what is a library routine. Do you care? I don't. I just
want to know if it didn't work right. Then I want to know why.
** I believe that you can also run into problems if you have
** a signal handler that gets invoked, and resets errno in the period
** between your successful system call and your test for success. It's
easier to just treat the system calls like a function call, and
look at its return value. If you somehow think that using errno
rather than having to declare a local to capture the return value is
an optimization, you're mistaken.
mjr.
>> End Quote >>
Fixing this kind of problem would involve changing the model of "returning
an error flag and a static errno". You could:
- return an error status rather than an error flag
- signal on errors
- call a "callback" routine on errors
- fill in a program-provided "status block" (non-static "errno" equivalent)
Any one of these would probably be considered incompatible by a large number
of UNIX style programmers (including DOS programmers and a lot of VMS
programmers).
>--
>Peter da Silva `-_-'
>Ferranti International Controls Corporation 'U`
>Sugar Land, TX 77487-5012 USA
>+1 713 274 5180 "Zure otsoa besarkatu al duzu gaur?"
PJDM
--
Peter Mayne | My statements, not Digital's.
Digital Equipment Corporation |
Canberra, ACT, Australia | "AXP!": Bill the Cat
Technical Details
Message-ID:
<1992Dec29.012215.10632@ryn.mro4.dec.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!cs.utexas.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!ames!olivea!decwrl!deccrl!news.crl.dec.com!rdg.dec.com!uvo.dec.com!e2big.mko.dec.com!nntpd.lkg.dec.com!ryn.mro4.dec.com!newsReferences:
<1992Dec23.050719.4047@ryn.mro4.dec.com> <id.CG2W.R8A@ferranti.com> <1992Dec23.212321.26522@ryn.mro4.dec.com> <id.SQ3W.IB6@ferranti.com>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!cs.utexas.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!ames!olivea!decwrl!deccrl!news.crl.dec.com!rdg.dec.com!uvo.dec.com!e2big.mko.dec.com!nntpd.lkg.dec.com!ryn.mro4.dec.com!news From: pjdm@chmeee.enet.dec.com (Peter Mayne) Newsgroups: comp.arch Subject: Re: <None> (Should be Open Systems, bloody NEWS system...) Message-ID: <1992Dec29.012215.10632@ryn.mro4.dec.com> Date: 29 Dec 92 01:22:15 GMT References: <1992Dec23.050719.4047@ryn.mro4.dec.com> <id.CG2W.R8A@ferranti.com> <1992Dec23.212321.26522@ryn.mro4.dec.com> <id.SQ3W.IB6@ferranti.com> Sender: news@ryn.mro4.dec.com (USENET News System) Reply-To: Peter.Mayne@cao.mts.dec.com Organization: Digital Equipment Corporation Lines: 108