Illegal Package-Private Accesses in 3.4

Bryce McKinlay bryce@mckinlay.net.nz
Mon Aug 11 23:26:00 GMT 2003


On Tuesday, Aug 12, 2003, at 00:16 Pacific/Auckland, Andrew Haley wrote:

>>> No, that's not right.  There are some severe problems with using
>>> byte[] instead of RawData.  In particular, the previous equivalent of
>>> this code broke because byte[] and pointer references have differing
>>> alignments.
>>
>> Doh. I presume we've tried to go down the path of giving the data 
>> field
>> of all array types pointer alignment?
>
> I thought of it, and then dismissed the idea fairly quickly.  It's
> wasteful and unnecessary apart from these weird corner cases.

One other case where is might be useful is in java.nio where you can 
have ByteBuffer with a bunch of methods like putInt() that insert a 
native-endian int. If we (eventually) want to implement this 
efficiently , we might need to increase alignment of arrays.

>>>  I suspect that the Right Thing here would be to create an
>>> array of RawData instead of using _Jv_Malloc.
>>
>> Either that or JvAllocBytes, and introducing another RawData type 
>> which
>> doesn't prevent the GC from marking it.
>
> Well, how exactly could you do that?  RawData isn't necessarily a
> pointer to memory that is accessible to the gc.

Perhaps, but the GC doesn't care if it isn't a valid pointer. In all 
cases I know of in libgcj (except java.lang.ref), RawData is used to 
store a pointer to non-Java data that is associated with a Java object. 
The trouble is that in many cases we really want to GC allocate this 
non-Java data, but because of the way RawData works  people have been 
using Malloc instead, which is ugly and opens up the risk of leaks.

>> Maybe RawData should actually be marked, and we could have a
>> separate RawDataUnmarked for the cases where thats useful.
>
> Umm.  Just using an array of RawData is surely the cleanest solution.

In this case it probably is. But there are other places where a 
"GC-able RawData" is needed - eg java.lang.Thread:

   // Our native data - points to an instance of struct natThread.
   private Object data;

Regards

Bryce.



More information about the Java-patches mailing list