midp_link.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 971 行 · 第 1/2 页

C
971
字号
    KNI_EndHandles();    KNI_ReturnVoid();}/** * public native boolean isOpen(); */KNIEXPORT KNI_RETURNTYPE_BOOLEANJava_com_sun_midp_links_Link_isOpen(void){    rendezvous *rp;    jboolean retval;    KNI_StartHandles(1);    KNI_DeclareHandle(thisObj);    KNI_GetThisPointer(thisObj);    rp = getNativePointer(thisObj);    if (rp == NULL) {        retval = KNI_FALSE;    } else {        retval = (rp->state != CLOSED);    }    KNI_EndHandles();    KNI_ReturnBoolean(retval);}/** * private native void receive0(LinkMessage msg, Link link) *         throws ClosedLinkException, *                InterruptedIOException, *                IOException; */KNIEXPORT KNI_RETURNTYPE_VOIDJava_com_sun_midp_links_Link_receive0(void){    rendezvous *rp;    KNI_StartHandles(4);    KNI_DeclareHandle(thisObj);    KNI_DeclareHandle(recvMessageObj);    KNI_DeclareHandle(sendMessageObj);    KNI_DeclareHandle(linkObj);    KNI_GetThisPointer(thisObj);    KNI_GetParameterAsObject(1, recvMessageObj);    KNI_GetParameterAsObject(2, linkObj);    rp = getNativePointer(thisObj);    if (rp == NULL) {        if (SNI_GetReentryData(NULL) == NULL) {            KNI_ThrowNew(midpClosedLinkException, NULL);        } else {            KNI_ThrowNew(midpInterruptedIOException, NULL);        }    } else if (JVM_CurrentIsolateID() != rp->receiver) {        KNI_ThrowNew(midpIllegalArgumentException, NULL);    } else {        jboolean ok;        switch (rp->state) {            case IDLE:                rp->state = RECEIVING;                midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                break;            case SENDING:                getReference(rp->msg, "receive0/SENDING",                    sendMessageObj);                ok = copy(sendMessageObj, recvMessageObj, linkObj);                if (ok) {                    rp->retcode = OK;                } else {                    rp->retcode = ERROR;                    KNI_ThrowNew(midpIOException, NULL);                }                rp->state = DONE;                midp_thread_signal(LINK_READY_SIGNAL, (int)rp, 0);                break;            case RENDEZVOUS:                getReference(rp->msg, "receive0/RENDEZVOUS", sendMessageObj);                ok = copy(sendMessageObj, recvMessageObj, linkObj);                if (ok) {                    rp->retcode = OK;                } else {                    rp->retcode = ERROR;                    KNI_ThrowNew(midpIOException, NULL);                }                rp->state = DONE;                midp_thread_signal(LINK_READY_SIGNAL, (int)rp, 0);                break;            case RECEIVING:            case DONE:                midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                break;            case CLOSED:                setNativePointer(thisObj, NULL);                rp_decref(rp);                if (SNI_GetReentryData(NULL) == NULL) {                    KNI_ThrowNew(midpClosedLinkException, NULL);                } else {                    KNI_ThrowNew(midpInterruptedIOException, NULL);                }                break;        }    }    KNI_EndHandles();    KNI_ReturnVoid();}/** * private native void send0(LinkMessage msg) *     throws ClosedLinkException, *            InterruptedIOException, *            IOException; */KNIEXPORT KNI_RETURNTYPE_VOIDJava_com_sun_midp_links_Link_send0(void){    rendezvous *rp;    KNI_StartHandles(3);    KNI_DeclareHandle(thisObj);    KNI_DeclareHandle(messageObj);    KNI_DeclareHandle(otherMessageObj);    KNI_GetThisPointer(thisObj);    KNI_GetParameterAsObject(1, messageObj);    rp = getNativePointer(thisObj);    if (rp == NULL) {        if (SNI_GetReentryData(NULL) == NULL) {            KNI_ThrowNew(midpClosedLinkException, NULL);        } else {            KNI_ThrowNew(midpInterruptedIOException, NULL);        }    } else if (JVM_CurrentIsolateID() != rp->sender) {        KNI_ThrowNew(midpIllegalArgumentException, NULL);    } else {        switch (rp->state) {            case IDLE:                rp->msg = SNI_AddStrongReference(messageObj);                rp->state = SENDING;                midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                break;            case RECEIVING:                rp->msg = SNI_AddStrongReference(messageObj);                rp->state = RENDEZVOUS;                midp_thread_signal(LINK_READY_SIGNAL, (int)rp, 0);                midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                break;            case SENDING:            case RENDEZVOUS:                midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                break;            case DONE:                getReference(rp->msg, "send0/DONE", otherMessageObj);                if (KNI_IsSameObject(messageObj, otherMessageObj)) {                    /* it's our message, finish processing */                    SNI_DeleteReference(rp->msg);                    rp->msg = INVALID_REFERENCE_ID;                    rp->state = IDLE;                    midp_thread_signal(LINK_READY_SIGNAL, (int)rp, 0);                    if (rp->retcode != OK) {                        KNI_ThrowNew(midpIOException, NULL);                    }                } else {                    /* somebody else's message, just go back to sleep */                    midp_thread_wait(LINK_READY_SIGNAL, (int)rp, NULL);                }                break;            case CLOSED:                setNativePointer(thisObj, NULL);                if (rp->msg != INVALID_REFERENCE_ID) {                    /* a message was stranded in the link; clean it out */                    SNI_DeleteReference(rp->msg);                    rp->msg = INVALID_REFERENCE_ID;                }                rp_decref(rp);                if (SNI_GetReentryData(NULL) == NULL) {                    KNI_ThrowNew(midpClosedLinkException, NULL);                } else {                    KNI_ThrowNew(midpInterruptedIOException, NULL);                }                break;        }    }    KNI_EndHandles();    KNI_ReturnVoid();}/** * Cleans up this portal entry. Frees the array of pointers to rendezvous  * points and sets the count to -1. If the count is already -1, does  * nothing. Note that this does not free the portal entry itself, since it's  * not separately allocated. */voidportal_free(portal *pp) {    int i;    if (pp->count == -1) {        return;    }    for (i = 0; i < pp->count; i++) {        rp_decref(pp->rppa[i]);    }    if (pp->rppa != NULL) {        pcsl_mem_free(pp->rppa);        pp->rppa = NULL;    }    pp->count = -1;}/** * private static native void setLinks0(int isolateid, Link[] linkarray); */KNIEXPORT KNI_RETURNTYPE_VOIDJava_com_sun_midp_links_LinkPortal_setLinks0(void){    int targetIsolate;    int len;    int i;    int ok = 1;    rendezvous *rp;    rendezvous **newrppa = NULL;    KNI_StartHandles(2);    KNI_DeclareHandle(linkArray);    KNI_DeclareHandle(linkObj);    targetIsolate = KNI_GetParameterAsInt(1);    KNI_GetParameterAsObject(2, linkArray);    if (KNI_IsNullHandle(linkArray)) {        len = 0;    } else {        len = KNI_GetArrayLength(linkArray);    }    for (i = 0; i < len; i++) {        KNI_GetObjectArrayElement(linkArray, i, linkObj);        rp = getNativePointer(linkObj);        if (rp == NULL || rp->state == CLOSED) {            ok = 0;            KNI_ThrowNew(midpIllegalArgumentException, NULL);            break;        }    }    if (ok && portals == NULL) {        portals =            (portal *)pcsl_mem_malloc(JVM_MaxIsolates() * sizeof(portal));        if (portals == NULL) {            ok = 0;            KNI_ThrowNew(midpOutOfMemoryError, NULL);        } else {            int i;            for (i = 0; i < JVM_MaxIsolates(); i++) {                portals[i].count = -1;                portals[i].rppa = NULL;            }        }    }    if (ok && len > 0) {        newrppa = (rendezvous **)pcsl_mem_malloc(len * sizeof(rendezvous *));        if (newrppa == NULL) {            KNI_ThrowNew(midpOutOfMemoryError, NULL);            ok = 0;        }    }    if (ok) {        portal *pp = &portals[targetIsolate];        portal_free(pp);        /* at this point the portal's count is zero and rppa is null */        if (len > 0) {            for (i = 0; i < len; i++) {                KNI_GetObjectArrayElement(linkArray, i, linkObj);                rp = getNativePointer(linkObj);                /* rp not null, checked above */                newrppa[i] = rp;                rp_incref(rp);            }            pp->count = len;            pp->rppa = newrppa;        } else if (KNI_IsNullHandle(linkArray)) {            pp->count = -1;            pp->rppa = NULL;        } else {            /* len == 0 */            pp->count = 0;            pp->rppa = NULL;        }        midp_thread_signal(LINK_PORTAL_SIGNAL, targetIsolate, 0);    }    KNI_EndHandles();    KNI_ReturnVoid();}/** * private static native int getLinkCount0(); */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_midp_links_LinkPortal_getLinkCount0(void){    int retval = 0;    int targetIsolate = JVM_CurrentIsolateID();    if (portals == NULL || portals[targetIsolate].count == -1) {        midp_thread_wait(LINK_PORTAL_SIGNAL, targetIsolate, NULL);    } else {        retval = portals[targetIsolate].count;    }    KNI_ReturnInt(retval);}/** * private static native void getLinks0(Link[] linkarray); */KNIEXPORT KNI_RETURNTYPE_VOIDJava_com_sun_midp_links_LinkPortal_getLinks0(void){    int targetIsolate;    jsize len;    int i;    KNI_StartHandles(2);    KNI_DeclareHandle(linkArray);    KNI_DeclareHandle(linkObj);    targetIsolate = JVM_CurrentIsolateID();    KNI_GetParameterAsObject(1, linkArray);    len = KNI_GetArrayLength(linkArray);    if (portals != NULL) {        if (portals[targetIsolate].count > 0) {            rendezvous **rpp = portals[targetIsolate].rppa;            for (i = 0; i < len; i++) {                KNI_GetObjectArrayElement(linkArray, i, linkObj);                setNativePointer(linkObj, rpp[i]);                rp_incref(rpp[i]);            }        }        portal_free(&portals[targetIsolate]);    }    KNI_EndHandles();    KNI_ReturnVoid();}/** * Shutdowns Links subsystem. */void midp_links_shutdown() {    if (portals != NULL) {        int i;        for (i = 0; i < JVM_MaxIsolates(); i++) {            portal_free(&portals[i]);               }        pcsl_mem_free(portals);                portals = NULL;    }}#if ENABLE_I3_TEST#define LOGSIZE 100/** * A list of rendezvous pointers that have been freed. When the list fills up, * appending to it fails silently.  This is for debugging purposes only. Note * that every pointer in this list is invalid, since it has already been * freed! */static rendezvous *freelog[LOGSIZE];static int freeptr = 0;static void log_rp_free(rendezvous *rp) {    /* fprintf(stderr, ">> freeing 0x%x\n", (unsigned int)rp); */    if (freeptr < LOGSIZE) {        freelog[freeptr++] = rp;    }}/** * public static native int getRefCount(Link link); */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_midp_links_Utils_getRefCount(void){    int retval;    KNI_StartHandles(1);    KNI_DeclareHandle(linkObj);    KNI_GetParameterAsObject(1, linkObj);    if (KNI_IsNullHandle(linkObj)) {        retval = 0;    } else {        rendezvous *rp = getNativePointer(linkObj);        if (rp == NULL) {            retval = 0;        } else {            retval = rp->refcount;        }    }    KNI_EndHandles();    KNI_ReturnInt(retval);}/** * public static native int[] getFreedRendezvousPoints(); * * Returns an array of freed rendezvous points. Resets the list to empty after * it's called. */KNIEXPORT KNI_RETURNTYPE_OBJECTJava_com_sun_midp_links_Utils_getFreedRendezvousPoints(void){    int i;    KNI_StartHandles(1);    KNI_DeclareHandle(arrayReturn);    SNI_NewArray(SNI_INT_ARRAY, freeptr, arrayReturn);    /*     * Use SetRawArrayRegion? Maybe assumes too many things about     * int sizes.     */    for (i = 0; i < freeptr; i++) {        KNI_SetIntArrayElement(arrayReturn, i, (jint)freelog[i]);    }    freeptr = 0;    KNI_EndHandlesAndReturnObject(arrayReturn);}/** * Forces a GC to occur right now, running finalizers. *  * public static native void forceGC(); */KNIEXPORT KNI_RETURNTYPE_VOIDJava_com_sun_midp_links_Utils_forceGC(void){    (void)JVM_GarbageCollect(0, 0);    KNI_ReturnVoid();}#endif /* ENABLE_I3_TEST */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?