diff -r 84ef29ccac56 -r 00860d9caf4d src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp Fri Aug 23 18:47:55 2019 +0200 +++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp Sat Aug 24 14:30:27 2019 +0200 @@ -30,12 +30,24 @@ JfrCheckpointFlush::JfrCheckpointFlush(Type* old, size_t used, size_t requested, Thread* t) : _result(JfrCheckpointManager::flush(old, used, requested, t)) {} -JfrCheckpointWriter::JfrCheckpointWriter(bool flushpoint, bool header, Thread* thread) : - JfrCheckpointWriterBase(JfrCheckpointManager::lease_buffer(thread), thread), +JfrCheckpointWriter::JfrCheckpointWriter() : + JfrCheckpointWriterBase(JfrCheckpointManager::lease_buffer(Thread::current()), Thread::current()), _time(JfrTicks::now()), _offset(0), _count(0), - _flushpoint(flushpoint), + _header(true) { + assert(this->is_acquired(), "invariant"); + assert(0 == this->current_offset(), "invariant"); + if (_header) { + reserve(sizeof(JfrCheckpointEntry)); + } +} + +JfrCheckpointWriter::JfrCheckpointWriter(Thread* t, bool header /* true */) : + JfrCheckpointWriterBase(JfrCheckpointManager::lease_buffer(t), t), + _time(JfrTicks::now()), + _offset(0), + _count(0), _header(header) { assert(this->is_acquired(), "invariant"); assert(0 == this->current_offset(), "invariant"); @@ -44,13 +56,26 @@ } } -static void write_checkpoint_header(u1* pos, int64_t size, jlong time, bool flushpoint, u4 type_count) { +JfrCheckpointWriter::JfrCheckpointWriter(Thread* t, JfrBuffer* buffer) : + JfrCheckpointWriterBase(buffer, t), + _time(JfrTicks::now()), + _offset(0), + _count(0), + _header(true) { + assert(this->is_acquired(), "invariant"); + assert(0 == this->current_offset(), "invariant"); + if (_header) { + reserve(sizeof(JfrCheckpointEntry)); + } +} + +static void write_checkpoint_header(u1* pos, int64_t size, jlong time, u4 type_count) { assert(pos != NULL, "invariant"); JfrBigEndianWriter be_writer(pos, sizeof(JfrCheckpointEntry)); be_writer.write(size); be_writer.write(time); be_writer.write(JfrTicks::now().value() - time); - be_writer.write(flushpoint ? (u4)1 : (u4)0); + be_writer.write((u4)0); // not a flushpoint be_writer.write(type_count); assert(be_writer.is_valid(), "invariant"); } @@ -73,18 +98,10 @@ assert(this->used_size() > sizeof(JfrCheckpointEntry), "invariant"); const int64_t size = this->current_offset(); assert(size + this->start_pos() == this->current_pos(), "invariant"); - write_checkpoint_header(const_cast(this->start_pos()), size, _time, is_flushpoint(), count()); + write_checkpoint_header(const_cast(this->start_pos()), size, _time, count()); release(); } -void JfrCheckpointWriter::set_flushpoint(bool flushpoint) { - _flushpoint = flushpoint; -} - -bool JfrCheckpointWriter::is_flushpoint() const { - return _flushpoint; -} - u4 JfrCheckpointWriter::count() const { return _count; } @@ -126,7 +143,7 @@ write_padded_at_offset(nof_entries, offset); } -const u1* JfrCheckpointWriter::session_data(size_t* size, const JfrCheckpointContext* ctx /* 0 */) { +const u1* JfrCheckpointWriter::session_data(size_t* size, bool move /* false */, const JfrCheckpointContext* ctx /* 0 */) { assert(this->is_acquired(), "wrong state!"); if (!this->is_valid()) { *size = 0; @@ -139,9 +156,11 @@ } *size = this->used_size(); assert(this->start_pos() + *size == this->current_pos(), "invariant"); - write_checkpoint_header(const_cast(this->start_pos()), this->used_offset(), _time, is_flushpoint(), count()); - this->seek(_offset + (_header ? sizeof(JfrCheckpointEntry) : 0)); - set_count(0); + write_checkpoint_header(const_cast(this->start_pos()), this->used_offset(), _time, count()); + _header = false; // the header is already written + if (move) { + this->seek(_offset); + } return this->start_pos(); } @@ -156,31 +175,23 @@ this->seek(ctx.offset); set_count(ctx.count); } - bool JfrCheckpointWriter::has_data() const { return this->used_size() > sizeof(JfrCheckpointEntry); } -JfrCheckpointBlobHandle JfrCheckpointWriter::checkpoint_blob() { +JfrCheckpointBlobHandle JfrCheckpointWriter::copy(const JfrCheckpointContext* ctx /* 0 */) { size_t size = 0; - const u1* data = session_data(&size); - return JfrCheckpointBlob::make(data, size); -} - -JfrCheckpointBlobHandle JfrCheckpointWriter::copy(const JfrCheckpointContext* ctx /* 0 */) { - if (ctx == NULL) { - return checkpoint_blob(); - } - size_t size = 0; - const u1* data = session_data(&size, ctx); + const u1* data = session_data(&size, false, ctx); return JfrCheckpointBlob::make(data, size); } JfrCheckpointBlobHandle JfrCheckpointWriter::move(const JfrCheckpointContext* ctx /* 0 */) { - JfrCheckpointBlobHandle data = copy(ctx); + size_t size = 0; + const u1* data = session_data(&size, true, ctx); + JfrCheckpointBlobHandle blob = JfrCheckpointBlob::make(data, size); if (ctx != NULL) { const_cast(ctx)->count = 0; set_context(*ctx); } - return data; + return blob; }