comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Pragma Atomic
Date: Tue, 09 Jan 2001 22:44:28 GMT
Date: 2001-01-09T22:44:28+00:00	[thread overview]
Message-ID: <93g48c$ehk$1@nnrp1.deja.com> (raw)

I'm having trouble understanding what pragma Atomic is for.

The RM says that "all reads and updates of the object as a whole are
indivisible."  (C.6(15)) The RM never defines what "indivisible"
means, however.  On first glance, my understanding would be that if
you have an indivisible record type:

    type Rectype is record
        Field1 : integer;
        Field2 : integer;
    end record;
    pragma Atomic (Rectype);

then when you read (or write) an object of that type, nothing can come
between the read of Field1 and the read of Field2.  Thus, the process
can't be interrupted in between reads of the two fields, and no other
processor on a multi-processor system can access the object in between
and (say) modify Field2 after the first processor reads Field1.  At
least, that's my interpretation of the word.  It wouldn't make sense
to declare a scalar object, whose size is a natural size on the
processor, to be Atomic, since the processor's reads and writes of
such an object would automatically be indivisible anyway.

However, the examples in the Rationale, Section C.5, don't make sense
to me.  One is

    Buffer: array (1..Max) of Integer;
    pragma Atomic_Components(Buffer);

in which "Atomic" is applied to each Integer component; and then we
have

    type IO_Rec_Type is
      record
        ...
        Reset: Boolean;
        pragma Atomic(Reset);
      end record;

The Rationale explains this as follows:

"By declaring ... Reset to be atomic, the user ensures that reads and
writes of these fields are not removed by optimization, and are
performed indivisibly."  The part about reading and writing not being
optimized away follows because pragma Atomic implies pragma Volatile,
right?  As for reads and writes being performed indivisibly, Reset is
one bit, so how could a read or write of it be "divisible"?

To confuse me even further, AARM95
(http://www.ada-auth.org/~acats/arm-html/AA-C-6.html) says "Pragma
Atomic replaces Ada 83's pragma Shared. The name 'Shared' was
confusing, because the pragma was not used to mark variables as
shared."  I'm not sure how the previous Shared pragma had anything to
do with indivisiblity or atomicity, however, so I don't see how Atomic
replaces it.  Seemingly contradicting this is the Rationale, which
says "the pragma Shared was removed from the language and replaced by
the pragmas Atomic and Volatile."

Could someone PLEASE help clear things up for me?  Perhaps the term
"indivisible" has some other definition that everyone in the world
except me knows about?  Any explanation from someone in the know would
be very much appreciated.

                                -- thanks, Adam



Sent via Deja.com
http://www.deja.com/



             reply	other threads:[~2001-01-09 22:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-01-09 22:44 Adam Beneschan [this message]
2001-01-09 23:16 ` Pragma Atomic mark.biggar
2001-01-10  4:27 ` Robert Dewar
2001-01-10 17:53 ` Nick Roberts
2001-01-11 14:00   ` Tucker Taft
2001-01-11 15:06     ` Nick Roberts
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox