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 + -
显示快捷键?