On Fri, Mar 01, 2002 at 12:34:49PM -0500, Jeff Trawick wrote:
> I'll punt for the moment on whether or not that code is bad.  The
> shared memory code definitely needs to be fixed.  Look at this simple
> test of alignment:
> 
> #include <stddef.h>
> #include <stdio.h>
> 
> int main(void)
> {
>     struct s1 {
>         char a;
>         char b;
>     } s1;
>     struct s2 {
>         char a;
>         int b;
>     } s2;
>     struct s3 {
>         char a;
>         long long b;
>     } *s3;
>     struct s4 {
>         char a;
>         double b;
>     } s4;
> 
>     printf("%d %d %d %d\n",
>            offsetof(struct s1,b),
>            offsetof(struct s2,b),
>            offsetof(struct s3,b),
>            offsetof(struct s4,b));
> 
>     s3 = (struct s3 *)((char *)malloc(100) + 4);

Of course it gives us a SIGBUS here, this is guaranteed on a sparc.
I'm not entirely sure what you're trying to illustrate here though.

>     printf("%p\n",s3);
>     s3->a = 'A';
>     s3->b = 10241024;

Shouldn't this be:  s3->b = 10241024LL; ?
(Probably not important.)

>     return 0;
> }
> 
> On my sparc machine it prints
> 1 4 8 8
> for the offsets of the variables of different types.  Note that gcc
> places long long and double on 64-bit boundaries.
> 
> It then dies with SIGBUS when I trick it into trying to store a
> 64-bit quantity into storage which s 32-bit aligned but not 64-bit
> aligned.

As expected.

> Back to the code above that you posted:
> 
> I think that it too needs to take into account alignment.  It would
> need to round the size of each structure up to 64-bit alignmet before
> multiplying to ensure that objects of any type can live in that
> storage.  This currently isn't causing problems because the size of
> each structure is consistent with 64-bit alignment (208 bytes for
> worker_score, 24 bytes for global_score, 16 bytes for process_score),
> at least in a 32-bit build for Sparc.

Yes, I completely agree that each structure needs to be 64-bit aligned.
I don't see how the shared memory code itself is incorrect. It must be
mapping the segment at a properly aligned boundary, so as long as the
contents of that segment are accessed in an aligned manner than we're
safe, right?

-aaron

Reply via email to