Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AddCapabilities/addcaps003/addcaps003.cpp
40955 views
/*1* Copyright (c) 2007, 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*/22#include <stdlib.h>23#include <string.h>24#include "jvmti.h"25#include "agent_common.h"26#include "jni_tools.h"27#include "jvmti_tools.h"2829extern "C" {3031/* ============================================================================= */3233static jlong timeout = 0;3435#define STATUS_FAIL 973637#define EVENTS_COUNT 23839static jvmtiEvent events[EVENTS_COUNT] = {40JVMTI_EVENT_VM_INIT,41JVMTI_EVENT_VM_DEATH42};4344static jvmtiCapabilities initCaps;4546/* ============================================================================= */4748/**49* Get and check current capabilities.50* @returns NSK_FALSE if any error occured.51*/52static int checkCapabilities(jvmtiEnv* jvmti, jvmtiCapabilities* initCaps, const char where[]) {53int success = NSK_TRUE;54jvmtiCapabilities caps;5556memset(&caps, 0, sizeof(jvmtiCapabilities));5758NSK_DISPLAY0("GetCapabilities() for current JVMTI env\n");59if (!NSK_JVMTI_VERIFY(jvmti->GetCapabilities(&caps))) {60return NSK_FALSE;61}6263return success;64}6566/**67* Add given capabilities list.68* @returns NSK_FALSE if any error occured.69*/70static int addCapabilities(jvmtiEnv* jvmti, jvmtiCapabilities* caps, const char where[]) {71NSK_DISPLAY0("AddCapabilities() for current JVMTI env\n");72if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(caps))) {73return NSK_FALSE;74}75NSK_DISPLAY0(" ... set\n");7677return NSK_TRUE;78}7980/**81* Get potential capabilities to the given list.82* @returns NSK_FALSE if any error occured.83*/84static int getPotentialCapabilities(jvmtiEnv* jvmti, jvmtiCapabilities* caps) {85NSK_DISPLAY0("GetPotentialCapabilities() for current JVMTI env\n");86if (!NSK_JVMTI_VERIFY(jvmti->GetPotentialCapabilities(caps))) {87return NSK_FALSE;88}8990return NSK_TRUE;91}9293/* ============================================================================= */9495/** Agent algorithm. */96static void JNICALL97agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {98NSK_DISPLAY0("Wait for debugee to become ready\n");99if (!nsk_jvmti_waitForSync(timeout))100return;101102NSK_DISPLAY0(">>> Testcase #3: Check capabilities in agent thread\n");103if (!checkCapabilities(jvmti, &initCaps, "agent thread")) {104nsk_jvmti_setFailStatus();105}106107NSK_DISPLAY0("Let debugee to finish\n");108if (!nsk_jvmti_resumeSync())109return;110}111112/* ============================================================================= */113114/**115* Callback for VM_INIT event.116*/117JNIEXPORT void JNICALL118callbackVMInit(jvmtiEnv* jvmti, JNIEnv* jni, jthread thread) {119120NSK_DISPLAY0(">>> Testcase #2: Check capabilities in VM_INIT callback\n");121if (!checkCapabilities(jvmti, &initCaps, "VM_INIT callback")) {122nsk_jvmti_setFailStatus();123}124125}126127/**128* Callback for VM_DEATH event.129*/130JNIEXPORT void JNICALL131callbackVMDeath(jvmtiEnv* jvmti, JNIEnv* jni) {132int success = NSK_TRUE;133134NSK_DISPLAY0(">>> Testcase #4: Check capabilities in VM_DEATH callback\n");135success = checkCapabilities(jvmti, &initCaps, "VM_DEATH callback");136137NSK_DISPLAY1("Disable events: %d events\n", EVENTS_COUNT);138if (!nsk_jvmti_enableEvents(JVMTI_DISABLE, EVENTS_COUNT, events, NULL)) {139success = NSK_FALSE;140} else {141NSK_DISPLAY0(" ... disabled\n");142}143144if (!success) {145NSK_DISPLAY1("Exit with FAIL exit status: %d\n", STATUS_FAIL);146NSK_BEFORE_TRACE(exit(STATUS_FAIL));147}148}149150/* ============================================================================= */151152/** Agent library initialization. */153#ifdef STATIC_BUILD154JNIEXPORT jint JNICALL Agent_OnLoad_addcaps003(JavaVM *jvm, char *options, void *reserved) {155return Agent_Initialize(jvm, options, reserved);156}157JNIEXPORT jint JNICALL Agent_OnAttach_addcaps003(JavaVM *jvm, char *options, void *reserved) {158return Agent_Initialize(jvm, options, reserved);159}160JNIEXPORT jint JNI_OnLoad_addcaps003(JavaVM *jvm, char *options, void *reserved) {161return JNI_VERSION_1_8;162}163#endif164jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {165jvmtiEnv* jvmti = NULL;166167if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))168return JNI_ERR;169170timeout = nsk_jvmti_getWaitTime() * 60 * 1000;171172if (!NSK_VERIFY((jvmti =173nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))174return JNI_ERR;175176{177jvmtiEventCallbacks eventCallbacks;178179memset(&eventCallbacks, 0, sizeof(eventCallbacks));180eventCallbacks.VMInit = callbackVMInit;181eventCallbacks.VMDeath = callbackVMDeath;182if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&eventCallbacks, sizeof(eventCallbacks)))) {183return JNI_ERR;184}185186}187188if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))189return JNI_ERR;190191memset(&initCaps, 0, sizeof(jvmtiCapabilities));192if (!getPotentialCapabilities(jvmti, &initCaps)) {193return JNI_ERR;194}195196NSK_DISPLAY0(">>> Testcase #0: Add all potential capabilities in Agent_OnLoad()\n");197if (!addCapabilities(jvmti, &initCaps, "Agent_OnLoad()")) {198nsk_jvmti_setFailStatus();199}200201NSK_DISPLAY0(">>> Testcase #1: Check capabilities in Agent_OnLoad()\n");202if (!checkCapabilities(jvmti, &initCaps, "Agent_OnLoad()")) {203nsk_jvmti_setFailStatus();204}205206NSK_DISPLAY1("Enable events: %d events\n", EVENTS_COUNT);207if (nsk_jvmti_enableEvents(JVMTI_ENABLE, EVENTS_COUNT, events, NULL)) {208NSK_DISPLAY0(" ... enabled\n");209}210211return JNI_OK;212}213214/* ============================================================================= */215216}217218219