jvm.h (_Jv_JVMTI_Init): Declare.
* include/jvm.h (_Jv_JVMTI_Init): Declare. * jvmti.cc (_Jv_JVMTI_Init): New function. * prims.cc (_Jv_CreateJavaVM): Initialize JVMTI. * jvmti.cc (ILLEGAL_ARGUMENT): New macro. (_Jv_JVMTI_Allocate): Use ILLEGAL_ARUMENT. * jvmti.cc (_jvmtiEnvironments): New linked list of JVMTI environments. (FOREACH_ENVIRONMENT): New macro. (_envListLock): New object to act as synchronization lock for _jvmtiEnvironments. (_Jv_JVMTI_DisposeEnvironment): Check for NULL environment. Remove the environment from the list of known environments. (_Jv_GetJVMTIEnv): Add the new environment to the list of known environments. From-SVN: r116635
This commit is contained in:
parent
39ac097709
commit
e6789bef7a
@ -1,3 +1,22 @@
|
||||
2006-09-01 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* include/jvm.h (_Jv_JVMTI_Init): Declare.
|
||||
* jvmti.cc (_Jv_JVMTI_Init): New function.
|
||||
* prims.cc (_Jv_CreateJavaVM): Initialize JVMTI.
|
||||
|
||||
* jvmti.cc (ILLEGAL_ARGUMENT): New macro.
|
||||
(_Jv_JVMTI_Allocate): Use ILLEGAL_ARUMENT.
|
||||
|
||||
* jvmti.cc (_jvmtiEnvironments): New linked list of
|
||||
JVMTI environments.
|
||||
(FOREACH_ENVIRONMENT): New macro.
|
||||
(_envListLock): New object to act as synchronization lock
|
||||
for _jvmtiEnvironments.
|
||||
(_Jv_JVMTI_DisposeEnvironment): Check for NULL environment.
|
||||
Remove the environment from the list of known environments.
|
||||
(_Jv_GetJVMTIEnv): Add the new environment to the list
|
||||
of known environments.
|
||||
|
||||
2006-09-01 Gary Benson <gbenson@redhat.com>
|
||||
|
||||
* java/net/InetAddress.java (getLocalHost): Refactor to avoid
|
||||
|
@ -573,10 +573,13 @@ void _Jv_FreeJNIEnv (_Jv_JNIEnv *);
|
||||
struct _Jv_JavaVM;
|
||||
_Jv_JavaVM *_Jv_GetJavaVM ();
|
||||
|
||||
/* Get the JVMTI environment */
|
||||
/* Get a JVMTI environment */
|
||||
struct _Jv_JVMTIEnv;
|
||||
_Jv_JVMTIEnv *_Jv_GetJVMTIEnv (void);
|
||||
|
||||
/* Initialize JVMTI */
|
||||
extern void _Jv_JVMTI_Init (void);
|
||||
|
||||
// Some verification functions from defineclass.cc.
|
||||
bool _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig);
|
||||
bool _Jv_VerifyMethodSignature (_Jv_Utf8Const*sig);
|
||||
|
@ -22,6 +22,7 @@ details. */
|
||||
#include <gnu/gcj/runtime/BootClassLoader.h>
|
||||
#include <java/lang/Class.h>
|
||||
#include <java/lang/ClassLoader.h>
|
||||
#include <java/lang/Object.h>
|
||||
#include <java/lang/Thread.h>
|
||||
#include <java/lang/Throwable.h>
|
||||
#include <java/lang/VMClassLoader.h>
|
||||
@ -39,6 +40,20 @@ struct _Jv_rawMonitorID
|
||||
_Jv_ConditionVariable_t condition;
|
||||
};
|
||||
|
||||
/* A simple linked list of all JVMTI environments. Since
|
||||
events must be delivered to environments in the order
|
||||
in which the environments were created, new environments
|
||||
are added to the end of the list. */
|
||||
struct jvmti_env_list
|
||||
{
|
||||
jvmtiEnv *env;
|
||||
struct jvmti_env_list *next;
|
||||
};
|
||||
static struct jvmti_env_list *_jvmtiEnvironments = NULL;
|
||||
static java::lang::Object *_envListLock = NULL;
|
||||
#define FOREACH_ENVIRONMENT(Ele) \
|
||||
for (Ele = _jvmtiEnvironments; Ele != NULL; Ele = Ele->next)
|
||||
|
||||
// Some commonly-used checks
|
||||
|
||||
#define THREAD_DEFAULT_TO_CURRENT(jthread) \
|
||||
@ -58,6 +73,9 @@ struct _Jv_rawMonitorID
|
||||
#define NULL_CHECK(Ptr) \
|
||||
if (Ptr == NULL) return JVMTI_ERROR_NULL_POINTER;
|
||||
|
||||
#define ILLEGAL_ARGUMENT(Cond) \
|
||||
if ((Cond)) return JVMTI_ERROR_ILLEGAL_ARGUMENT
|
||||
|
||||
static jvmtiError JNICALL
|
||||
_Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
|
||||
{
|
||||
@ -195,8 +213,7 @@ static jvmtiError JNICALL
|
||||
_Jv_JVMTI_Allocate (MAYBE_UNUSED jvmtiEnv *env, jlong size,
|
||||
unsigned char **result)
|
||||
{
|
||||
if (size < 0)
|
||||
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
|
||||
ILLEGAL_ARGUMENT (size < 0);
|
||||
NULL_CHECK (result);
|
||||
if (size == 0)
|
||||
*result = NULL;
|
||||
@ -437,7 +454,32 @@ _Jv_JVMTI_GetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv *env,
|
||||
static jvmtiError JNICALL
|
||||
_Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env)
|
||||
{
|
||||
// All we need to do is free memory allocated by _Jv_GetJVMTIEnv
|
||||
NULL_CHECK (env);
|
||||
|
||||
if (_jvmtiEnvironments == NULL)
|
||||
return JVMTI_ERROR_INVALID_ENVIRONMENT;
|
||||
else
|
||||
{
|
||||
JvSynchronize dummy (_envListLock);
|
||||
if (_jvmtiEnvironments->env == env)
|
||||
{
|
||||
_Jv_Free (_jvmtiEnvironments);
|
||||
_jvmtiEnvironments = _jvmtiEnvironments->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct jvmti_env_list *e = _jvmtiEnvironments;
|
||||
while (e->next != NULL && e->next->env != env)
|
||||
e = e->next;
|
||||
if (e->next == NULL)
|
||||
return JVMTI_ERROR_INVALID_ENVIRONMENT;
|
||||
|
||||
struct jvmti_env_list *next = e->next->next;
|
||||
_Jv_Free (e->next);
|
||||
e->next = next;
|
||||
}
|
||||
}
|
||||
|
||||
_Jv_Free (env);
|
||||
return JVMTI_ERROR_NONE;
|
||||
}
|
||||
@ -750,5 +792,31 @@ _Jv_GetJVMTIEnv (void)
|
||||
_Jv_JVMTIEnv *env
|
||||
= (_Jv_JVMTIEnv *) _Jv_MallocUnchecked (sizeof (_Jv_JVMTIEnv));
|
||||
env->p = &_Jv_JVMTI_Interface;
|
||||
|
||||
{
|
||||
JvSynchronize dummy (_envListLock);
|
||||
struct jvmti_env_list *element
|
||||
= (struct jvmti_env_list *) _Jv_MallocUnchecked (sizeof (struct jvmti_env_list));
|
||||
element->env = env;
|
||||
element->next = NULL;
|
||||
|
||||
if (_jvmtiEnvironments == NULL)
|
||||
_jvmtiEnvironments = element;
|
||||
else
|
||||
{
|
||||
struct jvmti_env_list *e;
|
||||
for (e = _jvmtiEnvironments; e->next != NULL; e = e->next)
|
||||
;
|
||||
e->next = element;
|
||||
}
|
||||
}
|
||||
|
||||
return env;
|
||||
}
|
||||
|
||||
void
|
||||
_Jv_JVMTI_Init ()
|
||||
{
|
||||
_jvmtiEnvironments = NULL;
|
||||
_envListLock = new java::lang::Object ();
|
||||
}
|
||||
|
@ -1484,6 +1484,7 @@ _Jv_CreateJavaVM (JvVMInitArgs* vm_args)
|
||||
_Jv_platform_initialize ();
|
||||
|
||||
_Jv_JNI_Init ();
|
||||
_Jv_JVMTI_Init ();
|
||||
|
||||
_Jv_GCInitializeFinalizers (&::gnu::gcj::runtime::FinalizerThread::finalizerReady);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user