Hi all, the title looks like fun, eh? :) In an attempt to get gnu/testlet/java/net/ServerSocket/ReturnOnClose to succeed on Cacao with the new an shiny VMChannel implementation I found out the Cacao's Thread.interrupt() does not cause blocking system calls to be interrupted. A short glimpse a GCJ's code (where the above testcase runs fine) revealed that I needed to add a pthread_kill (and an obligatory sigaction) to get things working.
With that in place I tried to implement a correct VMChannel.accept. The
interesting part looks like this:
do
{
ret = cpnio_accept (fd, (struct sockaddr *) &addr, &alen);
tmp_errno = errno;
/* Check if interrupted by Thread.interrupt(). If not then some
* other unrelated signal interrupted the system function and
* we should start over again.
*/
if (tmp_errno == EINTR && JCL_thread_interrupted(env, clazz))
{
JCL_ThrowException (env, "java/net/SocketException", strerror
(tmp_errno));
return -1;
}
}
while (ret == -1);
if (ret == -1)
{
if (EWOULDBLOCK != tmp_errno && EAGAIN != tmp_errno)
JCL_ThrowException (env, "java/net/SocketException", strerror
(tmp_errno));
}
return ret;
tmp_errno is an int which is set to 0 in the beginning.
The special bit is JCL_thread_interrupted which calls back into the VM
to ask it whether the current thread has its interrupted flag set. My idea is
that a delibarate Thread.interrupt() from inside the VM should stop
VMChannel.accept() while a user running: "killall -SIGUSR1 cacao" from the
console should not.
Is that implementation OK. If not please give me some pointers to make it
better.
cya
Robert
signature.asc
Description: PGP signature
signature.asc
Description: OpenPGP digital signature

