Author: mheath
Date: Tue Mar 20 08:53:28 2007
New Revision: 520447
URL: http://svn.apache.org/viewvc?view=rev&rev=520447
Log:
Fixed support for heap ByteBuffers and writes.
Modified:
mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp
Modified: mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp
URL:
http://svn.apache.org/viewvc/mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp?view=diff&rev=520447&r1=520446&r2=520447
==============================================================================
--- mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp (original)
+++ mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp Tue Mar 20
08:53:28 2007
@@ -359,7 +359,7 @@
jobject doReadWrite(JNIEnv *env, jobject channel, jobject buffer, jlong
position, int flag)
{
- jclass bufferClass = env->GetObjectClass(buffer);
+ jclass bufferClass = env->GetObjectClass(buffer);
// Get buffer limit and position
jint bufferPosition = getByteBufferPosition(env, buffer, bufferClass);
@@ -386,11 +386,21 @@
req->buffers[0].allocatedBufferSize = bufferSizeToAllocate;
if (address == NULL) {
address = getBufferAddress(req, 0);
+
+ // Copy contents of Byte Buffer to address
+ if (byteBufferHasArray(env, buffer, bufferClass)) {
+ jbyteArray array = getByteBufferArray(env, buffer,
bufferClass);
+ jbyte *arrayPtr = (jbyte
*)env->GetPrimitiveArrayCritical(array, NULL);
+ memcpy(address, arrayPtr, bufferSize);
+ env->ReleasePrimitiveArrayCritical(array, arrayPtr, 0);
+ env->DeleteLocalRef(array);
+ } else {
+ // TODO: Handle byte buffers that don't support arrays
+ LOG_DEBUG("Buffer does not have array\n");
+ }
}
req->buffers[0].buffer = address;
- // TODO: If doing write with heap buffer, copy data from byteBuffer to
allocated space
-
// Create future object
jobject future = createPosixReadWriteAioFuture(env, channel, req,
buffer, position);
req->future = env->NewGlobalRef(future);
@@ -440,6 +450,8 @@
cleanupPosixAio(env, req);
env->ThrowNew(aioException, "error issuing aio_read
request");
}
+ // Advance byteBuffer position
+ setByteBufferPosition(env, buffer, bufferClass, bufferSize);
} else {
LOG_DEBUG("Oops doing nothing\n");
// Throw exception