Upstreaming the glibc Hurd port

Message ID 20180417230835.pa5a3lvoudjyt4gy@var.youpi.perso.aquilenet.fr
State Rejected, archived
Headers

Commit Message

Samuel Thibault April 17, 2018, 11:08 p.m. UTC
  Joseph Myers, le mar. 17 avril 2018 23:02:45 +0000, a ecrit:
> On Wed, 18 Apr 2018, Samuel Thibault wrote:
> 
> > The patch below would just introduce bits/types/struct___sched_param.h.
> > and bits/types/struct_sched_param.h for all ports since it's the same.
> 
> A bits/types/struct_sched_param.h that does "#define sched_param 
> __sched_param" is not appropriate for Linux, because it would change the 
> C++ mangling of struct sched_param.

Oh.

So that could be as per below?

(the idea is to keep __sched_param close to sched_param so any future
extension would be done alongside).

Samuel
  

Comments

Joseph Myers April 18, 2018, 11:13 a.m. UTC | #1
On Wed, 18 Apr 2018, Samuel Thibault wrote:

> Joseph Myers, le mar. 17 avril 2018 23:02:45 +0000, a ecrit:
> > On Wed, 18 Apr 2018, Samuel Thibault wrote:
> > 
> > > The patch below would just introduce bits/types/struct___sched_param.h.
> > > and bits/types/struct_sched_param.h for all ports since it's the same.
> > 
> > A bits/types/struct_sched_param.h that does "#define sched_param 
> > __sched_param" is not appropriate for Linux, because it would change the 
> > C++ mangling of struct sched_param.
> 
> Oh.
> 
> So that could be as per below?

That seems plausible (this is not a review of this patch).
  
Zack Weinberg April 18, 2018, 1:54 p.m. UTC | #2
On Wed, Apr 18, 2018 at 7:13 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Wed, 18 Apr 2018, Samuel Thibault wrote:
>
>> Joseph Myers, le mar. 17 avril 2018 23:02:45 +0000, a ecrit:
>> > On Wed, 18 Apr 2018, Samuel Thibault wrote:
>> >
>> > > The patch below would just introduce bits/types/struct___sched_param.h.
>> > > and bits/types/struct_sched_param.h for all ports since it's the same.
>> >
>> > A bits/types/struct_sched_param.h that does "#define sched_param
>> > __sched_param" is not appropriate for Linux, because it would change the
>> > C++ mangling of struct sched_param.
>>
>> Oh.
>>
>> So that could be as per below?
>
> That seems plausible (this is not a review of this patch).

I have a concern: the types 'struct sched_param' and 'struct
__sched_param' are not compatible, even if their members are identical
(6.2.7p1 explicitly requires the tags to be the same for
compatibility).So if you have a 'struct __sched_param' embedded in
your pthread_attr_t, all of the code that copies between that field
and parameters or variables named 'struct sched_param' must do so
field-by-field or with 'memcpy'.  The compiler won't let you do a
straight-up structure assignment, but trying to get around that with
pointer tricks will produce undefined behavior.

zw
  
Samuel Thibault April 18, 2018, 2:03 p.m. UTC | #3
Zack Weinberg, le mer. 18 avril 2018 09:54:53 -0400, a ecrit:
> On Wed, Apr 18, 2018 at 7:13 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> > On Wed, 18 Apr 2018, Samuel Thibault wrote:
> >
> >> Joseph Myers, le mar. 17 avril 2018 23:02:45 +0000, a ecrit:
> >> > On Wed, 18 Apr 2018, Samuel Thibault wrote:
> >> >
> >> > > The patch below would just introduce bits/types/struct___sched_param.h.
> >> > > and bits/types/struct_sched_param.h for all ports since it's the same.
> >> >
> >> > A bits/types/struct_sched_param.h that does "#define sched_param
> >> > __sched_param" is not appropriate for Linux, because it would change the
> >> > C++ mangling of struct sched_param.
> >>
> >> Oh.
> >>
> >> So that could be as per below?
> >
> > That seems plausible (this is not a review of this patch).
> 
> I have a concern: the types 'struct sched_param' and 'struct
> __sched_param' are not compatible, even if their members are identical
> (6.2.7p1 explicitly requires the tags to be the same for
> compatibility).

