jvmpi_kaffe.c
来自「基于LWVCL开发的库」· C语言 代码 · 共 831 行 · 第 1/2 页
C
831 行
&jvmpi_data)) != NULL ) { sti = (stackTraceInfo *) buildStackTrace(jt == KTHREAD(current)() ? NULL : &KTHREAD(get_data)(jt)->topFrame); KTHREAD(resume)(jt, &jvmpi_data); } if( sti != NULL ) { int lpc; for( lpc = 0; (sti[lpc].meth != ENDOFSTACK) && (depth > 0); lpc++ ) { JVMPI_CallFrame *cf; Method *meth; if( (meth = sti[lpc].meth) == NULL ) continue; cf = &trace->frames[trace->num_frames]; cf->lineno = -1; if( meth->lines != NULL ) { uintp linepc = 0; unsigned int lpc2; for( lpc2 = 0; lpc2 < meth->lines->length; lpc2++ ) { if( (sti[lpc].pc >= meth->lines->entry[lpc2]. start_pc) && (linepc <= meth->lines->entry[lpc2]. start_pc) ) { cf->lineno = meth->lines-> entry[lpc2].line_nr; linepc = meth->lines-> entry[lpc2].start_pc; } } } cf->method_id = meth; trace->num_frames += 1; depth -= 1; } }}static jlong jvmpiGetCurrentThreadCpuTime(void){ jlong retval; retval = KTHREAD(get_usage)(KTHREAD(current)()); return( retval );}static jobjectID jvmpiGetMethodClass(jmethodID mid){ jobjectID retval; assert(mid != NULL); retval = ((Method *)mid)->class; return( retval );}static void *jvmpiGetThreadLocalStorage(JNIEnv *env_id){ void *retval = NULL; jthread_t jt; assert(env_id != NULL); if( (jt = KTHREAD(from_data)((threadData *)env_id, &jvmpi_data)) != NULL ) { retval = KTHREAD(get_data)(jt)->jvmpiData; KTHREAD(resume)(jt, &jvmpi_data); } return( retval );}static jobjectID jvmpiGetThreadObject(JNIEnv *env_id){ jobjectID retval = NULL; jthread_t jt; assert(env_id != NULL); if( (jt = KTHREAD(from_data)((threadData *)env_id, &jvmpi_data)) != NULL ) { retval = KTHREAD(get_data)(jt)->jlThread; KTHREAD(resume)(jt, &jvmpi_data); } return( retval );}static jint jvmpiGetThreadStatus(JNIEnv *env_id){ jint retval = 0; jthread_t jt; assert(env_id != NULL); if( (jt = KTHREAD(from_data)((threadData *)env_id, &jvmpi_data)) != NULL ) { if( KTHREAD(on_mutex)(jt) ) { retval = JVMPI_THREAD_MONITOR_WAIT; } else if( KTHREAD(on_condvar)(jt) ) { retval = JVMPI_THREAD_CONDVAR_WAIT; } else { switch( KTHREAD(get_status)(jt) ) { case THREAD_RUNNING: retval = JVMPI_THREAD_RUNNABLE; break; case THREAD_SUSPENDED: /* XXX Should be IO_WAIT or something. */ retval = JVMPI_THREAD_MONITOR_WAIT; break; } } if( KTHREAD(is_interrupted)(jt) ) { retval |= JVMPI_THREAD_INTERRUPTED; } KTHREAD(resume)(jt, &jvmpi_data); } else { retval = JVMPI_FAIL; } return( retval );}static void jvmpiProfilerExit(jint err_code){ KAFFEVM_EXIT(err_code);}static JVMPI_RawMonitor jvmpiRawMonitorCreate(char *lock_name){ JVMPI_RawMonitor retval; if( (retval = jmalloc(sizeof(struct _JVMPI_RawMonitor))) != NULL ) { initStaticLock(&retval->monitor); retval->lock_name = lock_name; } return( retval );}static void jvmpiRawMonitorDestroy(JVMPI_RawMonitor lock_id){ if( lock_id != NULL ) { destroyStaticLock(&lock_id->monitor); jfree(lock_id); }}static void jvmpiRawMonitorEnter(JVMPI_RawMonitor lock_id){ assert(lock_id != NULL); lockStaticMutex(&lock_id->monitor);}static void jvmpiRawMonitorExit(JVMPI_RawMonitor lock_id){ assert(lock_id != NULL); unlockStaticMutex(&lock_id->monitor);}static void jvmpiRawMonitorNotifyAll(JVMPI_RawMonitor lock_id){ assert(lock_id != NULL); broadcastStaticCond(&lock_id->monitor);}static void jvmpiRawMonitorWait(JVMPI_RawMonitor lock_id, jlong ms){ assert(lock_id != NULL); waitStaticCond(&lock_id->monitor, ms);}static jint jvmpiRequestEvent(jint event_type, void *arg){ jint retval = JVMPI_NOT_AVAILABLE; switch( event_type ) { case JVMPI_EVENT_HEAP_DUMP: break; case JVMPI_EVENT_MONITOR_DUMP: break; case JVMPI_EVENT_OBJECT_DUMP: break; case JVMPI_EVENT_CLASS_LOAD: { struct Hjava_lang_Class *cl; JVMPI_Method *jvmpi_methods; JVMPI_Field *jvmpi_fields; JVMPI_Event ev; retval = JVMPI_SUCCESS; cl = (struct Hjava_lang_Class *)arg; if (cl == NULL) return JVMPI_FAIL; jvmpi_methods = alloca(sizeof(JVMPI_Method) * CLASS_NMETHODS(cl)); jvmpi_fields = alloca(sizeof(JVMPI_Field) * (CLASS_NSFIELDS(cl) + CLASS_NFIELDS(cl))); ev.u.class_load.methods = jvmpi_methods; ev.u.class_load.statics = &jvmpi_fields[0]; ev.u.class_load.instances = &jvmpi_fields[CLASS_NSFIELDS(cl)]; jvmpiFillClassLoad(&ev, cl); ev.event_type |= JVMPI_REQUESTED_EVENT; jvmpiPostEvent(&ev); } break; case JVMPI_EVENT_THREAD_START: { struct Hjava_lang_VMThread *tid; JVMPI_Event ev; retval = JVMPI_SUCCESS; tid = (struct Hjava_lang_VMThread *)arg; if (tid == NULL) return JVMPI_FAIL; jvmpiFillThreadStart(&ev, tid); ev.event_type |= JVMPI_REQUESTED_EVENT; jvmpiPostEvent(&ev); gc_free(ev.u.thread_start.parent_name); gc_free(ev.u.thread_start.group_name); gc_free(ev.u.thread_start.thread_name); } break; case JVMPI_EVENT_OBJECT_ALLOC: { struct Hjava_lang_Object *obj; JVMPI_Event ev; obj = (struct Hjava_lang_Object *)arg; if (obj == NULL) return JVMPI_FAIL; jvmpiFillObjectAlloc(&ev, obj); ev.event_type |= JVMPI_REQUESTED_EVENT; jvmpiPostEvent(&ev); retval = JVMPI_SUCCESS; } break; } return( retval );}static void jvmpiResumeThread(JNIEnv *env){ jthread_t jt; assert(env != NULL); if( (jt = KTHREAD(from_data)((threadData *)env, &jvmpi_data)) != NULL ) { KTHREAD(resume)(jt, &jvmpi_data); KTHREAD(resume)(jt, &jvmpi_data); }}static void jvmpiResumeThreadList(jint reqCount, JNIEnv **reqList, jint *results){ int lpc; /* XXX */ for( lpc = 0; lpc < reqCount; lpc++ ) { jvmpiResumeThread(reqList[lpc]); results[lpc] = 0; }}static void jvmpiRunGC(void){ invokeGC();}static void jvmpiSetThreadLocalStorage(JNIEnv *env_id, void *ptr){ jthread_t jt; assert(env_id != NULL); if( (jt = KTHREAD(from_data)((threadData *)env_id, &jvmpi_data)) != NULL ) { KTHREAD(get_data)(jt)->jvmpiData = ptr; KTHREAD(resume)(jt, &jvmpi_data); }}static void jvmpiSuspendThread(JNIEnv *env_id){ jthread_t jt; jt = KTHREAD(from_data)((threadData *)env_id, &jvmpi_data); KTHREAD(clear_run)(jt);}static void jvmpiSuspendThreadList(jint reqCount, JNIEnv **reqList, jint *results){ int lpc; assert(reqCount > 0); assert(reqList != NULL); assert(results != NULL); /* XXX */ for( lpc = 0; lpc < reqCount; lpc++ ) { jvmpiSuspendThread(reqList[lpc]); results[lpc] = 0; }}static jboolean jvmpiThreadHasRun(JNIEnv *env){ jboolean retval = JNI_FALSE; jthread_t jt; if( (jt = KTHREAD(from_data)((threadData *)env, &jvmpi_data)) != NULL ) { retval = KTHREAD(has_run)(jt); KTHREAD(resume)(jt, &jvmpi_data); } return( retval );}static jobject jvmpijobjectID2jobject(jobjectID jid){ return( jid );}static jobjectID jvmpijobject2jobjectID(jobject j){ return( j );}jvmpi_kaffe_t jvmpi_data = { { 0 }, { JVMPI_VERSION_1_1, NULL, jvmpiEnableEvent, jvmpiDisableEvent, jvmpiRequestEvent, jvmpiGetCallTrace, jvmpiProfilerExit, jvmpiRawMonitorCreate, jvmpiRawMonitorEnter, jvmpiRawMonitorExit, jvmpiRawMonitorWait, jvmpiRawMonitorNotifyAll, jvmpiRawMonitorDestroy, jvmpiGetCurrentThreadCpuTime, jvmpiSuspendThread, jvmpiResumeThread, jvmpiGetThreadStatus, jvmpiThreadHasRun, jvmpiCreateSystemThread, jvmpiSetThreadLocalStorage, jvmpiGetThreadLocalStorage, jvmpiDisableGC, jvmpiEnableGC, jvmpiRunGC, jvmpiGetThreadObject, jvmpiGetMethodClass, jvmpijobjectID2jobject, jvmpijobject2jobjectID, jvmpiSuspendThreadList, jvmpiResumeThreadList }};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?