JNIEXPORT jint JNICALL Java_org_zeromq_ZMQ_00024Poller_run_1poll (JNIEnv *env, jclass cls, jobjectArray socket_0mq, jint count, jlong timeout) { int ls = (int) count; if (ls <= 0) { return 0; } int ls_0mq = 0; if (socket_0mq) ls_0mq = env->GetArrayLength (socket_0mq); if (ls > ls_0mq) { return 0; } zmq_pollitem_t *pitem = new zmq_pollitem_t [ls]; short pc = 0; int rc = 0; // Add 0MQ sockets. Array containing them can be "sparse": there // may be null elements. The count argument has the real number // of valid sockets in the array. for (int i = 0; i < ls_0mq; ++i) { jobject s_0mq = env->GetObjectArrayElement (socket_0mq, i); if (!s_0mq) continue; void *s = fetch_socket (env, s_0mq); int fd = (s == NULL) ? fetch_socket_fd (env, s_0mq) : 0; if (s == NULL && fd < 0) { raise_exception (env, EINVAL); continue; } env->SetIntField (s_0mq, field_revents, 0); pitem [pc].socket = s; pitem [pc].fd = fd; pitem [pc].events = env->GetIntField (s_0mq, field_events); pitem [pc].revents = 0; ++pc; env->DeleteLocalRef (s_0mq); } // Count of non-null sockets must be equal to passed-in arg. if (pc == ls) { pc = 0; long tout = (long) timeout; rc = zmq_poll (pitem, ls, tout); } // Set 0MQ results. if (rc > 0 && ls > 0) { for (int i = 0; i < ls_0mq; ++i) { jobject s_0mq = env->GetObjectArrayElement (socket_0mq, i); if (!s_0mq) continue; env->SetIntField (s_0mq, field_revents, pitem [pc].revents); ++pc; env->DeleteLocalRef (s_0mq); } } else if (rc < 0) { raise_exception (env, zmq_errno()); } delete [] pitem; return rc; }
JNIEXPORT jlong JNICALL Java_org_zeromq_ZMQ_00024Poller_run_1poll (JNIEnv *env, jobject obj, jint count, jobjectArray socket_0mq, jshortArray event_0mq, jshortArray revent_0mq, jlong timeout) { int ls = (int) count; if (ls <= 0) return 0; int ls_0mq = 0; int le_0mq = 0; int lr_0mq = 0; if (socket_0mq) ls_0mq = env->GetArrayLength (socket_0mq); if (event_0mq) le_0mq = env->GetArrayLength (event_0mq); if (revent_0mq) lr_0mq = env->GetArrayLength (revent_0mq); if (ls > ls_0mq || ls > le_0mq || ls > ls_0mq) return 0; zmq_pollitem_t *pitem = new zmq_pollitem_t [ls]; short pc = 0; int rc = 0; // Add 0MQ sockets. Array containing them can be "sparse": there // may be null elements. The count argument has the real number // of valid sockets in the array. if (ls_0mq > 0) { jshort *e_0mq = env->GetShortArrayElements (event_0mq, 0); if (e_0mq != NULL) { for (int i = 0; i < ls_0mq; ++i) { jobject s_0mq = env->GetObjectArrayElement (socket_0mq, i); if (!s_0mq) continue; void *s = fetch_socket (env, s_0mq); if (s == NULL) { raise_exception (env, EINVAL); continue; } pitem [pc].socket = s; pitem [pc].fd = 0; pitem [pc].events = e_0mq [i]; pitem [pc].revents = 0; ++pc; } env->ReleaseShortArrayElements(event_0mq, e_0mq, 0); } } // Count of non-null sockets must be equal to passed-in arg. if (pc == ls) { pc = 0; long tout = (long) timeout; rc = zmq_poll (pitem, ls, tout); } // Set 0MQ results. if (ls_0mq > 0) { jshort *r_0mq = env->GetShortArrayElements (revent_0mq, 0); if (r_0mq) { for (int i = 0; i < ls_0mq; ++i) { jobject s_0mq = env->GetObjectArrayElement (socket_0mq, i); if (!s_0mq) continue; r_0mq [i] = pitem [pc].revents; ++pc; } env->ReleaseShortArrayElements(revent_0mq, r_0mq, 0); } } delete [] pitem; return rc; }