On Jan 28, 2006, at 7:21 AM, Guilhem Lavaux wrote:

Hi Mark,

Mark Wielaard wrote:
Hi Guilhem,
On Sat, 2006-01-28 at 14:43 +0100, Guilhem Lavaux wrote:
I would like to mention that I am developping/fine tuning the new native layer for classpath in a separate branch called "NATIVE- LAYER". If you have some time to give your impressions then fetch it and look into native/jni/native-lib, native/jni/java-io, ...

the new layer itself is developped in native-lib. The other libraries are being adjusted currently...
Thanks for doing this on a branch. That makes it less disruptive and
easier for people to choose to test it out before we decide whether to
incorporate the work on the trunk.
But even for CVS branches you need to send patches to the patches
mailinglist. That way people can follow your work and already read up
and comment on the things they see that they like or dislike. And it
prevents you from having worked on something very hard and then
"suddenly" dropping a big patch. You also need to update the ChangeLog
file on the branch to show the steps taken in creating the new code.
Please use [native] in the subject when sending patches to the list.
(Sorry to be pedantic about this, but we want CVS to be our shared
development space, not someone personal playground.)

Ok. There was no patch at the moment so I could get to a real point. Now is nearly the case. Let's begin the patch flood...

And please do send a proper patch for the things you already checked in
If you didn't create a branch-point cvs tag then the following should
give you the initial diff: cvs diff -Nr classpath-0_20-release native

Ok. I'll send three sets of patches to classpath-patches: one to remove target layer (obviously), one to add the foundations of the new layer, and another to show the adaptations to the already existing classpath's code.

What are the objectives for this branch? How will it be
similar/different from the work that Roman was doing?


I thought to have been already clear about that in the past (and with no answers !).

Sorry, I meant to reply about what you were proposing, but forgot :-)

What you're working on seems a bit better than the target layer stuff, in that you have real functions that the compiler/debugger can tell you about, if there's an error. I don't, however, entirely see the point of another funcall to wrap the syscalls in. It seems to me as though efforts like this are trying to re-use the bits of JNI code that wrap syscalls in the native parts of VM* classes, and not much else.

In my opinion, time would be better spent:

  - Writing utility functions that make JNI easier to deal with.
- Writing concise, portable (in the realm of POSIXy systems, at least) native implementations of VM* classes that require native support. - Optimizing some functions for target systems (e.g., using epoll on Linux, and kqueue on FreeBSD, etc.).

But on the whole, making library that is concise, easy-to-understand, and which works efficiently on free platforms. The point is, we want (at least I want) Classpath not just a *complete* class library, but also an extremely good one. I think trying to make system details generic like this accomplishes that.

Let's try to summarise my goal:

* if we want something which is quite portable (but maybe not as portable as aicas portability layer) we must ensure some level of abstraction to hide how syscalls are really used. That way if we have to call different things in the OS (e.g. for more exotic platforms like windows) or to use the syscalls differently we will not be completely stuck by tons of autoconf code in the common VM layer.


It seems like a lot of the argument for this kind of native layer is "we can port to Windows/some exotic platform," but frankly, I don't see it. Windows (in my uninformed opinion ;-) is probably wildly different enough such that writing a win32 `cpio_read' isn't much less work than writing a win32 `Java_gnu_java_nio_channels_FileChannelImpl_read__.' And since any port like this is (AFAIK) merely hypothetical, I don't see the value.

* some VMs (like us in kaffe) do like to be able to intercept most syscalls to ensure that syscall operations are atomic from the point of view of the threading system. Sometimes you even need to know when a syscall may block to acknowledge the VM to take wise decisions for the GC (I don't remember if it was about wait4 at that time).


That's kind of interesting. Can you explain how this works a little more, or point me to the code where this happens? And why having the native-lib shim between JNI and the system helps this?

* autoconf code is a lot clearer if we can isolate the portions of code to be replaced.


This is true, to a degree. But in many places where APIs hardly diverge at all, having this separation makes less sense. That is, having a good system-level event notification mechanism (epoll/ kqueue//dev/poll/select/poll) certainly requires isolation in order for it to make sense, because each platform is different, but a lot of what is needed diverges much less, and there's little, if anything, to isolate.

The native layer I am writing would like to give an answer these problems. The default code will just be a rough encapsulation of the native syscalls (though maybe not for recv/send/... which needs some polling operations). I think that in future we'll need another configure option for the VM to be able to specify a new adaptative native layer.

At the moment, I have separated this code in another directory of the classpath tree (native/jni/native-lib).


I don't mind this proposal, and I think you should go ahead with it. I still have my own opinions about how to write Classpath's native library, so I may try my own experiment in another branch (unless, of course, no-one really agrees with me, in which case I will just stop critiquing other people's code).

Thanks.

Reply via email to