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 } |