Skip to content

Commit 4e0a8c8

Browse files
authored
Merge pull request #19969 from tajila/jfr3
JFR Writer fixes part1
2 parents dc0af4f + 277d126 commit 4e0a8c8

File tree

4 files changed

+145
-15
lines changed

4 files changed

+145
-15
lines changed

runtime/vm/JFRChunkWriter.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,11 @@ VM_JFRChunkWriter::writeJFRHeader()
6464
/* pad */
6565
_bufferWriter->writeU16(0); // 65
6666

67-
/* flags */
67+
U_8 flags = JFR_HEADER_SPECIALFLAGS_COMPRESSED_INTS;
6868
if (_finalWrite) {
69-
_bufferWriter->writeU8(0x2); // 67 // final chunk bit?
70-
} else {
71-
_bufferWriter->writeU8(2);
69+
flags |= JFR_HEADER_SPECIALFLAGS_LAST_CHUNK;
7270
}
71+
_bufferWriter->writeU8(flags);
7372
}
7473

7574
U_8 *
@@ -597,7 +596,7 @@ VM_JFRChunkWriter::writeStacktraceCheckpointEvent()
597596

598597
/* number of stack frames */
599598
UDATA framesCount = entry->numOfFrames;
600-
_bufferWriter->writeU8(framesCount);
599+
_bufferWriter->writeLEB128(framesCount);
601600

