Re: Code changes for glib to enhance 64-bit operation
- From: Owen Taylor <otaylor redhat com>
- To: gtk-devel-list gnome org
- Cc: Mark Murnane <Mark Murnane Sun COM>
- Subject: Re: Code changes for glib to enhance 64-bit operation
- Date: 14 May 2001 16:04:12 -0400
Mark Murnane <Mark Murnane Sun COM> writes:
> The alignment issue was actually with gobject, not gmodule. That was a
> mistake on my part. This was the reason for the ForAlignment element
> of _GTypeFundamentalInfo in gobject/gtype.h. We needed this as the
> structure was not aligned on an 8 byte boundary otherwise and caused a
> core dump on UltraSPARC.
Do Tim's recent changes fix this problem for you?
> The matter of GPOINTER_TO[U]INT and friends is quite important. Despite
> the intention of these macros, they can be used to stuff a pointer into
> an int.
No they can't. If you find instances of this, they simply need to be
fixed, and not by using longs instead. I would be shocked if anything
of this sort turned up in GTK+...
> Perhaps we could compromise on a GPOINTER_TO_SIZE macro
> instead? Owen suggested this and it might keep everyone happy.
A GPOINTER_TO_SIZE macro may be a good idea, but not because anybody
is using GPOINTER_TO_INT to stuff macros into integers...
> As for the hash functions, while your right that we don't currently use
> all of the capacity that a 2^32 value gives, most of these changes are
> about making sure that doesn't become a problem.
>
> The loss of resolution in a 64-bit pointer potentially could be an
> issue, even if its unlikely. The memory mapping for an executable,
> created at compile time, could lead to an application accessing the
> address where the bottom 32-bits are identical.
Unless it is _likely_ that this will happen, this is fine. A few collisions
are expected for a hash table. I suppose if an operating system did
something like returned the results of each malloc() aligned on 4 gig
boundaries or something, we'd have problems. But this doesn't strike
me as a likely scenario.
> The GCompareFunc change can also be omitted. I have to say I did think
> about this one before I made the change. My reasoning was that the API
> documentation was not explicit about the return values. Again, how
> things 'should' be used and the way they are used, don't always match.
> If the API explicitly says that the only return values are {-1, 0, 1}
> then there is no reason for the change.
I think people have to be aware of the pitfalls here or they'll mess
up in other ways. Is
int mycompare (gconstpointer a, gconstpointer)
{
return *(int *)a - *(int *)b;
}
A valid compare function on a 32 bit machine?
Not if and b are actually signed integers... I'm not sure that
restricting to -1, 0, 1 is necessary, but some notes in the
documentation might help.
Regards,
Owen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]