Ah, probably that's why bits/sched.h used to define both sched_param and
__sched_param with the __sched_priority field, and #define
sched_priority to __sched_priority.  I can do that, it's fine.

Samuel
  
Zack Weinberg April 18, 2018, 6:40 p.m. UTC | #4
On Wed, Apr 18, 2018 at 10:03 AM, Samuel Thibault
<samuel.thibault@gnu.org> wrote:
>>
>> I have a concern: the types 'struct sched_param' and 'struct
>> __sched_param' are not compatible, even if their members are identical
>> (6.2.7p1 explicitly requires the tags to be the same for
>> compatibility).
>
> Ah, probably that's why bits/sched.h used to define both sched_param and
> __sched_param with the __sched_priority field, and #define
> sched_priority to __sched_priority.  I can do that, it's fine.

This is actually worse than having struct sched_param defined by
sys/types.h, because sched.h is now defining *macro* names that it's
not supposed to.  It's far more likely that a program will try to
define a variable named 'sched_priority' than that it will try to
define its own 'struct sched_param'.

Can I ask whether you want to keep exposing the internals of pthread_*
types to applications?  If there's a plan to stop doing that - even a
"yeah but it's hard and we have so many other things to do first"
intention - then I would recommend leaving sched_param alone for now
and just XFAILing the conformance test.  On the other hand, if you
actively want to keep them exposed and encourage applications to use
them, then there does need to be some kind of workaround.

zw
  
Samuel Thibault April 18, 2018, 6:53 p.m. UTC | #5
Zack Weinberg, le mer. 18 avril 2018 14:40:29 -0400, a ecrit:
> On Wed, Apr 18, 2018 at 10:03 AM, Samuel Thibault
> <samuel.thibault@gnu.org> wrote:
> >>
> >> I have a concern: the types 'struct sched_param' and 'struct
> >> __sched_param' are not compatible, even if their members are identical
> >> (6.2.7p1 explicitly requires the tags to be the same for
> >> compatibility).
> >
> > Ah, probably that's why bits/sched.h used to define both sched_param and
> > __sched_param with the __sched_priority field, and #define
> > sched_priority to __sched_priority.  I can do that, it's fine.
> 
> This is actually worse than having struct sched_param defined by
> sys/types.h, because sched.h is now defining *macro* names that it's
> not supposed to.  It's far more likely that a program will try to
> define a variable named 'sched_priority' than that it will try to
> define its own 'struct sched_param'.

Sure. glibc just has been #defining sched_priority for a very long time
already :)

> Can I ask whether you want to keep exposing the internals of pthread_*
> types to applications?  If there's a plan to stop doing that - even a
> "yeah but it's hard and we have so many other things to do first"
> intention - then I would recommend leaving sched_param alone for now
> and just XFAILing the conformance test.

That's it indeed.

Samuel
  

Patch

diff --git a/bits/sched.h b/bits/sched.h
index 8d9f077eee..bdd94c969d 100644
--- a/bits/sched.h
+++ b/bits/sched.h
@@ -29,10 +29,6 @@ 
 #define SCHED_FIFO	1
 #define SCHED_RR	2
 
-/* Data structure to describe a process' schedulability.  */
-struct sched_param
-{
-  int sched_priority;
-};
+#include <bits/types/struct_sched_param.h>
 
 #endif /* bits/sched.h */
