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