void assertTLSValue( jvmtiEnv * jvmtienv, jthread thread, const void * expected) { jvmtiError error; void * test = (void *) 0x99999999; /* now check if we do a fetch we get what we wrote */ error = (*jvmtienv)->GetThreadLocalStorage( jvmtienv, thread, &test); jplis_assert(error == JVMTI_ERROR_NONE); jplis_assert(test == expected); }
jboolean tryToAcquireReentrancyToken( jvmtiEnv * jvmtienv, jthread thread) { jboolean result = JNI_FALSE; jvmtiError error = JVMTI_ERROR_NONE; void * storedValue = NULL; error = (*jvmtienv)->GetThreadLocalStorage( jvmtienv, thread, &storedValue); jplis_assert(error == JVMTI_ERROR_NONE); if ( error == JVMTI_ERROR_NONE ) { /* if this thread is already inside, just return false and short-circuit */ if ( storedValue == JPLIS_CURRENTLY_INSIDE_TOKEN ) { result = JNI_FALSE; } else { /* stuff in the sentinel and return true */ #if JPLISASSERT_ENABLEASSERTIONS assertTLSValue( jvmtienv, thread, JPLIS_CURRENTLY_OUTSIDE_TOKEN); #endif error = confirmingTLSSet ( jvmtienv, thread, JPLIS_CURRENTLY_INSIDE_TOKEN); jplis_assert(error == JVMTI_ERROR_NONE); if ( error != JVMTI_ERROR_NONE ) { result = JNI_FALSE; } else { result = JNI_TRUE; } } } return result; }
/** * Returns whether the passed exception is an instance of the given classname * Clears any JNI exceptions before returning */ jboolean isInstanceofClassName( JNIEnv * jnienv, jobject instance, const char * className) { jboolean isInstanceof = JNI_FALSE; jboolean errorOutstanding = JNI_FALSE; jclass classHandle = NULL; jplis_assert(isSafeForJNICalls(jnienv)); /* get an instance of unchecked exception for instanceof comparison */ classHandle = (*jnienv)->FindClass(jnienv, className); errorOutstanding = checkForAndClearThrowable(jnienv); jplis_assert(!errorOutstanding); if (!errorOutstanding) { isInstanceof = (*jnienv)->IsInstanceOf(jnienv, instance, classHandle); errorOutstanding = checkForAndClearThrowable(jnienv); jplis_assert(!errorOutstanding); } jplis_assert(isSafeForJNICalls(jnienv)); return isInstanceof; }
void * allocate(jvmtiEnv * jvmtienv, size_t bytecount) { void * resultBuffer = NULL; jvmtiError error = JVMTI_ERROR_NONE; error = (*jvmtienv)->Allocate(jvmtienv, bytecount, (unsigned char**) &resultBuffer); /* may be called from any phase */ jplis_assert(error == JVMTI_ERROR_NONE); if ( error != JVMTI_ERROR_NONE ) { resultBuffer = NULL; } return resultBuffer; }
void releaseReentrancyToken( jvmtiEnv * jvmtienv, jthread thread) { jvmtiError error = JVMTI_ERROR_NONE; /* assert we hold the token */ #if JPLISASSERT_ENABLEASSERTIONS assertTLSValue( jvmtienv, thread, JPLIS_CURRENTLY_INSIDE_TOKEN); #endif error = confirmingTLSSet( jvmtienv, thread, JPLIS_CURRENTLY_OUTSIDE_TOKEN); jplis_assert(error == JVMTI_ERROR_NONE); }