Hi Robert, You are using tmp_errno = errno... ret is precisely holding errno. I have built the native-lib so that we are always thread safe. I have not noticed that VMChannel is so native-lib agnostic. ;-) I will have to rewrite VMChannel... Probably next weeks will be devoted to this. In respect to this buggy interface, it is ok. :) Cheers, Guilhem. Robert Schuster wrote: > 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 >