コード例 #1
0
ファイル: Poller.cpp プロジェクト: Agnie-Software/jzmq
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;
}
コード例 #2
0
ファイル: Poller.cpp プロジェクト: AA33/jzmq
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;
}