From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/6108 Path: news.gmane.org!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH 1/9] interface additions for the C thread implementation Date: Sat, 6 Sep 2014 20:21:23 -0400 Message-ID: <20140907002123.GX23797@brightrain.aerifal.cx> References: Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1410049304 13868 80.91.229.3 (7 Sep 2014 00:21:44 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 7 Sep 2014 00:21:44 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-6121-gllmg-musl=m.gmane.org@lists.openwall.com Sun Sep 07 02:21:39 2014 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XQQEb-0000k7-TA for gllmg-musl@plane.gmane.org; Sun, 07 Sep 2014 02:21:37 +0200 Original-Received: (qmail 22369 invoked by uid 550); 7 Sep 2014 00:21:36 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 22361 invoked from network); 7 Sep 2014 00:21:36 -0000 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:6108 Archived-At: On Mon, Sep 01, 2014 at 12:45:47AM +0200, Jens Gustedt wrote: > This adds all the constant, type and function interfaces. Including some comments here as I work on committing it. Please don't take them as critical; just explaining choices made during commit and noting where things are different in the version to be committed. > It makes pthread_mutex_t, mtx_t, pthread_cond_t and cnd_t different > types. > > This only works because > > - under hood the corresponding pairs of types use exactly the same > definition for the type > > - the types are a struct types without tag name > > - no comparison or assignment is allowed for any of these types. For > the POSIX types this interdiction is written in the standard. For the > C thread types, this is an extension that this implementation > imposes, but which might be integrated in a later version of the C > standard. > > - initialization is default initialization of an array of int. For the > POSIX types, initialization expressions are provided. For C thread > types the only initialization foreseen by the standard are the init > functions. > > - any calls to standard functions use pointers, and because pointer > representations for struct types are the same. > > For the C++ API/ABI, these also are different types, now, with type names > (that are used for name mangling, e.g) as listed above. > > Somebody better versed in C++ could perhaps contribute code that > overloads the comparison and assignment operators such that a compilation > that tries to compare or copy these types fails. I'm not sure what you meant by this last paragraph. > --- > arch/arm/bits/alltypes.h.in | 10 +++- > arch/i386/bits/alltypes.h.in | 10 +++- > arch/microblaze/bits/alltypes.h.in | 10 +++- > arch/mips/bits/alltypes.h.in | 10 +++- > arch/or1k/bits/alltypes.h.in | 10 +++- > arch/powerpc/bits/alltypes.h.in | 10 +++- > arch/sh/bits/alltypes.h.in | 10 +++- > arch/x32/bits/alltypes.h.in | 10 +++- > arch/x86_64/bits/alltypes.h.in | 10 +++- > include/alltypes.h.in | 10 ++++ > include/threads.h | 110 ++++++++++++++++++++++++++++++++++++ > include/time.h | 11 ++++ > 12 files changed, 212 insertions(+), 9 deletions(-) > create mode 100644 include/threads.h > > diff --git a/arch/arm/bits/alltypes.h.in b/arch/arm/bits/alltypes.h.in > index 183c4c4..1dcb920 100644 > --- a/arch/arm/bits/alltypes.h.in > +++ b/arch/arm/bits/alltypes.h.in > @@ -18,8 +18,16 @@ TYPEDEF struct { long long __ll; long double __ld; } max_align_t; > TYPEDEF long time_t; > TYPEDEF long suseconds_t; > > -TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t; > +/* The pairs of equivalent definitions for pthread and C thread types > + * should always be kept in sync. > + * > + * Also this only works because the underlying struct has no struct > + * tag. Don't introduce one. */ No need for comments like these; introducing a tag would be an ABI change anyway, so it can't be done. > diff --git a/include/alltypes.h.in b/include/alltypes.h.in > index c4ca5d5..94364e8 100644 > --- a/include/alltypes.h.in > +++ b/include/alltypes.h.in > @@ -43,13 +43,23 @@ TYPEDEF unsigned gid_t; > TYPEDEF int key_t; > TYPEDEF unsigned useconds_t; > > +/* The pairs of equivalent definitions for pthread and C thread types > + * should always be kept in sync. */ > #ifdef __cplusplus > TYPEDEF unsigned long pthread_t; > +TYPEDEF unsigned long thrd_t; > #else > TYPEDEF struct __pthread * pthread_t; > +TYPEDEF struct __pthread * thrd_t; > #endif > TYPEDEF int pthread_once_t; > +TYPEDEF int once_flag; > TYPEDEF unsigned pthread_key_t; > +TYPEDEF unsigned tss_t; The threads.h types don't need to be in alltypes.h since they're only exposed by one file. (The pthread types are there because sys/types.h exposes them too, in addition to pthread.h.) > +TYPEDEF pthread_cond_t cnd_t; > +TYPEDEF pthread_mutex_t mtx_t; These two lines were left over and seem to have been nops due to the order of concatenation. > diff --git a/include/threads.h b/include/threads.h > new file mode 100644 > index 0000000..0e99443 > --- /dev/null > +++ b/include/threads.h > @@ -0,0 +1,110 @@ > +#ifndef _THREADS_H > +#define _THREADS_H > + > +/* This one is explicitly allowed to be included. */ > +#include I'm also adding features.h here because musl needs it internally for any header that wants to use restrict (we use __restrict because gcc disables restrict by default in its ugly gnu89 mode) and _Noreturn. > +#ifdef __cplusplus > +extern "C" { > +#endif This appeared twice with only one closing "}". I'm merging all the C++ logic into one conditional. > + > +/* These may or may not be implemented to be the same as some POSIX > + * types. Don't rely on any assumption about that, in particular if > + * you happen to use both interfaces in the same code. */ > + This text (or similar) should eventually make it into the documentation, but headers don't carry documentation like this in musl. > +int cnd_timedwait(cnd_t *restrict, mtx_t *restrict, const struct timespec *restrict); > +int cnd_wait(cnd_t *, mtx_t *); The lack of restrict on cnd_wait is really odd, but I checked and it's like that in the standard too... File this as another bug for C11... :-) Rich