src/hotspot/share/jfr/recorder/checkpoint/jfrMetadataEvent.cpp
branchJEP-349-branch
changeset 58166 105d32b27809
parent 58049 10ecdb5d3574
child 58567 e77a97d0edbb
equal deleted inserted replaced
58165:8584c5b96cb6 58166:105d32b27809
    29 #include "oops/klass.inline.hpp"
    29 #include "oops/klass.inline.hpp"
    30 #include "oops/oop.inline.hpp"
    30 #include "oops/oop.inline.hpp"
    31 #include "oops/typeArrayOop.inline.hpp"
    31 #include "oops/typeArrayOop.inline.hpp"
    32 #include "runtime/thread.inline.hpp"
    32 #include "runtime/thread.inline.hpp"
    33 
    33 
    34 static jbyteArray _metadata_blob = NULL;
    34 static jbyteArray metadata_blob = NULL;
    35 static u8 metadata_id = 0;
    35 static u8 metadata_id = 0;
    36 static u8 last_written_metadata_id = 0;
    36 static u8 last_written_metadata_id = 0;
    37 
    37 
    38 static void write_metadata_blob(JfrChunkWriter& chunkwriter, jbyteArray metadata_blob) {
    38 static void write_metadata_blob(JfrChunkWriter& chunkwriter) {
    39   if (metadata_blob != NULL) {
    39   assert(metadata_blob != NULL, "invariant");
    40     const typeArrayOop arr = (typeArrayOop)JfrJavaSupport::resolve_non_null(metadata_blob);
    40   const typeArrayOop arr = (typeArrayOop)JfrJavaSupport::resolve_non_null(metadata_blob);
    41     assert(arr != NULL, "invariant");
    41   assert(arr != NULL, "invariant");
    42     const int length = arr->length();
    42   const int length = arr->length();
    43     const Klass* const k = arr->klass();
    43   const Klass* const k = arr->klass();
    44     assert(k != NULL && k->is_array_klass(), "invariant");
    44   assert(k != NULL && k->is_array_klass(), "invariant");
    45     const TypeArrayKlass* const byte_arr_klass = TypeArrayKlass::cast(k);
    45   const TypeArrayKlass* const byte_arr_klass = TypeArrayKlass::cast(k);
    46     const jbyte* const data_address = arr->byte_at_addr(0);
    46   const jbyte* const data_address = arr->byte_at_addr(0);
    47     chunkwriter.write_unbuffered(data_address, length);
    47   chunkwriter.write_unbuffered(data_address, length);
    48   }
       
    49 }
    48 }
    50 
    49 
    51 void JfrMetadataEvent::write(JfrChunkWriter& chunkwriter) {
    50 void JfrMetadataEvent::write(JfrChunkWriter& chunkwriter) {
    52   assert(chunkwriter.is_valid(), "invariant");
    51   assert(chunkwriter.is_valid(), "invariant");
    53   const jlong metadata_offset = chunkwriter.current_offset();
       
    54   assert(chunkwriter.current_offset() == metadata_offset, "invariant");
       
    55 
       
    56   if (last_written_metadata_id == metadata_id && chunkwriter.has_metadata()) {
    52   if (last_written_metadata_id == metadata_id && chunkwriter.has_metadata()) {
    57     return;
    53     return;
    58   }
    54   }
    59 
       
    60   // header
    55   // header
    61   chunkwriter.reserve(sizeof(u4));
    56   const int64_t metadata_offset = chunkwriter.reserve(sizeof(u4));
    62   chunkwriter.write<u8>(EVENT_METADATA); // ID 0
    57   chunkwriter.write<u8>(EVENT_METADATA); // ID 0
    63   // time data
    58   // time data
    64   chunkwriter.write(JfrTicks::now());
    59   chunkwriter.write(JfrTicks::now());
    65   chunkwriter.write((u8)0); // duration
    60   chunkwriter.write((u8)0); // duration
    66   chunkwriter.write(metadata_id); // metadata id
    61   chunkwriter.write(metadata_id); // metadata id
    67   write_metadata_blob(chunkwriter, _metadata_blob); // payload
    62   write_metadata_blob(chunkwriter); // payload
    68   last_written_metadata_id = metadata_id;
    63   last_written_metadata_id = metadata_id;
    69   // fill in size of metadata descriptor event
    64   // fill in size of metadata descriptor event
    70   const jlong size_written = chunkwriter.current_offset() - metadata_offset;
    65   const int64_t size_written = chunkwriter.current_offset() - metadata_offset;
    71   chunkwriter.write_padded_at_offset((u4)size_written, metadata_offset);
    66   chunkwriter.write_padded_at_offset((u4)size_written, metadata_offset);
    72   chunkwriter.set_last_metadata_offset(metadata_offset);
    67   chunkwriter.set_last_metadata_offset(metadata_offset);
    73 }
    68 }
    74 
    69 
    75 void JfrMetadataEvent::update(jbyteArray metadata) {
    70 void JfrMetadataEvent::update(jbyteArray metadata) {
    76   JavaThread* thread = (JavaThread*)Thread::current();
    71   JavaThread* thread = (JavaThread*)Thread::current();
    77   assert(thread->is_Java_thread(), "invariant");
    72   assert(thread->is_Java_thread(), "invariant");
    78   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
    73   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
    79   if (_metadata_blob != NULL) {
    74   if (metadata_blob != NULL) {
    80     JfrJavaSupport::destroy_global_jni_handle(_metadata_blob);
    75     JfrJavaSupport::destroy_global_jni_handle(metadata_blob);
    81   }
    76   }
    82   const oop new_desc_oop = JfrJavaSupport::resolve_non_null(metadata);
    77   const oop new_desc_oop = JfrJavaSupport::resolve_non_null(metadata);
    83   _metadata_blob = new_desc_oop != NULL ? (jbyteArray)JfrJavaSupport::global_jni_handle(new_desc_oop, thread) : NULL;
    78   assert(new_desc_oop != NULL, "invariant");
       
    79   metadata_blob = (jbyteArray)JfrJavaSupport::global_jni_handle(new_desc_oop, thread);
    84   ++metadata_id;
    80   ++metadata_id;
    85 }
    81 }