public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: Richard Earnshaw <rearnsha@arm.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: libstdc++/3584: arm-specific atomic operations not atomic Date: Wed, 11 Jul 2001 08:46:00 -0000 [thread overview] Message-ID: <20010711154603.7493.qmail@sourceware.cygnus.com> (raw) The following reply was made to PR libstdc++/3584; it has been noted by GNATS. From: Richard Earnshaw <rearnsha@arm.com> To: robin.farine@terminus.org Cc: gcc-gnats@gcc.gnu.org, acnrf@dial.eunet.ch, Richard.Earnshaw@arm.com Subject: Re: libstdc++/3584: arm-specific atomic operations not atomic Date: Wed, 11 Jul 2001 16:38:26 +0100 robin.farine@terminus.org said: > Routines such as atomic_add() that reads a memory location, apply an > operation to the read value, uses the swp instruction to update the > memory location and swp again if the value read the 2nd time does > equal the initial value introduce a race condition. I agree. I can think of two possible solutions; which is best depends on the potential uses of these operations. The first one reserves a value (say INT_MIN, chosen because it is a simple immediate constant on the ARM, and a relatively unlikely value in normal signed-arithmetic operations); if the atomic memory location ever contains this value, then another atomic operation is in progress on the memory location, and the requester must spin until that value is not already stored there. The code for atomic add would then be. @ r0 = address, r1 = increment. mov r2, #INT_MIN 0: swp r3, r2, [r0] cmp r3, #INT_MIN beq 0b @ already locked. @ We now have the lock add r3, r3, r1 cmp r3, #INT_MIN @ Paranoia -- INT_MIN is reserved. addeq r3, #1 str r3, [r0] @ save, and release the lock. Similar sequences could be written for the other operations. The second avoids reserving a value, but requires a larger object for the "lock". It would also require special code to initialize and read any value from an _Atomic_word object. This would break the current include/bits/basic_string.h implementation, which contains _Atomic_word _M_references; bool _M_is_leaked() const { return _M_references < 0; } bool _M_is_shared() const { return _M_references > 0; } ... I guess we could fix this by making _Atomic_word a class which defined these operations. The code for this variant would be: @ r0 = address (struct {int lock, int value}), r1 = increment. mov r2, #INT_MIN 0: swp r3, r2, [r0] cmp r3, #INT_MIN beq 0b @ already locked @ We now have the lock ldr r2, [r0, #4] add r2, r2, r1 str r2, [r0, #4] str r3, [r0] @ Release the lock. mov r2
next reply other threads:[~2001-07-11 8:46 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2001-07-11 8:46 Richard Earnshaw [this message] -- strict thread matches above, loose matches on Subject: below -- 2002-10-03 9:17 rearnsha 2002-05-31 18:09 pme 2001-07-12 7:26 Richard Earnshaw 2001-07-12 7:16 Robin Farine 2001-07-11 11:06 Richard Earnshaw 2001-07-11 10:36 Robin Farine 2001-07-06 2:56 robin.farine
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20010711154603.7493.qmail@sourceware.cygnus.com \ --to=rearnsha@arm.com \ --cc=gcc-prs@gcc.gnu.org \ --cc=nobody@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).