1 /*
2 * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * - Neither the name of Oracle nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
680 }
681 /* Add this item to the list */
682 next = get_token(next, ",=", gdata->exclude+used, maxlen);
683 /* Check for token scan error */
684 if ( next==NULL ) {
685 fatal_error("ERROR: exclude option error\n");
686 }
687 } else if ( token[0]!=0 ) {
688 /* We got a non-empty token and we don't know what it is. */
689 fatal_error("ERROR: Unknown option: %s\n", token);
690 }
691 /* Get the next token (returns NULL if there are no more) */
692 next = get_token(next, ",=", token, sizeof(token));
693 }
694 }
695
696 /* Agent_OnLoad: This is called immediately after the shared library is
697 * loaded. This is the first code executed.
698 */
699 JNIEXPORT jint JNICALL
700 Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
701 {
702 static GlobalAgentData data;
703 jvmtiEnv *jvmti;
704 jvmtiError error;
705 jint res;
706 jvmtiCapabilities capabilities;
707 jvmtiEventCallbacks callbacks;
708
709 /* Setup initial global agent data area
710 * Use of static/extern data should be handled carefully here.
711 * We need to make sure that we are able to cleanup after ourselves
712 * so anything allocated in this library needs to be freed in
713 * the Agent_OnUnload() function.
714 */
715 (void)memset((void*)&data, 0, sizeof(data));
716 gdata = &data;
717
718 /* First thing we need to do is get the jvmtiEnv* or JVMTI environment */
719 res = (*vm)->GetEnv(vm, (void **)&jvmti, JVMTI_VERSION_1);
720 if (res != JNI_OK) {
778 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, (jthread)NULL);
779 check_jvmti_error(jvmti, error, "Cannot set event notification");
780
781 /* Here we create a raw monitor for our use in this agent to
782 * protect critical sections of code.
783 */
784 error = (*jvmti)->CreateRawMonitor(jvmti, "agent data", &(gdata->lock));
785 check_jvmti_error(jvmti, error, "Cannot create raw monitor");
786
787 /* Add demo jar file to boot classpath */
788 add_demo_jar_to_bootclasspath(jvmti, "mtrace");
789
790 /* We return JNI_OK to signify success */
791 return JNI_OK;
792 }
793
794 /* Agent_OnUnload: This is called immediately before the shared library is
795 * unloaded. This is the last code executed.
796 */
797 JNIEXPORT void JNICALL
798 Agent_OnUnload(JavaVM *vm)
799 {
800 /* Make sure all malloc/calloc/strdup space is freed */
801 if ( gdata->include != NULL ) {
802 (void)free((void*)gdata->include);
803 gdata->include = NULL;
804 }
805 if ( gdata->exclude != NULL ) {
806 (void)free((void*)gdata->exclude);
807 gdata->exclude = NULL;
808 }
809 if ( gdata->classes != NULL ) {
810 int cnum;
811
812 for ( cnum = 0 ; cnum < gdata->ccount ; cnum++ ) {
813 ClassInfo *cp;
814
815 cp = gdata->classes + cnum;
816 (void)free((void*)cp->name);
817 if ( cp->mcount > 0 ) {
818 int mnum;
|
1 /*
2 * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * - Neither the name of Oracle nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
680 }
681 /* Add this item to the list */
682 next = get_token(next, ",=", gdata->exclude+used, maxlen);
683 /* Check for token scan error */
684 if ( next==NULL ) {
685 fatal_error("ERROR: exclude option error\n");
686 }
687 } else if ( token[0]!=0 ) {
688 /* We got a non-empty token and we don't know what it is. */
689 fatal_error("ERROR: Unknown option: %s\n", token);
690 }
691 /* Get the next token (returns NULL if there are no more) */
692 next = get_token(next, ",=", token, sizeof(token));
693 }
694 }
695
696 /* Agent_OnLoad: This is called immediately after the shared library is
697 * loaded. This is the first code executed.
698 */
699 JNIEXPORT jint JNICALL
700 DEF_Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
701 {
702 static GlobalAgentData data;
703 jvmtiEnv *jvmti;
704 jvmtiError error;
705 jint res;
706 jvmtiCapabilities capabilities;
707 jvmtiEventCallbacks callbacks;
708
709 /* Setup initial global agent data area
710 * Use of static/extern data should be handled carefully here.
711 * We need to make sure that we are able to cleanup after ourselves
712 * so anything allocated in this library needs to be freed in
713 * the Agent_OnUnload() function.
714 */
715 (void)memset((void*)&data, 0, sizeof(data));
716 gdata = &data;
717
718 /* First thing we need to do is get the jvmtiEnv* or JVMTI environment */
719 res = (*vm)->GetEnv(vm, (void **)&jvmti, JVMTI_VERSION_1);
720 if (res != JNI_OK) {
778 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, (jthread)NULL);
779 check_jvmti_error(jvmti, error, "Cannot set event notification");
780
781 /* Here we create a raw monitor for our use in this agent to
782 * protect critical sections of code.
783 */
784 error = (*jvmti)->CreateRawMonitor(jvmti, "agent data", &(gdata->lock));
785 check_jvmti_error(jvmti, error, "Cannot create raw monitor");
786
787 /* Add demo jar file to boot classpath */
788 add_demo_jar_to_bootclasspath(jvmti, "mtrace");
789
790 /* We return JNI_OK to signify success */
791 return JNI_OK;
792 }
793
794 /* Agent_OnUnload: This is called immediately before the shared library is
795 * unloaded. This is the last code executed.
796 */
797 JNIEXPORT void JNICALL
798 DEF_Agent_OnUnload(JavaVM *vm)
799 {
800 /* Make sure all malloc/calloc/strdup space is freed */
801 if ( gdata->include != NULL ) {
802 (void)free((void*)gdata->include);
803 gdata->include = NULL;
804 }
805 if ( gdata->exclude != NULL ) {
806 (void)free((void*)gdata->exclude);
807 gdata->exclude = NULL;
808 }
809 if ( gdata->classes != NULL ) {
810 int cnum;
811
812 for ( cnum = 0 ; cnum < gdata->ccount ; cnum++ ) {
813 ClassInfo *cp;
814
815 cp = gdata->classes + cnum;
816 (void)free((void*)cp->name);
817 if ( cp->mcount > 0 ) {
818 int mnum;
|