602601
for (UDATA i = 0; i < framesCount; i++) {
603602
StackFrame *frame = entry->frames + i;

runtime/vm/JFRChunkWriter.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@
3535
#include "ObjectAccessBarrierAPI.hpp"
3636
#include "VMHelpers.hpp"
3737

38+
static constexpr const char * const intermediateChunkFileName = "openj9ChunkFile";
39+
40+
static constexpr const int JFR_HEADER_SPECIALFLAGS_COMPRESSED_INTS = 1;
41+
static constexpr const int JFR_HEADER_SPECIALFLAGS_LAST_CHUNK = 2;
42+
3843
static constexpr const char * const threadStateNames[] = {
3944
"STATE_NEW",
4045
"STATE_TERMINATED",
@@ -200,6 +205,34 @@ class VM_JFRChunkWriter {
200205
return _buildResult;
201206
}
202207

208+
void
209+
writeIntermediateJFRChunkToFile()
210+
{
211+
UDATA written = 0;
212+
char fileName[sizeof(intermediateChunkFileName) + 16 + sizeof(".jfr")];
213+
sprintf(fileName, "%s%lX.jfr", intermediateChunkFileName, _vm->jfrState.jfrChunkCount);
214+
UDATA len = _bufferWriter->getSize();
215+
IDATA fd = j9file_open(fileName, EsOpenWrite | EsOpenCreate | EsOpenTruncate , 0666);
216+
217+
if (-1 == fd) {
218+
_buildResult = FileIOError;
219+
goto done;
220+
}
221+
222+
written = j9file_write(fd, _bufferWriter->getBufferStart(), len);
223+
224+
if (len != written) {
225+
_buildResult = FileIOError;
226+
}
227+
228+
if (-1 != fd) {
229+
j9file_close(fd);
230+
}
231+
done:
232+
return;
233+
234+
}
235+
203236
void writeJFRChunk()
204237
{
205238
U_8 *buffer = NULL;
@@ -269,6 +302,8 @@ class VM_JFRChunkWriter {
269302

270303
_bufferWriter = NULL;
271304
j9mem_free_memory(buffer);
305+
306+
_vm->jfrState.jfrChunkCount += 1;
272307
}
273308
done:
274309
return;
@@ -403,6 +438,10 @@ class VM_JFRChunkWriter {
403438
_buildResult = FileIOError;
404439
}
405440

441+
if (_debug) {
442+
writeIntermediateJFRChunkToFile();
443+
}
444+
406445
return;
407446
}
408447

runtime/vm/JFRConstantPoolTypes.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,4 +1101,18 @@ VM_JFRConstantPoolTypes::freeUTF8Strings(void *entry, void *userData)
11011101
return FALSE;
11021102
}
11031103

1104+
UDATA
1105+
VM_JFRConstantPoolTypes::freeStackStraceEntries(void *entry, void *userData)
1106+
{
1107+
StackTraceEntry *tableEntry = (StackTraceEntry *) entry;
1108+
J9VMThread *currentThread = (J9VMThread *)userData;
1109+
PORT_ACCESS_FROM_VMC(currentThread);
1110+
1111+
j9mem_free_memory(tableEntry->frames);
1112+
tableEntry->frames = NULL;
1113+
1114+
return FALSE;
1115+
}
1116+
1117+
11041118
#endif /* defined(J9VM_OPT_JFR) */

runtime/vm/JFRConstantPoolTypes.hpp

Lines changed: 88 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,19 @@
3737
#include "VMHelpers.hpp"
3838

3939
J9_DECLARE_CONSTANT_UTF8(nullString, "(nullString)");
40+
J9_DECLARE_CONSTANT_UTF8(unknownClass, "(defaultPackage)/(unknownClass)");
41+
J9_DECLARE_CONSTANT_UTF8(nativeMethod, "(nativeMethod)");
42+
J9_DECLARE_CONSTANT_UTF8(nativeMethodSignature, "()");
4043
J9_DECLARE_CONSTANT_UTF8(defaultPackage, "(defaultPackage)");
4144
J9_DECLARE_CONSTANT_UTF8(bootLoaderName, "boostrapClassLoader");
4245

46+
enum JFRStringConstants {
47+
DefaultString = 0,
48+
UnknownClass = 1,
49+
NativeMethod = 2,
50+
NativeMethodSignature = 3,
51+
};
52+
4353
enum FrameType {
4454
Interpreted = 0,
4555
JIT,
@@ -250,8 +260,14 @@ class VM_JFRConstantPoolTypes {
250260
/* default values */
251261
ThreadGroupEntry _defaultThreadGroup;
252262
StringUTF8Entry _defaultStringUTF8Entry;
263+
StringUTF8Entry _unknownClassStringUTF8Entry;
264+
StringUTF8Entry _nativeMethodStringUTF8Entry;
265+
StringUTF8Entry _nativeMethodSignatureStringUTF8Entry;
253266
PackageEntry _defaultPackageEntry;
254267
ModuleEntry _defaultModuleEntry;
268+
ClassEntry _defaultClassEntry;
269+
MethodEntry _defaultMethodEntry;
270+
StackTraceEntry _defaultStackTraceEntry;
255271

256272
UDATA _requiredBufferSize;
257273
U_32 _currentFrameCount;
@@ -336,6 +352,8 @@ class VM_JFRConstantPoolTypes {
336352

337353
static UDATA freeUTF8Strings(void *entry, void *userData);
338354

355+
static UDATA freeStackStraceEntries(void *entry, void *userData);
356+
339357
U_32 getMethodEntry(J9ROMMethod *romMethod, J9Class *ramClass);
340358

341359
U_32 getClassEntry(J9Class *clazz);
@@ -381,14 +399,29 @@ class VM_JFRConstantPoolTypes {
381399
VM_JFRConstantPoolTypes *cp = (VM_JFRConstantPoolTypes*) userData;
382400
StackFrame *frame = &cp->_currentStackFrameBuffer[cp->_currentFrameCount];
383401

384-
if ((UDATA)-1 != bytecodeOffset) {
385-
cp->_currentFrameCount++;
402+
cp->_currentFrameCount++;
386403

404+
if ((NULL == ramClass) || (NULL == romMethod)) {
405+
/* unknown native method */
406+
frame->methodIndex = 0;
407+
frame->frameType = Native;
408+
} else {
387409
frame->methodIndex = cp->getMethodEntry(romMethod, ramClass);
388-
frame->lineNumber = lineNumber;
389-
frame->bytecodeIndex = bytecodeOffset;
390410
frame->frameType = Interpreted; /* TODO need a way to know if its JIT'ed and inlined */
391411
}
412+
413+
if ((UDATA)-1 == bytecodeOffset) {
414+
frame->bytecodeIndex = 0;
415+
} else {
416+
frame->bytecodeIndex = bytecodeOffset;
417+
}
418+
419+
if ((UDATA)-1 == lineNumber) {
420+
frame->lineNumber = 0;
421+
} else {
422+
frame->lineNumber = lineNumber;
423+
}
424+
392425
return J9_STACKWALK_KEEP_ITERATING;
393426
}
394427

@@ -401,6 +434,9 @@ class VM_JFRConstantPoolTypes {
401434
goto done;
402435
}
403436
_globalStringTable[0] = &_defaultStringUTF8Entry;
437+
_globalStringTable[1] = &_unknownClassStringUTF8Entry;
438+
_globalStringTable[2] = &_nativeMethodStringUTF8Entry;
439+
_globalStringTable[3] = &_nativeMethodSignatureStringUTF8Entry;
404440
_globalStringTable[_stringUTF8Count] = &_defaultPackageEntry;
405441

406442
hashTableForEachDo(_stringUTF8Table, &mergeStringUTF8EntriesToGlobalTable, this);
@@ -607,7 +643,16 @@ class VM_JFRConstantPoolTypes {
607643

608644
U_32 consumeStackTrace(J9VMThread *walkThread, UDATA *walkStateCache, UDATA numberOfFrames) {
609645
U_32 index = U_32_MAX;
610-
_currentStackFrameBuffer = (StackFrame*) j9mem_allocate_memory(sizeof(StackFrame) * numberOfFrames, J9MEM_CATEGORY_CLASSES);
646+
UDATA expandedStackTraceCount = 0;
647+
648+
if (0 == numberOfFrames) {
649+
index = 0;
650+
goto done;
651+
}
652+
653+
expandedStackTraceCount = iterateStackTraceImpl(_currentThread, (j9object_t*)walkStateCache, NULL, NULL, FALSE, FALSE, numberOfFrames, FALSE);
654+
655+
_currentStackFrameBuffer = (StackFrame*) j9mem_allocate_memory(sizeof(StackFrame) * expandedStackTraceCount, J9MEM_CATEGORY_CLASSES);
611656
_currentFrameCount = 0;
612657
if (NULL == _currentStackFrameBuffer) {
613658
_buildResult = OutOfMemory;
@@ -617,7 +662,8 @@ class VM_JFRConstantPoolTypes {
617662
iterateStackTraceImpl(_currentThread, (j9object_t*)walkStateCache, &stackTraceCallback, this, FALSE, FALSE, numberOfFrames, FALSE);
618663

619664
index = addStackTraceEntry(walkThread, VM_JFRUtils::getCurrentTimeNanos(privatePortLibrary, _buildResult), _currentFrameCount);
620-
_stackFrameCount += numberOfFrames;
665+
_stackFrameCount += expandedStackTraceCount;
666+
_currentStackFrameBuffer = NULL;
621667

622668
done:
623669
return index;
@@ -756,28 +802,59 @@ class VM_JFRConstantPoolTypes {
756802
* For package zero is the deafult package, for Module zero is the unnamed module. ThreadGroup
757803
* zero is NULL threadGroup.
758804
*/
759-
_stringUTF8Count++;
805+
_stringUTF8Count += 1;
760806
_defaultStringUTF8Entry = {0};
761807
_defaultStringUTF8Entry.string = (J9UTF8*)&nullString;
762808

763-
_moduleCount++;
809+
_stringUTF8Count += 1;
810+
_unknownClassStringUTF8Entry = {0};
811+
_unknownClassStringUTF8Entry.string = (J9UTF8*)&unknownClass;
812+
813+
_stringUTF8Count += 1;
814+
_nativeMethodStringUTF8Entry = {0};
815+
_nativeMethodStringUTF8Entry.string = (J9UTF8*)&nativeMethod;
816+
817+
_stringUTF8Count += 1;
818+
_nativeMethodSignatureStringUTF8Entry = {0};
819+
_nativeMethodSignatureStringUTF8Entry.string = (J9UTF8*)&nativeMethodSignature;
820+
821+
_moduleCount += 1;
764822
_defaultModuleEntry = {0};
765823
_firstModuleEntry = &_defaultModuleEntry;
766824
_previousModuleEntry = _firstModuleEntry;
767825

768-
_packageCount++;
826+
_packageCount += 1;
769827
_defaultPackageEntry = {0};
770828
_defaultPackageEntry.exported = TRUE;
771829
_defaultPackageEntry.packageName = J9UTF8_DATA((J9UTF8*) &defaultPackage);
772830
_defaultPackageEntry.packageNameLength = J9UTF8_LENGTH((J9UTF8*) &defaultPackage);
773831
_firstPackageEntry = &_defaultPackageEntry;
774832
_previousPackageEntry = _firstPackageEntry;
775833

776-
_threadGroupCount++;
834+
_threadGroupCount += 1;
777835
_defaultThreadGroup = {0};
778836
_firstThreadGroupEntry = &_defaultThreadGroup;
779837
_previousThreadGroupEntry = _firstThreadGroupEntry;
780838

839+
_classCount += 1;
840+
_defaultClassEntry = {0};
841+
_defaultClassEntry.nameStringUTF8Index = (U_32)UnknownClass;
842+
_firstClassEntry = &_defaultClassEntry;
843+
_previousClassEntry = _firstClassEntry;
844+
845+
_methodCount += 1;
846+
_defaultMethodEntry = {0};
847+
_defaultMethodEntry.nameStringUTF8Index = (U_32)NativeMethod;
848+
_defaultMethodEntry.descriptorStringUTF8Index = (U_32)NativeMethodSignature;
849+
/* default class */
850+
_defaultMethodEntry.classIndex = 0;
851+
_firstMethodEntry = &_defaultMethodEntry;
852+
_previousMethodEntry = _firstMethodEntry;
853+
854+
_stackTraceCount += 1;
855+
_defaultStackTraceEntry = {0};
856+
_firstStackTraceEntry = &_defaultStackTraceEntry;
857+
_previousStackTraceEntry = _firstStackTraceEntry;
781858

782859
done:
783860
return;
@@ -786,6 +863,7 @@ class VM_JFRConstantPoolTypes {
786863
~VM_JFRConstantPoolTypes()
787864
{
788865
hashTableForEachDo(_stringUTF8Table, &freeUTF8Strings, _currentThread);
866+
hashTableForEachDo(_stackTraceTable, &freeStackStraceEntries, _currentThread);
789867
hashTableFree(_classTable);
790868
hashTableFree(_packageTable);
791869
hashTableFree(_moduleTable);

0 commit comments

Comments
 (0)