mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Jens Gustedt <jens.gustedt@inria.fr>
To: musl@lists.openwall.com
Subject: Re: [PATCH] Add stdatomic.h for clang>=3.1 and gcc>=4.1
Date: Sun, 23 Nov 2014 09:49:03 +0100	[thread overview]
Message-ID: <1416732543.16006.381.camel@eris.loria.fr> (raw)
In-Reply-To: <20141123014354.GF29621@brightrain.aerifal.cx>

[-- Attachment #1: Type: text/plain, Size: 3565 bytes --]

Hello,

Am Samstag, den 22.11.2014, 20:43 -0500 schrieb Rich Felker:
> On Sun, Nov 23, 2014 at 02:31:35AM +0100, Jens Gustedt wrote:
> > Actually, I think a specially cooked synchronization tool would be
> > better. Something that combines an atomic pointer (to point to the
> > object) with a futex living on it for the waiting. This would probably
> > be a bit more challenging to implement, but here we really have an
> > interest to have the fast path really fast, just one CAS of the
> > pointer.
> 
> I don't get what you mean. To access an atomic object larger than the
> hardware supports, you have to hold a lock for the whole interval of
> reading/writing.

No, why do you think that? If you implement access to a critical
resource through a mutex, you only need one mutex and not several
ones. The association to the whole range of the resource is only
logical.

Basically there are two possibilities to implement lockful atomics on
types that don't support atomics directly. One is to construct a
struct around it that also contains the lock/mutex. It has the
disadvantage that e.g sizeof for the _Atomic type and the underlying
type are different. The second one is to realize the locks in a sort
of hash table as I tried to describe.

gcc chose the table approach, so we are stuck with it.

In the case we have here, we can always assume that the type of the
object that we are protecting is fixed and in particular its size is
fixed. So all threads will see the object with the same size and will
only ask for a lock with the start adress of the object. (Otherwise we
have UB.)

This is why C requires that atomicity is integrated in the type, so
you can't ask for atomic operations of arbitrary objects.

Thinking of it, there might be an unintended loophole in the
standard, due to a difference in _Atomic as a qualifier and as
specifier. The qualifier version seems to permit to be applied to a
struct that itself contains other _Atomic types. This then would not
work with the table approach. I'll investigate.

> This is O(n) in the size of the object.

This would be prohibitive, indeed. Luckily we don't need that, so only
the copy operation is O(n), and not the lock.

> I don't see
> where your ideas about pointers and CAS are coming in.



> > > > What has all of this to do with VLA? I am lost.
> > > 
> > > The operands of __typeof__ and sizeof get evaluated when they have VLA
> > > type. I think this is the problem.
> > 
> > ah, ok
> > 
> > No, this isn't a problem, I think. Arrays aren't allowed to be subject
> > of an _Atomic qualification (arrays are never qualified
> > themselves). For _Atomic type, the standard explicitly excludes
> > arrays. So arrays in general and VLA in particular should never be
> > passed as such into any of these generic functions, only pointers to
> > atomic objects can.
> 
> Is a pointer to a variably modified type considered variably modified?

yes

> If so maybe these are affected too...

no, the pointers that can be passed to the atomic "functions" are
always pointers to atomic objects, so they can't be arrays (and so
VLA) themselves, nor can an atomic struct containt a VLA or a pointer
to VLA.

Jens

-- 
:: INRIA Nancy Grand Est ::: AlGorille ::: ICube/ICPS :::
:: ::::::::::::::: office Strasbourg : +33 368854536   ::
:: :::::::::::::::::::::: gsm France : +33 651400183   ::
:: ::::::::::::::: gsm international : +49 15737185122 ::
:: http://icube-icps.unistra.fr/index.php/Jens_Gustedt ::



[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

  parent reply	other threads:[~2014-11-23  8:49 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-09 12:53 Joakim Sindholt
2014-11-09 17:11 ` Jens Gustedt
2014-11-22 20:52   ` Joakim Sindholt
2014-11-22 23:09     ` Jens Gustedt
2014-11-22 23:30       ` Rich Felker
2014-11-23  1:31         ` Jens Gustedt
2014-11-23  1:43           ` Rich Felker
2014-11-23  1:47             ` Joakim Sindholt
2014-11-23  2:42               ` Rich Felker
2014-11-23  9:43               ` Jens Gustedt
2014-11-23 15:21                 ` Rich Felker
2014-11-23 16:29                   ` Jens Gustedt
2014-11-23 16:38                     ` Rich Felker
2014-11-23 17:05                       ` Jens Gustedt
2014-11-23 17:29                         ` stephen Turner
2014-11-23 19:38                         ` Rich Felker
2014-11-23  8:49             ` Jens Gustedt [this message]
2014-11-23 15:06               ` Rich Felker
2014-11-23 16:18                 ` Jens Gustedt
2014-11-23 16:37                   ` Rich Felker
2014-11-23 18:01                     ` Jens Gustedt
2014-11-23 19:39                       ` Rich Felker
2014-11-23 23:30                         ` Jens Gustedt

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=1416732543.16006.381.camel@eris.loria.fr \
    --to=jens.gustedt@inria.fr \
    --cc=musl@lists.openwall.com \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

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 NNTP newsgroup(s).