Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClearFieldModificationWatch/clrfmodw001/clrfmodw001.cpp
40955 views
/*1* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include <stdio.h>24#include <string.h>25#include "jvmti.h"26#include "agent_common.h"27#include "JVMTITools.h"2829extern "C" {303132#define PASSED 033#define STATUS_FAILED 23435typedef struct {36const char *klass;37const char *name;38const char *sig;39int stat;40jfieldID fid;41} field;4243static jvmtiEnv *jvmti;44static jvmtiEventCallbacks callbacks;45static jvmtiCapabilities caps;46static jint result = PASSED;47static jfieldID thrown_fid = NULL;48static field fields[] = {49{ "nsk/jvmti/ClearFieldModificationWatch/clrfmodw001", "fld0", "I", 0, NULL },50{ "nsk/jvmti/ClearFieldModificationWatch/clrfmodw001", "fld1", "I", 1, NULL },51{ "nsk/jvmti/ClearFieldModificationWatch/clrfmodw001", "fld2",52"Lnsk/jvmti/ClearFieldModificationWatch/clrfmodw001a;", 0, NULL },53{ "nsk/jvmti/ClearFieldModificationWatch/clrfmodw001a", "fld3", "[I", 0, NULL },54{ "nsk/jvmti/ClearFieldModificationWatch/clrfmodw001b", "fld4", "F", 0, NULL },55};5657void switchWatch(JNIEnv *env, jint ind, jboolean on) {58jvmtiError err;59jclass cls;60field fld = fields[ind];61const char *msg;6263cls = env->FindClass(fld.klass);64if (fld.fid == NULL) {65if (fld.stat) {66fields[ind].fid = env->GetStaticFieldID(cls, fld.name, fld.sig);67} else {68fields[ind].fid = env->GetFieldID(cls, fld.name, fld.sig);69}70}7172if (on == JNI_TRUE) {73msg = "Set";74err = jvmti->SetFieldModificationWatch(cls, fields[ind].fid);75} else {76msg = "Clear";77err = jvmti->ClearFieldModificationWatch(cls, fields[ind].fid);78}79if (err == JVMTI_ERROR_MUST_POSSESS_CAPABILITY &&80!caps.can_generate_field_modification_events) {81/* Ok, it's expected */82} else if (err != JVMTI_ERROR_NONE) {83printf("(%sFieldModificationWatch#%d) unexpected error: %s (%d)\n",84msg, ind, TranslateError(err), err);85result = STATUS_FAILED;86}87}8889void JNICALL FieldModification(jvmtiEnv *jvmti_env, JNIEnv *env,90jthread thd, jmethodID mid, jlocation loc, jclass field_klass, jobject obj,91jfieldID field, char sig, jvalue new_value) {92thrown_fid = field;93}9495#ifdef STATIC_BUILD96JNIEXPORT jint JNICALL Agent_OnLoad_clrfmodw001(JavaVM *jvm, char *options, void *reserved) {97return Agent_Initialize(jvm, options, reserved);98}99JNIEXPORT jint JNICALL Agent_OnAttach_clrfmodw001(JavaVM *jvm, char *options, void *reserved) {100return Agent_Initialize(jvm, options, reserved);101}102JNIEXPORT jint JNI_OnLoad_clrfmodw001(JavaVM *jvm, char *options, void *reserved) {103return JNI_VERSION_1_8;104}105#endif106jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {107jint res;108jvmtiError err;109110res = jvm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_1);111if (res != JNI_OK || jvmti == NULL) {112printf("Wrong result of a valid call to GetEnv !\n");113return JNI_ERR;114}115116err = jvmti->GetPotentialCapabilities(&caps);117if (err != JVMTI_ERROR_NONE) {118printf("(GetPotentialCapabilities) unexpected error: %s (%d)\n",119TranslateError(err), err);120return JNI_ERR;121}122123err = jvmti->AddCapabilities(&caps);124if (err != JVMTI_ERROR_NONE) {125printf("(AddCapabilities) unexpected error: %s (%d)\n",126TranslateError(err), err);127return JNI_ERR;128}129130err = jvmti->GetCapabilities(&caps);131if (err != JVMTI_ERROR_NONE) {132printf("(GetCapabilities) unexpected error: %s (%d)\n",133TranslateError(err), err);134return JNI_ERR;135}136137if (caps.can_generate_field_modification_events) {138callbacks.FieldModification = &FieldModification;139err = jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));140if (err != JVMTI_ERROR_NONE) {141printf("(SetEventCallbacks) unexpected error: %s (%d)\n",142TranslateError(err), err);143return JNI_ERR;144}145146err = jvmti->SetEventNotificationMode(JVMTI_ENABLE,147JVMTI_EVENT_FIELD_MODIFICATION, NULL);148if (err != JVMTI_ERROR_NONE) {149printf("Failed to enable JVMTI_EVENT_FIELD_MODIFICATION: %s (%d)\n",150TranslateError(err), err);151return JNI_ERR;152}153} else {154printf("Warning: FieldModification watch is not implemented\n");155}156157return JNI_OK;158}159160JNIEXPORT void JNICALL161Java_nsk_jvmti_ClearFieldModificationWatch_clrfmodw001_setWatch(JNIEnv *env, jclass cls, jint fld_ind) {162switchWatch(env, fld_ind, JNI_TRUE);163}164165JNIEXPORT void JNICALL166Java_nsk_jvmti_ClearFieldModificationWatch_clrfmodw001_clearWatch(JNIEnv *env, jclass cls, jint fld_ind) {167switchWatch(env, fld_ind, JNI_FALSE);168}169170JNIEXPORT void JNICALL Java_nsk_jvmti_ClearFieldModificationWatch_clrfmodw001_touchfld0(JNIEnv *env, jobject obj) {171env->SetIntField(obj, fields[0].fid, 2000);172}173174JNIEXPORT void JNICALL175Java_nsk_jvmti_ClearFieldModificationWatch_clrfmodw001_check(JNIEnv *env, jclass cls, jint fld_ind, jboolean flag) {176if (caps.can_generate_field_modification_events) {177if (flag == JNI_FALSE && thrown_fid != NULL) {178result = STATUS_FAILED;179printf("(Field %d) ", fld_ind);180printf("FieldModification event without modification watch set\n");181} else if (flag == JNI_TRUE && thrown_fid != fields[fld_ind].fid) {182result = STATUS_FAILED;183printf("(Field %d) thrown field ID expected: 0x%p, got: 0x%p\n",184fld_ind, fields[fld_ind].fid, thrown_fid);185}186thrown_fid = NULL;187}188}189190JNIEXPORT jint JNICALL Java_nsk_jvmti_ClearFieldModificationWatch_clrfmodw001_getRes(JNIEnv *env, jclass cls) {191return result;192}193194}195196197