Top


定義場所(file name)

hotspot/src/share/vm/prims/jvmtiImpl.cpp

名前(function name)

void JvmtiDeferredEvent::post() {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(ServiceThread::is_service_thread(Thread::current()),
             "Service thread must post enqueued events");

  {- -------------------------------------------
  (1) 生成されたイベントの種別に応じて, 適切な通知用メソッドを呼び出す.

      * TYPE_COMPILED_METHOD_LOAD の場合:
        JvmtiExport::post_compiled_method_load() を呼び出す.
        (ついでに, 通知が終わったので
         JvmtiDeferredEvent::compiled_method_load_event() でロックした nmethod をアンロックしている)

      * TYPE_COMPILED_METHOD_UNLOAD の場合:
        JvmtiExport::post_compiled_method_unload() を呼び出す.
        (ついでに, 通知が終わったので
         JvmtiDeferredEvent::compiled_method_unload_event() でロックした nmethod をアンロックしている)

      * TYPE_DYNAMIC_CODE_GENERATED の場合:
        JvmtiExport::post_dynamic_code_generated_internal() を呼び出す.
        (ついでに, JvmtiDeferredEvent::dynamic_code_generated_event() 内の 
         os::strdup() で確保したメモリを os::free() で開放している.
         ただし, そもそも os::strdup() が失敗していた場合には開放処理は行っていない.)
      ---------------------------------------- -}

      switch(_type) {
        case TYPE_COMPILED_METHOD_LOAD: {
          nmethod* nm = _event_data.compiled_method_load;
          JvmtiExport::post_compiled_method_load(nm);
          // done with the deferred event so unlock the nmethod
          nmethodLocker::unlock_nmethod(nm);
          break;
        }
        case TYPE_COMPILED_METHOD_UNLOAD: {
          nmethod* nm = _event_data.compiled_method_unload.nm;
          JvmtiExport::post_compiled_method_unload(
            _event_data.compiled_method_unload.method_id,
            _event_data.compiled_method_unload.code_begin);
          // done with the deferred event so unlock the nmethod
          nmethodLocker::unlock_nmethod(nm);
          break;
        }
        case TYPE_DYNAMIC_CODE_GENERATED: {
          JvmtiExport::post_dynamic_code_generated_internal(
            // if strdup failed give the event a default name
            (_event_data.dynamic_code_generated.name == NULL)
              ? "unknown_code" : _event_data.dynamic_code_generated.name,
            _event_data.dynamic_code_generated.code_begin,
            _event_data.dynamic_code_generated.code_end);
          if (_event_data.dynamic_code_generated.name != NULL) {
            // release our copy
            os::free((void *)_event_data.dynamic_code_generated.name);
          }
          break;
        }
        default:
          ShouldNotReachHere();
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.