ByteBuffer.asReadOnlyBuffer() and direct byte buffers

Erik Larsson <[email protected]>
Newsgroups gmane.comp.gcc.java.devel
Message-ID <[email protected]>
Hi group,

In the process of trying to run my JNI-enabled library in gcj/gij I 
discovered what seems to be a bug in libgcj's direct ByteBuffer 
implementation.

When calling ByteBuffer.asReadOnlyBuffer() for a direct byte buffer, gij 
throws at me:
------
Exception in thread "main" java.nio.InvalidMarkException
    at java.nio.Buffer.reset(libgcj.so.10)
    at java.nio.DirectByteBufferImpl.duplicate(libgcj.so.10)
    at java.nio.DirectByteBufferImpl.asReadOnlyBuffer(libgcj.so.10)
    at Test.main(Test.java:18)
------

Test code is attached. The InvalidMarkException goes away if you call 
ByteBuffer.mark() before calling .asReadOnlyBuffer(), but 
.asReadOnlyBuffer() shouldn't require a defined mark (it doesn't for 
regular buffers).

gij version:
------
gij (GNU libgcj) version 4.4.1

Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
------

OS: Ubuntu 9.10 (prerelease), i386

I did a little research, and it seems this bug was reported against 
Classpath in 2005, along with a fix:
      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22934

The GNU Classpath code contains what seems to be a fix in the current 
revision of DirectByteBufferImpl (duplicate() method):
     
http://cvs.savannah.gnu.org/viewvc/classpath/java/nio/DirectByteBufferImpl.java?revision=1.24&root=classpath&view=markup

...but gcc's libjava doesn't have that particular line ('if (this.mark 
!= -1)'):
     
http://gcc.gnu.org/viewcvs/trunk/libjava/java/nio/DirectByteBufferImpl.java?revision=141271&view=markup

Regards,

- Erik
Test.java (text/plain, 379 B)
import java.nio.ByteBuffer;

public class Test {
    public static void main(String[] args) {
	ByteBuffer bb = ByteBuffer.allocateDirect(1024);
	System.err.println("Created readwrite direct buffer: " + bb);
	//bb.mark(); // Uncomment this line to prevent exception.
	ByteBuffer bbro = bb.asReadOnlyBuffer();
	System.err.println("Created readonly direct buffer: " + bbro);
    }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.