Re: Signals, sockets and threads

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 



[Index of Archives]     [Linux Kernel]     [Linux Cryptography]     [Fedora]     [Fedora Directory]     [Red Hat Development]

  Powered by Linux