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.