From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,63360011f8addace X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-08-01 15:04:08 PST Newsgroups: comp.lang.ada Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!nntp.abs.net!uunet!dca.uu.net!ash.uu.net!world!news From: Robert A Duff Subject: Re: Erroneous execution? (was Re: gnat: time-slicing) Sender: news@world.std.com (Mr Usenet Himself) Message-ID: Date: Thu, 1 Aug 2002 22:03:14 GMT References: NNTP-Posting-Host: shell01.theworld.com Organization: The World Public Access UNIX, Brookline, MA X-Newsreader: Gnus v5.7/Emacs 20.7 Xref: archiver1.google.com comp.lang.ada:27588 Date: 2002-08-01T22:03:14+00:00 List-Id: "Ben Brosgol" writes: > > > with Ada.Text_IO; use Ada.Text_IO; > > > > > > procedure Task_Demo is > > > task A; > > > task body A is > > > begin > > > Put_Line("b"); > > > Put_Line("b"); > > > end A; > > > begin > > > Put_Line("a"); > > > Put_Line("a"); > > > end Task_Demo; > > > --------------- > > > > The above example is erroneous, which means that the output is totally > > unpredictable. The reason it's erroneous is that two tasks are messing > > with the same shared variable (the standard output file) at the same > > time. > > Bob- > > Are you sure this is erroneous? No... You're trying to language-lawyer me to death, Ben. ;-) I *think* it's erroneous, and I'm sure it was *intended* to be erroneous by the language designers. >...The "shared variable" is hidden in the > private part or body of a predefined library package and ARM paragraph A(3) > says that in such cases it is the responsibility of the implementation to > protect the shared variable from getting trashed (*). Now Put_Line is > equivalent to looping over Put() and then doing a New_Line so the user may > see interspersed output -- e.g., either or both "b"s might not be > immediately followed by a newline -- but the implementation would be > nonconformant with the ARM if, for example, simultaneous calls on Put caused > the machine to reboot (which was the effect one saw in an early version of > the old Alsys DOS Ada compiler :-) But the AARM annotation attached to this paragraph says: 3.a Ramification: For example, simultaneous calls to Text_IO.Put will work properly, so long as they are going to two different files. On the other hand, simultaneous output to the same file constitutes erroneous use of shared variables. which indicates the intent pretty clearly. The program above is doing output to the same file simultaneously. If you want RM exegesis, I'll point you to A.10.6(2), which says the above is equivalent to passing the current output file as a parameter, which is clearly a shared variable. > I'm not recommending that anyone actually write code such as Task_Demo, but > I don't think it's an example of erroneous execution. > > (*) The rule actually says "The implementation shall ensure that each > language defined subprogram is reentrant in the sense that concurrent calls > on the same subprogram perform as specified, so long as all parameters that > could be passed by reference denote nonoverlapping objects." But I believe > the intent is as I indicated. > > -Ben P.S. *You* wrote much of Annex A!