@@ -46,7 +46,6 @@ static bool flushAllThreadBuffers(J9VMThread *currentThread, bool freeBuffers);
46
46
static U_8* reserveBuffer (J9VMThread *currentThread, UDATA size);
47
47
static J9JFREvent* reserveBufferWithStackTrace (J9VMThread *currentThread, J9VMThread *sampleThread, UDATA eventType, UDATA eventFixedSize);
48
48
static void jfrThreadCreated (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
49
- static void jfrThreadDestroy (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
50
49
static void jfrClassesUnload (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
51
50
static void jfrVMShutdown (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
52
51
static void jfrThreadStarting (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
@@ -59,6 +58,7 @@ static int J9THREAD_PROC jfrSamplingThreadProc(void *entryArg);
59
58
static void jfrExecutionSampleCallback (J9VMThread *currentThread, IDATA handlerKey, void *userData);
60
59
static void jfrThreadCPULoadCallback (J9VMThread *currentThread, IDATA handlerKey, void *userData);
61
60
static bool areJFRBuffersReadyForWrite (J9VMThread *currentThread);
61
+
62
62
/* *
63
63
* Calculate the size in bytes of a JFR event.
64
64
*
@@ -252,6 +252,7 @@ flushAllThreadBuffers(J9VMThread *currentThread, bool freeBuffers)
252
252
bool flushedCurrentThread = false ;
253
253
254
254
Assert_VM_mustHaveVMAccess (currentThread);
255
+ Assert_VM_true (currentThread->omrVMThread ->exclusiveCount > 0 );
255
256
Assert_VM_true ((J9_XACCESS_EXCLUSIVE == vm->exclusiveAccessState ) || (J9_XACCESS_EXCLUSIVE == vm->safePointState ));
256
257
257
258
do {
@@ -380,7 +381,6 @@ jfrThreadCreated(J9HookInterface **hook, UDATA eventNum, void *eventData, void *
380
381
#endif /* defined(DEBUG) */
381
382
382
383
/* TODO: allow different buffer sizes on different threads. */
383
-
384
384
U_8 *buffer = (U_8*)j9mem_allocate_memory (J9JFR_THREAD_BUFFER_SIZE, OMRMEM_CATEGORY_VM);
385
385
if (NULL == buffer) {
386
386
event->continueInitialization = FALSE ;
@@ -395,37 +395,6 @@ jfrThreadCreated(J9HookInterface **hook, UDATA eventNum, void *eventData, void *
395
395
}
396
396
}
397
397
398
- /* *
399
- * Hook for thread being destroyed.
400
- *
401
- * @param hook[in] the VM hook interface
402
- * @param eventNum[in] the event number
403
- * @param eventData[in] the event data
404
- * @param userData[in] the registered user data
405
- */
406
- static void
407
- jfrThreadDestroy (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData)
408
- {
409
- J9VMThreadDestroyEvent *event = (J9VMThreadDestroyEvent *)eventData;
410
- J9VMThread *currentThread = event->vmThread ;
411
- PORT_ACCESS_FROM_VMC (currentThread);
412
-
413
- #if defined(DEBUG)
414
- j9tty_printf (PORTLIB, " \n !!! thread destroy %p\n " , currentThread);
415
- #endif /* defined(DEBUG) */
416
-
417
-
418
- /* The current thread pointer (which can appear in other thread buffers) is about to become
419
- * invalid, so write out all of the available data now.
420
- */
421
- flushAllThreadBuffers (currentThread, false );
422
- writeOutGlobalBuffer (currentThread, false );
423
-
424
- /* Free the thread local buffer */
425
- j9mem_free_memory ((void *)currentThread->jfrBuffer .bufferStart );
426
- memset (¤tThread->jfrBuffer , 0 , sizeof (currentThread->jfrBuffer ));
427
- }
428
-
429
398
/* *
430
399
* Hook for classes being unloaded.
431
400
*
@@ -543,6 +512,15 @@ jfrThreadEnd(J9HookInterface **hook, UDATA eventNum, void *eventData, void *user
543
512
if (NULL != jfrEvent) {
544
513
initializeEventFields (currentThread, jfrEvent, J9JFR_EVENT_TYPE_THREAD_END);
545
514
}
515
+ PORT_ACCESS_FROM_VMC (currentThread);
516
+ acquireExclusiveVMAccess (currentThread);
517
+ flushAllThreadBuffers (currentThread, false );
518
+ writeOutGlobalBuffer (currentThread, false );
519
+
520
+ /* Free the thread local buffer */
521
+ j9mem_free_memory ((void *)currentThread->jfrBuffer .bufferStart );
522
+ memset (¤tThread->jfrBuffer , 0 , sizeof (currentThread->jfrBuffer ));
523
+ releaseExclusiveVMAccess (currentThread);
546
524
internalReleaseVMAccess (currentThread);
547
525
}
548
526
@@ -674,9 +652,6 @@ initializeJFR(J9JavaVM *vm, BOOLEAN lateInit)
674
652
if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_THREAD_CREATED, jfrThreadCreated, OMR_GET_CALLSITE (), NULL )) {
675
653
goto fail;
676
654
}
677
- if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_THREAD_DESTROY, jfrThreadDestroy, OMR_GET_CALLSITE (), NULL )) {
678
- goto fail;
679
- }
680
655
if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_CLASSES_UNLOAD, jfrClassesUnload, OMR_GET_CALLSITE (), NULL )) {
681
656
goto fail;
682
657
}
@@ -806,7 +781,6 @@ tearDownJFR(J9JavaVM *vm)
806
781
807
782
/* Unhook all the events */
808
783
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_THREAD_CREATED, jfrThreadCreated, NULL );
809
- (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_THREAD_DESTROY, jfrThreadDestroy, NULL );
810
784
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_CLASSES_UNLOAD, jfrClassesUnload, NULL );
811
785
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_SHUTTING_DOWN, jfrVMShutdown, NULL );
812
786
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_THREAD_STARTING, jfrThreadStarting, NULL );
0 commit comments