--- old/src/share/vm/jfr/dcmd/jfrDcmds.cpp 2019-09-27 13:25:58.697533497 +0800 +++ new/src/share/vm/jfr/dcmd/jfrDcmds.cpp 2019-09-27 13:25:58.596529939 +0800 @@ -434,7 +434,13 @@ jobjectArray settings = NULL; if (_settings.is_set()) { - const int length = _settings.value()->array()->length(); + int length = _settings.value()->array()->length(); + if (length == 1) { + const char* c_str = _settings.value()->array()->at(0); + if (strcmp(c_str, "none") == 0) { + length = 0; + } + } settings = JfrJavaSupport::new_string_array(length, CHECK); assert(settings != NULL, "invariant"); for (int i = 0; i < length; ++i) { --- old/src/share/vm/jfr/jni/jfrJavaCall.cpp 2019-09-27 13:25:59.269553645 +0800 +++ new/src/share/vm/jfr/jni/jfrJavaCall.cpp 2019-09-27 13:25:59.164549946 +0800 @@ -184,7 +184,7 @@ } } -JfrJavaArguments::JfrJavaArguments(JavaValue* result) : _result(result), _klass(NULL), _name(NULL), _signature(NULL), _array_length(0) { +JfrJavaArguments::JfrJavaArguments(JavaValue* result) : _result(result), _klass(NULL), _name(NULL), _signature(NULL), _array_length(-1) { assert(result != NULL, "invariant"); } @@ -193,7 +193,7 @@ _klass(NULL), _name(NULL), _signature(NULL), - _array_length(0) { + _array_length(-1) { assert(result != NULL, "invariant"); if (klass_name != NULL) { set_klass(klass_name, CHECK); @@ -210,7 +210,7 @@ _klass(NULL), _name(NULL), _signature(NULL), - _array_length(0) { + _array_length(-1) { assert(result != NULL, "invariant"); if (klass != NULL) { set_klass(klass); --- old/src/share/vm/jfr/jni/jfrJavaSupport.cpp 2019-09-27 13:25:59.837573651 +0800 +++ new/src/share/vm/jfr/jni/jfrJavaSupport.cpp 2019-09-27 13:25:59.733569988 +0800 @@ -166,7 +166,7 @@ const int array_length = args->array_length(); - if (array_length > 0) { + if (array_length >= 0) { array_construction(args, result, klass, array_length, CHECK); } else { object_construction(args, result, klass, THREAD); --- old/src/share/vm/jfr/recorder/jfrRecorder.cpp 2019-09-27 13:26:00.393593236 +0800 +++ new/src/share/vm/jfr/recorder/jfrRecorder.cpp 2019-09-27 13:26:00.288589537 +0800 @@ -189,9 +189,6 @@ if (!validate_recording_options(thread)) { return false; } - if (!JfrJavaEventWriter::initialize()) { - return false; - } if (!JfrOptionSet::configure(thread)) { return false; } @@ -235,6 +232,9 @@ ResourceMark rm; HandleMark hm; + if (!create_java_event_writer()) { + return false; + } if (!create_jvmti_agent()) { return false; } @@ -276,6 +276,10 @@ static JfrOSInterface* _os_interface = NULL; static JfrThreadSampling* _thread_sampling = NULL; +bool JfrRecorder::create_java_event_writer() { + return JfrJavaEventWriter::initialize(); +} + bool JfrRecorder::create_jvmti_agent() { return JfrOptionSet::allow_retransforms() ? JfrJvmtiAgent::create() : true; } --- old/src/share/vm/jfr/recorder/jfrRecorder.hpp 2019-09-27 13:26:00.959613172 +0800 +++ new/src/share/vm/jfr/recorder/jfrRecorder.hpp 2019-09-27 13:26:00.855609509 +0800 @@ -42,6 +42,7 @@ static bool create_checkpoint_manager(); static bool create_chunk_repository(); + static bool create_java_event_writer(); static bool create_jvmti_agent(); static bool create_os_interface(); static bool create_post_box(); --- old/src/share/vm/jfr/support/jfrFlush.cpp 2019-09-27 13:26:01.508632509 +0800 +++ new/src/share/vm/jfr/support/jfrFlush.cpp 2019-09-27 13:26:01.406628917 +0800 @@ -62,7 +62,6 @@ } void jfr_conditional_flush(JfrEventId id, size_t size, Thread* t) { - assert(jfr_is_event_enabled(id), "invariant"); if (t->jfr_thread_local()->has_native_buffer()) { JfrStorage::Buffer* const buffer = t->jfr_thread_local()->native_buffer(); if (LessThanSize::evaluate(buffer, size)) { --- old/src/share/vm/jfr/writers/jfrJavaEventWriter.cpp 2019-09-27 13:26:02.055651777 +0800 +++ new/src/share/vm/jfr/writers/jfrJavaEventWriter.cpp 2019-09-27 13:26:01.954648219 +0800 @@ -142,8 +142,7 @@ bool JfrJavaEventWriter::initialize() { static bool initialized = false; if (!initialized) { - Thread* thread = Thread::current(); - initialized = setup_event_writer_offsets(thread); + initialized = setup_event_writer_offsets(Thread::current()); } return initialized; } @@ -162,6 +161,7 @@ // large enough to accommodate the "requested size". const bool is_valid = buffer->free_size() >= (size_t)(used + requested); u1* const new_current_position = is_valid ? buffer->pos() + used : buffer->pos(); + assert(start_pos_offset != invalid_offset, "invariant"); w->long_field_put(start_pos_offset, (jlong)buffer->pos()); w->long_field_put(current_pos_offset, (jlong)new_current_position); // only update java writer if underlying memory changed --- old/src/share/vm/jfr/writers/jfrJavaEventWriter.hpp 2019-09-27 13:26:02.607671220 +0800 +++ new/src/share/vm/jfr/writers/jfrJavaEventWriter.hpp 2019-09-27 13:26:02.505667627 +0800 @@ -33,14 +33,15 @@ class JfrJavaEventWriter : AllStatic { friend class JfrCheckpointThreadClosure; - friend class JfrJavaEventWriterNotifyOperation; friend class JfrJavaEventWriterNotificationClosure; + friend class JfrJavaEventWriterNotifyOperation; + friend class JfrRecorder; private: + static bool initialize(); static void notify(JavaThread* jt); public: static bool has_required_classes(TRAPS); - static bool initialize(); static void notify(); static jobject event_writer(Thread* t); static jobject new_event_writer(TRAPS);