diff --git a/bits/types/struct___sched_param.h b/bits/types/struct___sched_param.h
new file mode 100644
index 0000000000..a6d95bfd61
--- /dev/null
+++ b/bits/types/struct___sched_param.h
@@ -0,0 +1,28 @@ 
+/* Sched parameter structure.  Generic version.
+   Copyright (C) 1996-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library;  if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_TYPES_STRUCT___SCHED_PARAM
+#define _BITS_TYPES_STRUCT___SCHED_PARAM	1
+
+/* Data structure to describe a process' schedulability.  */
+struct __sched_param
+{
+  int __sched_priority;
+};
+
+#endif /* bits/types/struct___sched_param.h */
diff --git a/bits/types/struct_sched_param.h b/bits/types/struct_sched_param.h
new file mode 100644
index 0000000000..60707023d5
--- /dev/null
+++ b/bits/types/struct_sched_param.h
@@ -0,0 +1,28 @@ 
+/* Sched parameter structure.  Generic version.
+   Copyright (C) 1996-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library;  if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_TYPES_STRUCT_SCHED_PARAM
+#define _BITS_TYPES_STRUCT_SCHED_PARAM	1
+
+/* Data structure to describe a process' schedulability.  */
+struct sched_param
+{
+  int sched_priority;
+};
+
+#endif /* bits/types/struct_sched_param.h */
diff --git a/posix/Makefile b/posix/Makefile
index 51dcf129ec..2a1cb2dd47 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -31,7 +31,8 @@  headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
 	   bits/local_lim.h tar.h bits/utsname.h bits/confname.h	      \
 	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
 	   bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h   \
-	   cpio.h spawn.h bits/unistd.h
+	   cpio.h spawn.h bits/unistd.h					      \
+	   bits/types/struct___sched_param.h bits/types/struct_sched_param.h
 
 routines :=								      \
 	uname								      \
diff --git a/sysdeps/htl/bits/types/struct___pthread_attr.h b/sysdeps/htl/bits/types/struct___pthread_attr.h
index 2299c0179f..5c4b4e6c30 100644
--- a/sysdeps/htl/bits/types/struct___pthread_attr.h
+++ b/sysdeps/htl/bits/types/struct___pthread_attr.h
@@ -19,7 +19,7 @@ 
 #ifndef _BITS_TYPES_STRUCT___PTHREAD_ATTR
 #define _BITS_TYPES_STRUCT___PTHREAD_ATTR	1
 
-#include <sched.h>
+#include <bits/types/struct___sched_param.h>
 
 #define __need_size_t
 #include <stddef.h>
@@ -32,7 +32,7 @@  enum __pthread_contentionscope;
    that not all of them are supported on all systems.  */
 struct __pthread_attr
 {
-  struct sched_param __schedparam;
+  struct __sched_param __schedparam;
   void *__stackaddr;
   size_t __stacksize;
   size_t __guardsize;
diff --git a/sysdeps/htl/pt-attr.c b/sysdeps/htl/pt-attr.c
index 77ecc73465..fc39aa63d6 100644
--- a/sysdeps/htl/pt-attr.c
+++ b/sysdeps/htl/pt-attr.c
@@ -24,7 +24,7 @@ 
 #include <pt-internal.h>
 
 const struct __pthread_attr __pthread_default_attr = {
-  __schedparam: { sched_priority: 0 },
+  __schedparam: { __sched_priority: 0 },
   __stacksize: 0,
   __stackaddr: NULL,
 #ifdef PAGESIZE
diff --git a/sysdeps/htl/timer_routines.h b/sysdeps/htl/timer_routines.h
index a8134f510f..062128cf92 100644
--- a/sysdeps/htl/timer_routines.h
+++ b/sysdeps/htl/timer_routines.h
@@ -32,8 +32,8 @@  thread_attr_compare (const pthread_attr_t * left, const pthread_attr_t * right)
   struct __pthread_attr *ileft = (struct __pthread_attr *) left;
   struct __pthread_attr *iright = (struct __pthread_attr *) right;
 
-  return ileft->__schedparam.sched_priority
-	   == iright->__schedparam.sched_priority
+  return ileft->__schedparam.__sched_priority
+	   == iright->__schedparam.__sched_priority
 	 && ileft->__stackaddr == iright->__stackaddr
 	 && ileft->__stacksize == iright->__stacksize
 	 && ileft->__guardsize == iright->__guardsize
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index 24159c57b3..34f27a7d9b 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -71,11 +71,7 @@ 
 # define CLONE_IO	0x80000000	/* Clone I/O context.  */
 #endif
 
-/* Data structure to describe a process' schedulability.  */
-struct sched_param
-{
-  int sched_priority;
-};
+#include <bits/types/struct_sched_param.h>
 
 __BEGIN_DECLS