Tim Ellison wrote:
A minor comment first :-) Please check return values for :
+ vect = (struct iovec*) hymem_allocate_memory(sizeof(struct iovec) *
length);
+
+ message = (*env)->GetPrimitiveArrayCritical(env, addrs, &isCopyMessage);
+ cts = (*env)->GetPrimitiveArrayCritical(env, counts, &isCopyCts);
Yes, will add it, thanks.
A further enhancement is to have two versions of primitives, one that
deals with direct buffers and one that deals with java heap buffers, so
that there is (potentially) no data copying required for the java-heap
buffers version that you have got today:
One case stop me to do that is a buffer array contains direct and java heap
buffers both. In this case, either copying java heap buffres to direct buffers
or passing the whole array to native directly.
If pass the array to native directly, it need to call isDirect and
AddressUtil.getDirectBufferAddress in native code, as I understand, call java
methods from native side is like reflection, even more expensive, so I chose
copying all java heap buffers to direct buffers, at least it fast when most
buffers are direct and size of java heap buffers are not too big.
One possible solution I can think is adding a new native call
writevDirect(JNIEnv *env, jobject thiz, jobject fd, jobject bufferArray, jobject
addrs, jobject counts, jint length)
passing buffer array and native addresses of direct buffers together, if element
of addrs is 0, the corresponding buffer is not direct. Well, this method is a
little bit hard to understand, it has 7 parameters....
+ if (!buffer.isDirect()) {
+ src[i] = ByteBuffer.allocateDirect(buffer.remaining());
+ int oldPosition = buffer.position();
+ src[i].put(buffer);
some VMs will pin the java heap memory accessed in JNI
(GetByteArrayElements), so if you can get hold of the ByteBuffer#array()
you can pass a set of pointers to the backing arrays and maybe send the
data directly.
Looking forward to seeing the readv impl too ;-)
Sure, it's on my TODO list :)
Regards,
Tim
--
Best Regards,
Regis.