I'll see if I can figure out something to do based on Nathan's suggestion.

Looking a little closer today, it looks like maybe there is more of a compiler difference (or -W flag difference) that determines if you see the warning, rather than a kernel version?

For example, on RHEL4 (x86_64) I do not see the warning. However, if I add this to the pvfs2-sysint.h header:

#ifdef __KERNEL__
    #ifndef INTPTR_MIN
    #error unable to find INTPTR_MIN
    #endif
#endif

... then it does not compile. So maybe the #if checks don't always generate a warning if some of the defines are missing? That's kind of disappointing if so, because it means we have the opportunity to silently get the size wrong at build time. I guess the
"#if INTPTR_MIN == INT32_MIN"
is always getting processed as true if those values are undefined.

-Phil

Sam Lang wrote:

Hi Phil,

I'm not able to reproduce that warning with a 2.6.11 kernel. I'm not sure why as the limits.h that gets included doesn't seem to define INTPTR_MIN either. Could you just send me a patch with Nathan's proposed fix or something similar that gets rid of those warnings for you?

Thanks,

-sam

On Apr 4, 2006, at 3:30 PM, Phil Carns wrote:

Actually, it does compile now that I look closer (I had a second problem confusing me), but it does generate quite a few warnings like this:

pvfs2/include/pvfs2-sysint.h:44:5: warning: "INTPTR_MIN" is not  defined
pvfs2/include/pvfs2-sysint.h:44:19: warning: "INT32_MIN" is not  defined

Not sure what the ramifications are of the warning, though.

-Phil

Phil Carns wrote:

Is INTPTR_MIN defined in the kernel headers somewhere as well? I am having a hard time compiling the kerne module at the moment because /kernel/linux-2.6/pvfs2-utils.c ends up pulling in pvfs2- sysint.h. I am using the 2.6.15.4 kernel.
-Phil
Sam Lang wrote:


This seems to work everywhere we tried, so I went ahead and committed that change. Thanks Pete!

-sam

On Apr 4, 2006, at 12:15 PM, Pete Wyckoff wrote:

[EMAIL PROTECTED] wrote on Tue, 04 Apr 2006 11:32 -0500:

Hm...actually I didn't notice before but the use of __WORDSIZE or
BITS_PER_LONG will break on darwin (which doesn't define either).
Previously, I fixed this by defining SIZEOF_LONG_INT and
SIZEOF_VOID_P in pvfs2-config.h, but the PVFS_sys_attr_s struct  now
includes padding and that struct is defined in pvfs2-sysint.h,  which
is an external header.




Posix defines intptr_t as an int that can hold a pointer, hence you
can get your word size out of that.   Then this should work and  uses
only constants that POSIX requires in <stdint.h>:

    #if INTPTR_MIN == INT32_MIN
    32-bit
    #else
    not 32-bit
    #endif

Appears visually to be okay on darwin, x86, and x86_64.  But I've
never tried it in real life.  Too bad there appears to be no direct
wordsize in posix anywhere.


Another approach would be with unions:

    struct PVFS_sys_attr_s {
    ...
    union {
        char _s[8];
        char *link_target;
    };
    ...
    }

But I haven't tried that either.  On ancient gcc you need to give
the union a name then "#define link_target _u.link_target", e.g.

            -- Pete


_______________________________________________
Pvfs2-developers mailing list
Pvfs2-developers@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

_______________________________________________
Pvfs2-developers mailing list
Pvfs2-developers@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers




_______________________________________________
Pvfs2-developers mailing list
Pvfs2-developers@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to