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/24 16:12:26 UTC
svn commit: r1127065 -
/commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c
Author: mturk
Date: Tue May 24 14:12:25 2011
New Revision: 1127065
URL: http://svn.apache.org/viewvc?rev=1127065&view=rev
Log:
OS localize pollset implementations
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/unix/poll.c
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=1127065&r1=1127064&r2=1127065&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 Tue May 24 14:12:25 2011
@@ -49,6 +49,20 @@ typedef struct acr_pollset_t {
pthread_cond_t wakeup;
} acr_pollset_t;
+J_DECLARE_CLAZZ = {
+ INVALID_FIELD_OFFSET,
+ 0,
+ 0,
+ 0,
+ ACR_UNX_CP "Pollset"
+};
+
+J_DECLARE_M_ID(0000) = {
+ 0,
+ "<init>",
+ "()V"
+};
+
static short ieventt(int event)
{
short rv = 0;
@@ -87,13 +101,6 @@ static short reventt(short event)
return rv;
}
-ACR_NET_EXPORT(jboolean, Pollset, init0)(JNI_STDARGS)
-{
- /* Always supported
- */
- return JNI_TRUE;
-}
-
ACR_NET_EXPORT(jint, Pollset, nmax0)(JNI_STDARGS)
{
int nm = 0;
@@ -110,7 +117,18 @@ ACR_NET_EXPORT(jint, Pollset, nmax0)(JNI
return nm;
}
-ACR_NET_EXPORT(jlong, Pollset, create0)(JNI_STDARGS, jint size)
+ACR_NET_EXPORT(jobject, Pollset, new0)(JNI_STDARGS)
+{
+ if (_clazzn.u == 1)
+ return (*env)->NewObject(env, _clazzn.i, J4MID(0000));
+ if (AcrLoadClass(env, &_clazzn, 0) == JNI_FALSE)
+ return 0;
+ R_LOAD_METHOD(0000, 0);
+ _clazzn.u = 1;
+ return (*env)->NewObject(env, _clazzn.i, J4MID(0000));
+}
+
+ACR_UNX_EXPORT(jlong, PollsetImpl, create0)(JNI_STDARGS, jint size)
{
int rc;
acr_pollset_t *ps;
@@ -162,7 +180,7 @@ cleanup:
return 0;
}
-ACR_NET_EXPORT(void, Pollset, destroy0)(JNI_STDARGS, jlong pollset)
+ACR_UNX_EXPORT(void, PollsetImpl, destroy0)(JNI_STDARGS, jlong pollset)
{
int i;
acr_pollset_t *ps = J2P(pollset, acr_pollset_t *);
@@ -201,8 +219,8 @@ ACR_NET_EXPORT(void, Pollset, destroy0)(
AcrFree(ps);
}
-ACR_NET_EXPORT(jint, Pollset, clear0)(JNI_STDARGS, jlong pollset,
- jobjectArray rs)
+ACR_UNX_EXPORT(jint, PollsetImpl, clear0)(JNI_STDARGS, jlong pollset,
+ jobjectArray rs)
{
int i;
int cnt = 0;
@@ -239,7 +257,7 @@ ACR_NET_EXPORT(jint, Pollset, clear0)(JN
return cnt;
}
-ACR_NET_EXPORT(void, Pollset, wakeup0)(JNI_STDARGS, jlong pollset)
+ACR_UNX_EXPORT(void, PollsetImpl, wakeup0)(JNI_STDARGS, jlong pollset)
{
acr_pollset_t *ps = J2P(pollset, acr_pollset_t *);
@@ -252,9 +270,9 @@ ACR_NET_EXPORT(void, Pollset, wakeup0)(J
pthread_mutex_unlock(&ps->mutex);
}
-ACR_NET_EXPORT(jint, Pollset, wait0)(JNI_STDARGS, jlong pollset, jobjectArray rs,
- jshortArray revents, jint timeout,
- jboolean rmsignaled)
+ACR_UNX_EXPORT(jint, PollsetImpl, wait0)(JNI_STDARGS, jlong pollset, jobjectArray rs,
+ jshortArray revents, jint timeout,
+ jboolean rmsignaled)
{
int i, ns, rc = 0;
int rv = 0;
@@ -304,7 +322,7 @@ ACR_NET_EXPORT(jint, Pollset, wait0)(JNI
rc = ACR_GET_OS_ERROR();
pthread_mutex_lock(&ps->mutex);
if (ps->state == PSS_DESTROY) {
- /* Interrupted by free0 or wakeup0 */
+ /* Interrupted by free0 */
pthread_cond_broadcast(&ps->wakeup);
pthread_mutex_unlock(&ps->mutex);
return 0;
@@ -324,6 +342,19 @@ ACR_NET_EXPORT(jint, Pollset, wait0)(JNI
pthread_mutex_unlock(&ps->mutex);
return 0;
}
+ if (ps->state == PSS_WAKEUP) {
+ /* Interrupted by wakeup0 */
+ if (ps->fdset[0].revents != 0) {
+ /* Drain the wakeup pipe.
+ * Wakeup pipe is always at index zero.
+ */
+ AcrDrainPipe(ps->wpipe[0]);
+ }
+ ps->state = 0;
+ pthread_cond_broadcast(&ps->wakeup);
+ pthread_mutex_unlock(&ps->mutex);
+ return 0;
+ }
ps->state = PSS_WAIT;
pevents = JARRAY_CRITICAL(jshort, revents);
/* Cycle trough the descriptors */
@@ -350,13 +381,17 @@ ACR_NET_EXPORT(jint, Pollset, wait0)(JNI
}
}
else {
- if (now == 0)
- now = AcrTimeNow();
- if (ps->ooset[i].ttl > 0 && ps->ooset[i].exp > now) {
- /* Expired descriptor */
- ps->fdset[i].revents = POLLHUP;
- pevents[rv] = ACR_POLLTTL;
- (*env)->SetObjectArrayElement(env, rs, rv++, ps->ooset[i].obj);
+ /* Check for the expired descriptors.
+ */
+ if (ps->ooset[i].ttl > 0) {
+ if (now == 0)
+ now = AcrTimeNow();
+ if (ps->ooset[i].exp > now) {
+ /* Expired descriptor */
+ ps->fdset[i].revents = POLLHUP;
+ pevents[rv] = ACR_POLLTTL;
+ (*env)->SetObjectArrayElement(env, rs, rv++, ps->ooset[i].obj);
+ }
}
}
}
@@ -393,10 +428,10 @@ ACR_NET_EXPORT(jint, Pollset, wait0)(JNI
return rv;
}
-ACR_NET_EXPORT(jint, Pollset, add0)(JNI_STDARGS, jlong pollset, jobject fo,
- jint f, jint events, jint ttlms)
+ACR_UNX_EXPORT(jint, PollsetImpl, add0)(JNI_STDARGS, jlong pollset, jobject fo,
+ jint f, jint events, jint ttlms)
{
- int rc = 0;
+ int i, rc = 0;
acr_pollset_t *ps = J2P(pollset, acr_pollset_t *);
pthread_mutex_lock(&ps->mutex);
@@ -419,6 +454,14 @@ ACR_NET_EXPORT(jint, Pollset, add0)(JNI_
rc = ACR_EOVERFLOW;
goto cleanup;
}
+ for (i = 1; i < ps->used; i++) {
+ if (ps->fdset[i].fd == f) {
+ /* Duplicate descriptor
+ */
+ rc = ACR_EALREADY;
+ goto cleanup;
+ }
+ }
ps->fdset[ps->used].fd = f;
ps->fdset[ps->used].events = ieventt(events);
ps->fdset[ps->used].revents = 0;
@@ -444,6 +487,48 @@ cleanup:
return rc;
}
+ACR_UNX_EXPORT(jint, PollsetImpl, del0)(JNI_STDARGS, jlong pollset, jobject fo,
+ jint f)
+{
+ int i, rc = ACR_EOF;
+ acr_pollset_t *ps = J2P(pollset, acr_pollset_t *);
+
+ pthread_mutex_lock(&ps->mutex);
+ while (ps->state != 0) {
+ if (ps->state == PSS_DESTROY) {
+ rc = 0;
+ goto cleanup;
+ }
+ if (ps->state == PSS_POLL) {
+ char ch = 1;
+ ps->state = PSS_WAKEUP;
+ r_write(ps->wpipe[1], &ch, 1);
+ }
+ if ((rc = pthread_cond_wait(&ps->wakeup, &ps->mutex)) != 0)
+ goto cleanup;
+ }
+
+ for (i = 1; i < ps->used; i++) {
+ if (ps->ooset[i].obj == fo) {
+ int dest = i;
+ int used = ps->used;
+ ps->used--;
+ /* Unref descriptor */
+ (*env)->DeleteGlobalRef(env, ps->ooset[i].obj);
+ for (++i; i < used; i++) {
+ ps->fdset[dest] = ps->fdset[i];
+ ps->ooset[dest] = ps->ooset[i];
+ dest++;
+ }
+ rc = 0;
+ }
+ }
+
+cleanup:
+ pthread_mutex_unlock(&ps->mutex);
+ return rc;
+}
+
ACR_NET_EXPORT(jint, Poll, wait0)(JNI_STDARGS, jintArray fdset,
jshortArray events, jshortArray revents,
jint nevents, jint timeout)
@@ -534,8 +619,7 @@ ACR_NET_EXPORT(jshort, Poll, wait1)(JNI_
break;
}
if (ns == -1)
- return -1;
- else
- return reventt(pfd.revents);
+ ACR_THROW_NET_ERRNO();
+ return reventt(pfd.revents);
}
\ No newline at end of file