Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/demo/jvmti/versionCheck/versionCheck.c
38827 views
/*1* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6*7* - Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9*10* - Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* - Neither the name of Oracle nor the names of its15* contributors may be used to endorse or promote products derived16* from this software without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS19* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,20* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR21* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR22* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,23* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,24* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR25* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF26* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING27* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS28* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031/*32* This source code is provided to illustrate the usage of a given feature33* or technique and has been deliberately simplified. Additional steps34* required for a production-quality application, such as security checks,35* input validation and proper error handling, might not be present in36* this sample code.37*/383940#include <stdio.h>41#include <stdlib.h>42#include <string.h>4344#include "jni.h"45#include "jvmti.h"4647#include "agent_util.h"4849/* Create major.minor.micro version string */50static void51version_check(jint cver, jint rver)52{53jint cmajor, cminor, cmicro;54jint rmajor, rminor, rmicro;5556cmajor = (cver & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR;57cminor = (cver & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR;58cmicro = (cver & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO;59rmajor = (rver & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR;60rminor = (rver & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR;61rmicro = (rver & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO;62stdout_message("Compile Time JVMTI Version: %d.%d.%d (0x%08x)\n",63cmajor, cminor, cmicro, cver);64stdout_message("Run Time JVMTI Version: %d.%d.%d (0x%08x)\n",65rmajor, rminor, rmicro, rver);66if ( (cmajor > rmajor) || (cmajor == rmajor && cminor > rminor) ) {67fatal_error(68"ERROR: Compile Time JVMTI and Run Time JVMTI are incompatible\n");69}70}7172/* Callback for JVMTI_EVENT_VM_INIT */73static void JNICALL74vm_init(jvmtiEnv *jvmti, JNIEnv *env, jthread thread)75{76jvmtiError err;77jint runtime_version;7879/* The exact JVMTI version doesn't have to match, however this80* code demonstrates how you can check that the JVMTI version seen81* in the jvmti.h include file matches that being supplied at runtime82* by the VM.83*/84err = (*jvmti)->GetVersionNumber(jvmti, &runtime_version);85check_jvmti_error(jvmti, err, "get version number");86version_check(JVMTI_VERSION, runtime_version);87}8889/* Agent_OnLoad() is called first, we prepare for a VM_INIT event here. */90JNIEXPORT jint JNICALL91Agent_OnLoad(JavaVM *vm, char *options, void *reserved)92{93jint rc;94jvmtiError err;95jvmtiEventCallbacks callbacks;96jvmtiEnv *jvmti;9798/* Get JVMTI environment */99rc = (*vm)->GetEnv(vm, (void **)&jvmti, JVMTI_VERSION);100if (rc != JNI_OK) {101fatal_error("ERROR: Unable to create jvmtiEnv, GetEnv failed, error=%d\n", rc);102return -1;103}104105/* Set callbacks and enable event notifications */106memset(&callbacks, 0, sizeof(callbacks));107callbacks.VMInit = &vm_init;108err = (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks));109check_jvmti_error(jvmti, err, "set event callbacks");110err = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE,111JVMTI_EVENT_VM_INIT, NULL);112check_jvmti_error(jvmti, err, "set event notify");113return 0;114}115116/* Agent_OnUnload() is called last */117JNIEXPORT void JNICALL118Agent_OnUnload(JavaVM *vm)119{120}121122123