/* * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #ifndef NSK_JVMTI_TOOLS_DEFINED #define NSK_JVMTI_TOOLS_DEFINED /*************************************************************/ #include "jvmti.h" /*************************************************************/ #include "nsk_tools.h" #include "jni_tools.h" #include "JVMTITools.h" extern "C" { /******************** Diagnostics errors *********************/ /** * Call JVMTI function in action, check error code to be * JVMTI_ERROR_NONE and complain error otherwise. * Also trace action execution if tracing mode is on. */ #define NSK_JVMTI_VERIFY(action) \ (nsk_ltrace(NSK_TRACE_BEFORE,__FILE__,__LINE__,"%s\n",#action), \ nsk_jvmti_lverify(NSK_TRUE,action,JVMTI_ERROR_NONE, \ __FILE__,__LINE__,"%s\n",#action)) /** * Call JVMTI function in action, check error code to be * not JVMTI_ERROR_NONE and complain error otherwise. * Also trace action execution if tracing mode is on. */ #define NSK_JVMTI_VERIFY_NEGATIVE(action) \ (nsk_ltrace(NSK_TRACE_BEFORE,__FILE__,__LINE__,"%s\n",#action), \ nsk_jvmti_lverify(NSK_FALSE,action,JVMTI_ERROR_NONE, \ __FILE__,__LINE__,"%s\n",#action)) /** * Call JVMTI function in action, check error code to be * equal to 'code' and complain error otherwise. * Also trace action execution if tracing mode is on. */ #define NSK_JVMTI_VERIFY_CODE(code, action) \ (nsk_ltrace(NSK_TRACE_BEFORE,__FILE__,__LINE__,"%s\n",#action), \ nsk_jvmti_lverify(NSK_TRUE,action,code,__FILE__,__LINE__,"%s\n",#action)) /********************* Initialization ************************/ /** * Initialize framework and setup command line options for the JVMTI test. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_parseOptions(const char options[]); /** * Creates JVMTI environment for the JVMTI test. * If something fails, complains an error and returns NULL. */ jvmtiEnv* nsk_jvmti_createJVMTIEnv(JavaVM* jvm, void* reserved); /** * Register function to be run in agent thread. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_setAgentProc(jvmtiStartFunction proc, void* arg); /** * Initialize multiple agent */ int nsk_jvmti_init_MA(jvmtiEventCallbacks* callbacks); /********************** Agent thread *************************/ /** * Returns thread object associated with agent thread.. * If something fails, complains an error and returns NULL. */ jthread nsk_jvmti_getAgentThread(); /** * Returns JNI environment constructed for agent thread. * If something fails, complains an error and returns NULL. */ JNIEnv* nsk_jvmti_getAgentJNIEnv(); /** * Returns JVMTI environment constructed for agent. * If something fails, complains an error and returns NULL. */ jvmtiEnv* nsk_jvmti_getAgentJVMTIEnv(); /** * Waits for next synchronization point with debuggee class, * Then synchronizes current status and pauses debuggee thread. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_waitForSync(jlong timeout); /** * Allow debuggee thread to continue execution after pausing on synchronization. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_resumeSync(); /** * Sleep current thread for given timeout in milliseconds. */ void nsk_jvmti_sleep(jlong timeout); /** * Reset agent data to prepare for another run. */ void nsk_jvmti_resetAgentData(); /*********************** Agent status ************************/ #define NSK_STATUS_PASSED 0 #define NSK_STATUS_FAILED 2 #define NSK_STATUS_BASE 95 /** * Sets NSK_STATUS_FAILED as current agent status. */ void nsk_jvmti_setFailStatus(); /** * Returns 1 (NSK_TRUE) is current agent status is not NSK_STATUS_PASSED. * Returns 0 (NSK_FALSE) otherwise. */ int nsk_jvmti_isFailStatus(); /** * Returns current agent status. */ jint nsk_jvmti_getStatus(); /********************* Classes and threads ******************/ /** * Finds first class with given signatire among loaded classes. * If no class found or something fails, complains an error and returns NULL. * On success creates and returns global reference to the found class. */ jclass nsk_jvmti_classBySignature(const char signature[]); /** * Finds first thread with given name among alive threads. * If no thread found or something fails, complains an error and returns NULL. * On success creates and returns global reference to the found thread. */ jthread nsk_jvmti_threadByName(const char name[]); /******************* Breakpoints and locations ***************/ /** * Requests all capabilities needed for finding line location. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_addLocationCapabilities(); /** * Requests all capabilities needed for setting breakpoints. * If something fails, complains an error and returns 0 (NSK_FALSE). * On success returns 1 (NSK_TRUE). */ int nsk_jvmti_addBreakpointCapabilities(); #define NSK_JVMTI_INVALID_JLOCATION -2 /** * Returns jlocation for given method line. * If something fails, complains an error and returns NSK_JVMTI_INVALID_JLOCATION. */ jlocation nsk_jvmti_getLineLocation(jclass cls, jmethodID method, int line); /** * Sets breakpoint to the given method line and return breakpoint location. * If something fails, complains an error and returns NSK_JVMTI_INVALID_JLOCATION. */ jlocation nsk_jvmti_setLineBreakpoint(jclass cls, jmethodID method, int line); /** * Removes breakpoint from the given method line and return breakpoint location. * If something fails, complains an error and returns NSK_JVMTI_INVALID_JLOCATION. */ jlocation nsk_jvmti_clearLineBreakpoint(jclass cls, jmethodID method, int line); /********************* Events management *********************/ /** * Enables or disables all events of given list for given thread or NULL. * If something fails, complains an error and returns 0 (NSK_FALSE). */ int nsk_jvmti_enableEvents(jvmtiEventMode enable, int size, jvmtiEvent list[], jthread thread); /** * Returns: * NSK_TRUE if given event is of optional functionality. * NSK_FALSE if given event is of required functionality. */ int nsk_jvmti_isOptionalEvent(jvmtiEvent event); /** * Shows possessed capabilities */ void nsk_jvmti_showPossessedCapabilities(jvmtiEnv *jvmti); /** * This method enables a single event * Return NSK_TRUE when on success and NSK_FALSE on failure. */ int nsk_jvmti_enableNotification(jvmtiEnv *jvmti, jvmtiEvent event, jthread thread); /** * This method disables a single event * Return NSK_TRUE when on success and NSK_FALSE on failure. */ int nsk_jvmti_disableNotification(jvmtiEnv *jvmti, jvmtiEvent event, jthread thread); /******************** Access test options ********************/ /** * Returns value of given option name; or NULL if no such option found. * If search name is NULL then complains an error and returns NULL. */ const char* nsk_jvmti_findOptionValue(const char name[]); /** * Returns string value of given option; or defaultValue if no such option found. * If options is specified but has empty value then complains an error and returns NULL. */ const char* nsk_jvmti_findOptionStringValue(const char name[], const char* defaultValue); /** * Returns integer value of given option; or defaultValue if no such option found. * If options is specified but has no integer value then complains an error and returns -1. */ int nsk_jvmti_findOptionIntValue(const char name[], int defaultValue); /** * Returns number of parsed options. */ int nsk_jvmti_getOptionsCount(); /** * Returns name of i-th parsed option. * If no such option then complains an error and returns NULL. */ const char* nsk_jvmti_getOptionName(int i); /** * Returns value of i-th parsed option. * If no such option then complains an error and returns NULL. */ const char* nsk_jvmti_getOptionValue(int i); /******************** Access system options ******************/ /** * Returns value of -waittime option or default value if not specified. */ int nsk_jvmti_getWaitTime(); /** * Sets specified waittime value. */ void nsk_jvmti_setWaitTime(int waittime); /*************************************************************/ /** * If positive, assert jvmtiError is equal to expected; or * if !positive, assert jvmtiError is not equal to expected. * Assert means: complain if the assertion is false. * Return the assertion value, either NSK_TRUE or NSK_FALSE. * Anyway, trace if "nsk_tools" mode is verbose. */ int nsk_jvmti_lverify(int positive, jvmtiError code, jvmtiError expected, const char file[], int line, const char format[], ...); /************************************************************/ /** * This method could be useful for hotswap testcases developed under.` * nsk/jvmti/scenarios/hotswap. * */ /** * This method will try to redefine the class (classToRedefine) by loading * physical file. pathToNewByteCode option which is passed * on OnLoad Phase also used. * * So This method will do a file read pathToByteCode+fileName+.class (total path). * Constrcuts a class objects and does a redefine of the class. * On successfull redefine this method will return eaither JNI_TRUE or JNI_FALSE * * Hint:: * 1) * If there are many redefine on same testcase, then please try to use * integer value (newclass00, newclass01, newclass02 , ....) way. * * 2) When you compile these please do keep, a metatag on testcase as * # build : native classes classes.redef * * 3) When you do build these classes are psysically located in build as. * * TESTBASE/bin/newclass0* directory. * eg: for nks/jvmti/scenarios/hotswap/HS204/hs204t001 you should see * TESTBASE/bin/newclass0* /nsk/hotswap/HS204/hs204t001/MyClass.class * */ int nsk_jvmti_redefineClass(jvmtiEnv * jvmti, jclass classToRedefine, const char * fileName); /** * changed this signature with Ekaterina's suggestion to move. * */ void nsk_jvmti_getFileName(int redefineCnt, const char * dir, char * buf, size_t bufsize); /** * This method sets agent status to failed, This would enables native agent to set its status. * There is nsk_jvmti_setFailStatus() method which is in sync with debugge/debugger combination. * For non-debugger agents, this method can be used. There is java wrapper for this status, * defined in java nsk.share.jvmti.RedefineAgent class as boolean : agentStatus(). * */ void nsk_jvmti_agentFailed(); int isThreadExpected(jvmtiEnv *jvmti, jthread thread); jint createRawMonitor(jvmtiEnv *env, const char *name, jrawMonitorID *monitor); void exitOnError(jvmtiError error); /** Wrappers for corresponded JVMTI functions check error code and force exit on error */ void rawMonitorEnter(jvmtiEnv *env, jrawMonitorID monitor); void rawMonitorExit(jvmtiEnv *env, jrawMonitorID monitor); void rawMonitorNotify(jvmtiEnv *env, jrawMonitorID monitor); void rawMonitorWait(jvmtiEnv *env, jrawMonitorID monitor, jlong millis); void getPhase(jvmtiEnv *env, jvmtiPhase *phase); /*******************************************************************/ #if (defined(WIN32) || defined(_WIN32)) #define snprintf _snprintf #endif } #endif