[PATCH] Fix declaration of pthread-structs in s-osinte-rtems.ads

Jan Sommer soja-lists at aries.uberspace.de
Tue Nov 3 11:36:48 UTC 2015


Am Monday 02 November 2015, 12:39:57 schrieb Sebastian Huber:
> 
> On 31/10/15 16:47, Jan Sommer wrote:
> > Hi,
> >
> > This patch changes the Ada-declaration of the pthread-related structs such as pthread_attr_t from a field-equivalent declaration to just reserving the right amount of memory.
> > It is only rtems related and essentially copies the way how the types are defined in s-osinte-linux.ads. It makes the declarations independent of a particular newlib-version and fixes the bug I filed here:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68169
> 
> [...]
> 
> >      -------------
> >      -- Signals --
> > @@ -448,6 +450,7 @@ package System.OS_Interface is
> >         ss_low_priority     : int;
> >         ss_replenish_period : timespec;
> >         ss_initial_budget   : timespec;
> > +      sched_ss_max_repl   : int;
> >      end record;
> >      pragma Convention (C, struct_sched_param);
> 
> Why is this structure not changed to an opaque size + alignment type 
> like the other structures?
> 

There is no corresponding size constant in s-oscons.ads. The linux version of s-osinte.ads uses a record declaration too.

> >   
> > @@ -621,43 +624,34 @@ private
> >      end record;
> >      pragma Convention (C, timespec);
> >   
> > -   CLOCK_REALTIME :  constant clockid_t := 1;
> > -   CLOCK_MONOTONIC : constant clockid_t := 4;
> > +   CLOCK_REALTIME :  constant clockid_t := System.OS_Constants.CLOCK_REALTIME;
> > +   CLOCK_MONOTONIC : constant clockid_t := System.OS_Constants.CLOCK_MONOTONIC;
> > +
> > +   subtype char_array is Interfaces.C.char_array;
> >   
> >      type pthread_attr_t is record
> > -      is_initialized  : int;
> > -      stackaddr       : System.Address;
> > -      stacksize       : int;
> > -      contentionscope : int;
> > -      inheritsched    : int;
> > -      schedpolicy     : int;
> > -      schedparam      : struct_sched_param;
> > -      cputime_clocked_allowed : int;
> > -      detatchstate    : int;
> > +      Data : char_array (1 .. OS_Constants.PTHREAD_ATTR_SIZE);
> >      end record;
> >      pragma Convention (C, pthread_attr_t);
> > +   for pthread_attr_t'Alignment use Interfaces.C.unsigned_long'Alignment;
> >   
> >      type pthread_condattr_t is record
> > -      flags           : int;
> > -      process_shared  : int;
> > +      Data : char_array (1 .. OS_Constants.PTHREAD_CONDATTR_SIZE);
> >      end record;
> >      pragma Convention (C, pthread_condattr_t);
> > +   for pthread_condattr_t'Alignment use Interfaces.C.int'Alignment;
> >   
> >      type pthread_mutexattr_t is record
> > -      is_initialized  : int;
> > -      process_shared  : int;
> > -      prio_ceiling    : int;
> > -      protocol        : int;
> > -      mutex_type      : int;
> > -      recursive       : int;
> > -   end record;
> > +      Data : char_array (1 .. OS_Constants.PTHREAD_MUTEXATTR_SIZE);
> > +   end  record;
> >      pragma Convention (C, pthread_mutexattr_t);
> > +   for pthread_mutexattr_t'Alignment use Interfaces.C.int'Alignment;
> [...]
> 
> The alignment is sometimes int and sometimes unsigned long. I would 
> change this to long long or double throughout, e.g. if we change the CPU 
> mask type to uint64_t, then the alignment specified here is no longer 
> correct.
> 

Thanks for the tip. I will change that.

Best regards,

   Jan



More information about the devel mailing list