| /* |
| * 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" |
| |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| |
| /******************** 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. <b>pathToNewByteCode</b> 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 <b>nsk_jvmti_setFailStatus()</b> 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 |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |