You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/05/30 13:25:36 UTC
svn commit: r1129129 - in /commons/sandbox/runtime/trunk/src/main:
java/org/apache/commons/runtime/net/
java/org/apache/commons/runtime/platform/unix/ native/os/unix/
Author: mturk
Date: Mon May 30 11:25:35 2011
New Revision: 1129129
URL: http://svn.apache.org/viewvc?rev=1129129&view=rev
Log:
Add autoCancel flag and closed selector exceptio
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java (with props)
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IllegalSelectorException.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/Selector.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/unix/SocketSelectorImpl.java
commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c
Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java?rev=1129129&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java Mon May 30 11:25:35 2011
@@ -0,0 +1,39 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime.net;
+
+import java.io.IOException;
+
+/**
+ * An {@code ClosedSelectorException} is thrown when an operation is invoked
+ * on a closed selector.
+ *
+ * @since Runtime 1.0
+ */
+public class ClosedSelectorException extends IOException
+{
+
+ public ClosedSelectorException()
+ {
+ super();
+ }
+
+ public ClosedSelectorException(String msg)
+ {
+ super(msg);
+ }
+}
Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/ClosedSelectorException.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IllegalSelectorException.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IllegalSelectorException.java?rev=1129129&r1=1129128&r2=1129129&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IllegalSelectorException.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IllegalSelectorException.java Mon May 30 11:25:35 2011
@@ -17,8 +17,9 @@
package org.apache.commons.runtime.net;
/**
- * An {@code IllegalSelectorException} is thrown when an operation that
- * requires a specific selector is invoked on ainvalid selector.
+ * An {@code IllegalSelectorException} is thrown when an attempt is
+ * made to register a endpoint with a selector that was not used
+ * to create a selection key.
*
* @since Runtime 1.0
*/
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/Selector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/Selector.java?rev=1129129&r1=1129128&r2=1129129&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/Selector.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/Selector.java Mon May 30 11:25:35 2011
@@ -29,7 +29,12 @@ import org.apache.commons.runtime.Overfl
*/
public abstract class Selector implements Closeable
{
- private int capacity;
+ private int capacity;
+
+ /**
+ * Indicates the current auto-cancel mode for this {@code Selector} object.
+ */
+ protected boolean autoCancel;
private Selector()
{
@@ -57,18 +62,18 @@ public abstract class Selector implement
*
* @return the current number of registered endpoints.
*
- * @throws IllegalSelectorException if this selector is closed.
+ * @throws ClosedSelectorException if this selector is closed.
*/
public abstract int size()
- throws IllegalSelectorException;
+ throws ClosedSelectorException;
/**
* Interrupt this pollset.
*
- * @throws IllegalSelectorException if this selector is closed.
+ * @throws ClosedSelectorException if this selector is closed.
*/
public abstract void interrupt()
- throws IllegalSelectorException;
+ throws ClosedSelectorException;
/**
* Registers the selection key with this selector.
@@ -77,28 +82,38 @@ public abstract class Selector implement
* it was already registered.
*
* @throws ClosedDescriptorException if the key's endpoint is closed.
- * @throws IllegalSelectorException if this selector is closed.
+ * @throws ClosedSelectorException if this selector is closed.
+ * @throws IllegalSelectorException if the key was not created by the same
+ * selector as this selector.
* @throws OverflowException if the selector reached it's capacity.
*/
protected abstract boolean register(SelectionKey key, int ops)
throws ClosedDescriptorException,
IllegalSelectorException,
+ ClosedSelectorException,
OverflowException,
IOException;
/**
* Unregister the selection key from this selector.
*
- * @throws IllegalSelectorException if this selector is closed.
+ * @throws ClosedSelectorException if this selector is closed.
+ * @throws IllegalSelectorException if the key was not created by the same
+ * selector as this selector.
*/
protected abstract void cancel(SelectionKey key)
- throws IllegalSelectorException;
+ throws ClosedSelectorException,
+ IllegalSelectorException;
/**
- * Free the allocated resource by the Operating system.
+ * Closes this selector. Ongoing calls to the {@code select} methods of this
+ * selector will get interrupted. This interruption behaves as if the
+ * {@link #interrupt()} method of this selector is called. After this, all keys
+ * that are still valid are invalidated and their channels are unregistered.
+ * All resources held by this selector are released.
* <p>
- * Note that {@code Object.finalize()} method will call
- * this function. However if the native code can block for
- * long time explicit {@code close()} should be called.
+ * Any further attempt of using this selector after this method has been
+ * called (except calling {@link #close()} or {@link #interrupt()})
+ * results in a {@link ClosedSelectorException} being thrown.
* </p>
* @see java.io.Closeable#close()
* @throws IOException if an I/O error occurs.
@@ -106,4 +121,16 @@ public abstract class Selector implement
public abstract void close()
throws IOException;
+ /**
+ * Sets this selector's auto-cancel mode to the given state.
+ * If the selector is in auto-cancel mode, then the keys are
+ * canceled when signaled.
+ *
+ * @param on {@code true} to enable auto-cancel mode; {@code false}
+ * to disable it.
+ */
+ public void setAutoCancel(boolean on)
+ {
+ autoCancel = on;
+ }
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/unix/SocketSelectorImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/unix/SocketSelectorImpl.java?rev=1129129&r1=1129128&r2=1129129&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/unix/SocketSelectorImpl.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/unix/SocketSelectorImpl.java Mon May 30 11:25:35 2011
@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import org.apache.commons.runtime.io.ClosedDescriptorException;
import org.apache.commons.runtime.net.Endpoint;
+import org.apache.commons.runtime.net.ClosedSelectorException;
import org.apache.commons.runtime.net.IllegalSelectorException;
import org.apache.commons.runtime.net.Poll;
import org.apache.commons.runtime.net.SelectionKey;
@@ -52,13 +53,14 @@ final class SocketSelectorImpl extends S
private static native long create0(int size)
throws OutOfMemoryError,
SystemException;
- private static native void destroy0(long pollset);
private static native void wakeup0(long pollset);
+ private static native int destroy0(long pollset);
private static native int size0(long pollset);
private static native int add0(long pollset, SelectionKeyImpl key, int fd, int events, int ttl);
private static native int del0(long pollset, SelectionKeyImpl key, int fd);
private static native int clear0(long pollset, SelectionKeyImpl[] set);
- private static native int wait0(long pollset, SelectionKeyImpl[] set, short[] events, int timeout, boolean remove);
+ private static native int wait0(long pollset, SelectionKeyImpl[] set, short[] events,
+ int timeout, boolean autocancel);
/*
* Created from native
@@ -71,34 +73,44 @@ final class SocketSelectorImpl extends S
keyset = new SelectionKeyImpl[size];
}
+ private void ensureValid()
+ throws ClosedSelectorException
+ {
+ if (pollset == 0L)
+ throw new ClosedSelectorException();
+ }
+
@Override
public int size()
- throws IllegalSelectorException
+ throws ClosedSelectorException
{
- if (pollset == 0L)
- throw new IllegalSelectorException();
+ ensureValid();
return size0(pollset);
}
@Override
public void interrupt()
- throws IllegalSelectorException
+ throws ClosedSelectorException
{
- if (pollset == 0L)
- throw new IllegalSelectorException();
+ ensureValid();
wakeup0(pollset);
}
@Override
public boolean register(SelectionKey key, int ops)
- throws IllegalSelectorException, ClosedDescriptorException, OverflowException, IOException
+ throws ClosedSelectorException,
+ IllegalSelectorException,
+ ClosedDescriptorException,
+ OverflowException,
+ IOException
{
+ ensureValid();
SelectionKeyImpl skey = (SelectionKeyImpl)key;
+ if (skey.selector() != this)
+ throw new IllegalSelectorException();
int fd = skey.endpoint().descriptor().fd();
if (fd == -1)
throw new ClosedDescriptorException();
- if (pollset == 0L)
- throw new IllegalSelectorException();
int rc = add0(pollset, skey, fd, ops, skey.timeout());
if (rc != 0) {
if (rc == Errno.EALREADY)
@@ -113,25 +125,32 @@ final class SocketSelectorImpl extends S
@Override
protected void cancel(SelectionKey key)
- throws IllegalSelectorException
+ throws ClosedSelectorException,
+ IllegalSelectorException
{
+ ensureValid();
+ if (key.selector() != this)
+ throw new IllegalSelectorException();
SelectionKeyImpl skey = (SelectionKeyImpl)key;
int fd = skey.endpoint().descriptor().fd();
- if (fd == -1)
- return;
- if (pollset == 0L)
- throw new IllegalSelectorException();
- del0(pollset, skey, fd);
+ if (fd != -1) {
+ // Remove selection key
+ del0(pollset, skey, fd);
+ skey.revents = 0;
+ }
}
@Override
public void close()
throws IOException
{
- if (pollset == 0L)
- throw new ClosedDescriptorException();
- destroy0(pollset);
- pollset = 0L;
+ if (pollset != 0L) {
+ long ps = pollset;
+ pollset = 0L;
+ int rc = destroy0(ps);
+ if (rc != 0)
+ throw new IOException(Status.describe(rc));
+ }
}
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c?rev=1129129&r1=1129128&r2=1129129&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c Mon May 30 11:25:35 2011
@@ -215,9 +215,10 @@ cleanup:
return 0;
}
-ACR_UNX_EXPORT(void, SocketSelectorImpl, destroy0)(JNI_STDARGS, jlong pollset)
+ACR_UNX_EXPORT(int, SocketSelectorImpl, destroy0)(JNI_STDARGS, jlong pollset)
{
int i;
+ int rc = 0;
acr_pollset_t *ps = J2P(pollset, acr_pollset_t *);
pthread_mutex_lock(&ps->mutex);
@@ -232,10 +233,9 @@ ACR_UNX_EXPORT(void, SocketSelectorImpl,
* Since we set the state to DESTROY
* wait0 will return 0.
*/
- if (pthread_cond_wait(&ps->wakeup, &ps->mutex) != 0) {
+ if ((rc = pthread_cond_wait(&ps->wakeup, &ps->mutex)) != 0) {
pthread_mutex_unlock(&ps->mutex);
- ACR_THROW(ACR_EX_EILLEGAL, 0);
- return;
+ return rc;
}
}
ps->state = PSS_DESTROY;
@@ -252,6 +252,7 @@ ACR_UNX_EXPORT(void, SocketSelectorImpl,
AcrFree(ps->fdset);
AcrFree(ps->ooset);
AcrFree(ps);
+ return rc;
}
ACR_UNX_EXPORT(jint, SocketSelectorImpl, clear0)(JNI_STDARGS, jlong pollset,
@@ -319,7 +320,7 @@ ACR_UNX_EXPORT(jint, SocketSelectorImpl,
ACR_UNX_EXPORT(jint, SocketSelectorImpl, wait0)(JNI_STDARGS, jlong pollset,
jobjectArray rs, jshortArray revents,
- jint timeout, jboolean rmsignaled)
+ jint timeout, jboolean autocancel)
{
int i, ns, rc = 0;
int rv = 0;
@@ -417,9 +418,8 @@ ACR_UNX_EXPORT(jint, SocketSelectorImpl,
else {
pevents[rv] = reventt(ps->fdset[i].revents);
(*env)->SetObjectArrayElement(env, rs, rv++, ps->ooset[i].obj);
- if (rmsignaled == JNI_FALSE && ps->ooset[i].ttl > 0) {
- /* Reset TTL if we are not going to remove
- * the descriptor from this pollset
+ if (ps->ooset[i].ttl > 0) {
+ /* Reset TTL
*/
if (now == 0)
now = AcrTimeNow();
@@ -443,7 +443,7 @@ ACR_UNX_EXPORT(jint, SocketSelectorImpl,
}
}
RELEASE_CRITICAL(revents, pevents);
- if (rmsignaled == JNI_TRUE && rv > 0) {
+ if (autocancel == JNI_TRUE && rv > 0) {
/* Remove all descriptors with revents set except
* the wakeup pipe at index zero.
*/