I'm trying to complete the interruptible channel feature of NIO module, but there is a question.

The spec for InterruptibleChannel says:

"A channel that implements this interface is asynchronously closeable: If a thread is blocked in an I/O operation on an interruptible channel then another thread may invoke the channel's close method. This will cause the blocked thread to receive an AsynchronousCloseException.

A channel that implements this interface is also interruptible: If a thread is blocked in an I/O operation on an interruptible channel then another thread may invoke the blocked thread's interrupt method. *This will cause the channel to be closed, the blocked thread to receive a ClosedByInterruptException, and the blocked thread's interrupt status to be set. *
"

From the spec, the latter one (Close by interrupt) probably needs some interaction with Thread, and the Thread's interrupt() method is defined as:

"If this thread is blocked in an invocation of the wait(), ..., then its interrupt status will be cleared and it will receive an InterruptedException.

If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.

If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
"

Seems Thread's implementation must be aware of what operation it is blocking on. So I propose the following solution:

1. Add this method to kernel class Thread (in VMI): private void setInterruptAction(Runnable action);

2. Thread's default value of action is null. Thread's interrupt() method will check the action field at first, if it is not null, execute the action at first, and then perform the normal interruption.

3. If some interruptible blocking I/O operation is going to happen, then invoke this method to current thread like below (probably by reflection):

Thread.currentThread().setInterruptAction(new Runnable(){
   public void run(){
      interrupted = true;
      AbstractInterruptibleChannel.this.close();
   }
});

4. It is the AbstractInterruptibleChannel's responsibility to reset Thread's interrupt action to null after the blocking I/O operation.

5. The interruption of select operation can be implemented in same way, all difference is another Runnable inner class, which invokes selector's wake-up.

comments? ideas?

--
Paulex Yang
China Software Development Lab
IBM



---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to