Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/control/CompilationThread.hpp
6000 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2022 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#ifndef COMPILATIONTHREAD_INCL
24
#define COMPILATIONTHREAD_INCL
25
26
#include <ctime>
27
#include "control/CompilationPriority.hpp"
28
#include "env/RawAllocator.hpp"
29
#include "j9.h"
30
#include "j9thread.h"
31
#include "j9cfg.h"
32
#include "env/VMJ9.h"
33
#include "control/rossa.h"
34
#include "env/CpuUtilization.hpp"
35
#include "infra/Statistics.hpp"
36
#include "control/Recompilation.hpp"
37
#include "control/RecompilationInfo.hpp"
38
#include "runtime/DataCache.hpp"
39
#include "infra/Monitor.hpp"
40
#include "ilgen/IlGenRequest.hpp"
41
#include "infra/MonitorTable.hpp"
42
#include "infra/RWMonitor.hpp"
43
#include "infra/Link.hpp"
44
#include "env/IO.hpp"
45
#include "runtime/RelocationRuntime.hpp"
46
#include "env/J9SegmentCache.hpp"
47
#if defined(J9VM_OPT_JITSERVER)
48
#include "env/VMJ9Server.hpp"
49
#include "env/PersistentCollections.hpp"
50
#endif /* defined(J9VM_OPT_JITSERVER) */
51
52
#define METHOD_POOL_SIZE_THRESHOLD 64
53
#define MAX_SAMPLING_FREQUENCY 0x7FFFFFFF
54
55
// Reasons for interrupting a compilation
56
const uint8_t GC_COMP_INTERRUPT = 1;
57
const uint8_t SHUTDOWN_COMP_INTERRUPT = 2;
58
59
const int32_t IDLE_THRESHOLD = 50; // % CPU
60
61
namespace TR { class Monitor; }
62
namespace TR { class PersistentInfo; }
63
namespace TR { class SegmentAllocator; }
64
namespace TR { class CompilationInfoPerThreadBase; } // forward declaration
65
namespace TR { class CompilationInfoPerThread; } // forward declaration
66
namespace TR { class CompilationInfo; } // forward declaration
67
struct TR_MethodToBeCompiled;
68
class TR_ResolvedMethod;
69
class TR_RelocationRuntime;
70
#if defined(J9VM_OPT_JITSERVER)
71
class ClientSessionData;
72
namespace JITServer
73
{
74
class ClientStream;
75
class ServerStream;
76
}
77
#endif /* defined(J9VM_OPT_JITSERVER) */
78
79
enum CompilationThreadState
80
{
81
COMPTHREAD_UNINITIALIZED, // comp thread has not yet initialized
82
COMPTHREAD_ACTIVE, // comp thread is actively processing queue entries
83
COMPTHREAD_SIGNAL_WAIT, // comp transitioning to waiting on the queue
84
COMPTHREAD_WAITING, // comp thread is waiting on the queue
85
COMPTHREAD_SIGNAL_SUSPEND, // comp thread received suspension request
86
COMPTHREAD_SUSPENDED, // comp thread is waiting on the compThreadMonitor
87
COMPTHREAD_SIGNAL_TERMINATE, // compthread will terminate
88
COMPTHREAD_STOPPING, // compthread is terminating
89
COMPTHREAD_STOPPED, // compthread has terminated
90
COMPTHREAD_ABORT // compthread failed to initialize
91
};
92
93
struct CompileParameters
94
{
95
CompileParameters(
96
TR::CompilationInfoPerThreadBase *compilationInfo,
97
TR_J9VMBase* vm,
98
J9VMThread * vmThread,
99
TR_RelocationRuntime *reloRuntime,
100
TR_OptimizationPlan * optimizationPlan,
101
TR::SegmentAllocator &scratchSegmentProvider,
102
TR::Region &dispatchRegion,
103
TR_Memory &trMemory,
104
const TR::CompileIlGenRequest &ilGenRequest
105
) :
106
_compilationInfo(compilationInfo),
107
_vm(vm),
108
_vmThread(vmThread),
109
_reloRuntime(reloRuntime),
110
_optimizationPlan(optimizationPlan),
111
_scratchSegmentProvider(scratchSegmentProvider),
112
_dispatchRegion(dispatchRegion),
113
_trMemory(trMemory),
114
_ilGenRequest(ilGenRequest)
115
{}
116
117
TR_Memory *trMemory() { return &_trMemory; }
118
119
TR::CompilationInfoPerThreadBase *_compilationInfo;
120
TR_J9VMBase *_vm;
121
J9VMThread *_vmThread;
122
TR_RelocationRuntime *_reloRuntime;
123
TR_OptimizationPlan*_optimizationPlan;
124
TR::SegmentAllocator &_scratchSegmentProvider;
125
TR::Region &_dispatchRegion;
126
TR_Memory &_trMemory;
127
TR::CompileIlGenRequest _ilGenRequest;
128
};
129
130
#if defined(TR_HOST_S390)
131
struct timeval;
132
#endif
133
134
class TR_DataCache;
135
136
namespace TR {
137
138
class CompilationInfoPerThreadBase
139
{
140
TR_PERSISTENT_ALLOC(TR_Memory::CompilationInfoPerThreadBase);
141
friend class TR::CompilationInfo;
142
public:
143
CompilationInfoPerThreadBase(TR::CompilationInfo &compInfo, J9JITConfig *jitConfig, int32_t id, bool onSeparateThread);
144
145
TR::CompilationInfo *getCompilationInfo() { return &_compInfo; }
146
J9JITConfig *getJitConfig() { return _jitConfig; }
147
TR_MethodToBeCompiled *getMethodBeingCompiled() { return _methodBeingCompiled; }
148
void setMethodBeingCompiled(TR_MethodToBeCompiled *m) { _methodBeingCompiled = m; }
149
150
CompilationThreadState getCompilationThreadState() {return _compilationThreadState;}
151
virtual void setCompilationThreadState(CompilationThreadState v);
152
bool compilationThreadIsActive();
153
TR::Compilation *getCompilation() { return _compiler; }
154
void setCompilation(TR::Compilation *compiler);
155
void zeroCompilation();
156
void printCompilationThreadTime();
157
TR_MethodMetaData *getMetadata() {return _metadata;}
158
void setMetadata(TR_MethodMetaData *m) {_metadata = m;}
159
void *compile(J9VMThread *context, TR_MethodToBeCompiled *entry, J9::J9SegmentProvider &scratchSegmentProvider);
160
TR_MethodMetaData *compile(J9VMThread *context, TR::Compilation *,
161
TR_ResolvedMethod *compilee, TR_J9VMBase &, TR_OptimizationPlan*, TR::SegmentAllocator const &scratchSegmentProvider);
162
TR_MethodMetaData *performAOTLoad(J9VMThread *context, TR::Compilation *, TR_ResolvedMethod *compilee, TR_J9VMBase *vm, J9Method *method);
163
164
void preCompilationTasks(J9VMThread * vmThread,
165
TR_MethodToBeCompiled *entry,
166
J9Method *method,
167
const void **aotCachedMethod,
168
TR_Memory &trMemory,
169
bool &canDoRelocatableCompile,
170
bool &eligibleForRelocatableCompile,
171
TR_RelocationRuntime *reloRuntime);
172
173
void *postCompilationTasks(J9VMThread * vmThread,
174
TR_MethodToBeCompiled *entry,
175
J9Method *method,
176
const void *aotCachedMethod,
177
TR_MethodMetaData *metaData,
178
bool canDoRelocatableCompile,
179
bool eligibleForRelocatableCompile,
180
TR_RelocationRuntime *reloRuntime);
181
const void* findAotBodyInSCC(J9VMThread *vmThread, const J9ROMMethod *romMethod);
182
bool isMethodIneligibleForAot(J9Method *method);
183
184
#if defined(J9VM_OPT_SHARED_CLASSES) && defined(J9VM_INTERP_AOT_RUNTIME_SUPPORT)
185
TR_MethodMetaData *installAotCachedMethod(
186
J9VMThread *vmThread,
187
const void *aotCachedMethod,
188
J9Method *method,
189
TR_FrontEnd *fe,
190
TR::Options *options,
191
TR_ResolvedMethod *compilee,
192
TR_MethodToBeCompiled *entry,
193
TR::Compilation *compiler
194
);
195
#endif
196
197
/*
198
* LdTM: This should, pedantically speaking, be an 'extern "C"' friend function rather than a static member function (with C++ linkage).
199
* However a brief search reveals that such an approach is fraught with its own set of compiler-bug-related risk.
200
*/
201
static TR_MethodMetaData *wrappedCompile(J9PortLibrary *portLib, void * opaqueParameters);
202
203
bool methodCanBeCompiled(TR_Memory *trMemory, TR_FrontEnd *fe, TR_ResolvedMethod *compilee, TR_FilterBST *&filter);
204
int32_t getCompThreadId() const { return _compThreadId; }
205
206
/**
207
* \brief
208
*
209
* An RAII class used to scope an interruptible operation on a compilation thread.
210
*
211
* \details
212
*
213
* Interruptible (\see InterruptibleOperation) and Uninterruptible (\see UninterruptibleOperation) operations related
214
* classes expressing whether the current compilation thread can terminate the compilation at the next yield point.
215
* The two classes can be intertwined and the logic of what happens when scopes mix is as follows:
216
*
217
* - Nesting an InterruptibleOperation under an UninterruptibleOperation acts as a NOP
218
* - Nesting an UninterruptibleOperation under an InterruptibleOperation results in an UninterruptibleOperation that
219
* once gone out of scope results in an InterruptibleOperation
220
*
221
* Put simply, an UninterruptibleOperation takes higher precedence over an InterruptibleOperation.
222
*/
223
class InterruptibleOperation
224
{
225
friend class TR::CompilationInfoPerThreadBase;
226
227
public:
228
InterruptibleOperation(TR::CompilationInfoPerThreadBase &compThread) :
229
_compThread(compThread)
230
{
231
if (_compThread._uninterruptableOperationDepth == 0)
232
{
233
_compThread._compilationCanBeInterrupted = true;
234
}
235
}
236
237
~InterruptibleOperation()
238
{
239
if (_compThread._uninterruptableOperationDepth == 0)
240
{
241
_compThread._compilationCanBeInterrupted = false;
242
}
243
}
244
245
private:
246
TR::CompilationInfoPerThreadBase & _compThread;
247
};
248
249
/**
250
* \brief
251
*
252
* An RAII class used to scope an uninterruptible operation on a compilation thread.
253
*
254
* \details
255
*
256
* Interruptible (\see InterruptibleOperation) and Uninterruptible (\see UninterruptibleOperation) operations related
257
* classes expressing whether the current compilation thread can terminate the compilation at the next yield point.
258
* The two classes can be intertwined and the logic of what happens when scopes mix is as follows:
259
*
260
* - Nesting an InterruptibleOperation under an UninterruptibleOperation acts as a NOP
261
* - Nesting an UninterruptibleOperation under an InterruptibleOperation results in an UninterruptibleOperation that
262
* once gone out of scope results in an InterruptibleOperation
263
*
264
* Put simply, an UninterruptibleOperation takes higher precedence over an InterruptibleOperation.
265
*/
266
class UninterruptibleOperation
267
{
268
friend class TR::CompilationInfoPerThreadBase;
269
270
public:
271
UninterruptibleOperation(TR::CompilationInfoPerThreadBase &compThread) :
272
_compThread(compThread), _originalValue(_compThread._compilationCanBeInterrupted)
273
{
274
_compThread._compilationCanBeInterrupted = false;
275
_compThread._uninterruptableOperationDepth++;
276
}
277
278
~UninterruptibleOperation()
279
{
280
_compThread._compilationCanBeInterrupted = _originalValue;
281
_compThread._uninterruptableOperationDepth--;
282
}
283
284
private:
285
TR::CompilationInfoPerThreadBase & _compThread;
286
287
/// Represents the original value of whether the compilation can be interrupted before executing the
288
/// uninterruptable operation
289
bool _originalValue;
290
};
291
292
uint8_t compilationShouldBeInterrupted() const
293
{
294
return _compilationCanBeInterrupted ? _compilationShouldBeInterrupted : 0;
295
}
296
297
void setCompilationShouldBeInterrupted(uint8_t reason) { _compilationShouldBeInterrupted = reason; }
298
TR_DataCache* reservedDataCache() { return _reservedDataCache; }
299
void setReservedDataCache(TR_DataCache *dataCache) { _reservedDataCache = dataCache; }
300
int32_t getNumJITCompilations() const { return _numJITCompilations; }
301
void incNumJITCompilations() { _numJITCompilations++; }
302
int32_t getQszWhenCompStarted() const { return _qszWhenCompStarted; }
303
void generatePerfToolEntry(); // for Linux only
304
uintptr_t getTimeWhenCompStarted() const { return _timeWhenCompStarted; }
305
void setTimeWhenCompStarted(UDATA t) { _timeWhenCompStarted = t; }
306
307
TR_RelocationRuntime *reloRuntime();
308
static TR::FILE *getPerfFile() { return _perfFile; } // used on Linux for perl tool support
309
static void setPerfFile(TR::FILE *f) { _perfFile = f; }
310
311
#if defined(J9VM_OPT_JITSERVER)
312
void setClientData(ClientSessionData *data) { _cachedClientDataPtr = data; }
313
ClientSessionData *getClientData() const { return _cachedClientDataPtr; }
314
315
void setClientStream(JITServer::ClientStream *stream) { _clientStream = stream; }
316
JITServer::ClientStream *getClientStream() const { return _clientStream; }
317
318
/**
319
@brief After this method runs, all subsequent persistent allocations
320
on the current thread for a given client will use a per-client allocator,
321
instead of the global one.
322
*/
323
void enterPerClientAllocationRegion();
324
325
/**
326
@brief Ends per-client allocation on this thread. After this method returns,
327
all allocations will use the global persistent allocator.
328
*/
329
void exitPerClientAllocationRegion();
330
TR_PersistentMemory *getPerClientPersistentMemory() { return _perClientPersistentMemory; }
331
332
/**
333
@brief Heuristic that returns true if compiling a method of given size
334
and at given optimization level less is likely to consume little
335
memory relative to what the JVM has at its disposal
336
*/
337
bool isMemoryCheapCompilation(uint32_t bcsz, TR_Hotness optLevel);
338
/**
339
@brief Heuristic that returns true if compiling a method of given size
340
and at given optimization level less is likely to consume little
341
CPU relative to what the JVM has at its disposal
342
*/
343
bool isCPUCheapCompilation(uint32_t bcsz, TR_Hotness optLevel);
344
/**
345
@brief Returns true if we truly cannot perform a remote compilation
346
maybe because the server is not compatible, is not available, etc.
347
348
Note, that if this query returns false, it is not guaranteed that we
349
can do a remote compilation, because the server could have died since
350
we last checked.
351
*/
352
bool cannotPerformRemoteComp();
353
/**
354
@brief Returns true if heuristics determine that we have the resources to perform
355
this compilation locally, rather than offloading it to the remote server.
356
*/
357
bool preferLocalComp(const TR_MethodToBeCompiled *entry);
358
359
360
bool compilationCanBeInterrupted() const { return _compilationCanBeInterrupted; }
361
362
void downgradeLocalCompilationIfLowPhysicalMemory(TR_MethodToBeCompiled *entry);
363
364
#endif /* defined(J9VM_OPT_JITSERVER) */
365
366
protected:
367
368
TR::CompilationInfo & _compInfo;
369
J9JITConfig * const _jitConfig;
370
TR_SharedCacheRelocationRuntime _sharedCacheReloRuntime;
371
#if defined(J9VM_OPT_JITSERVER)
372
TR_JITServerRelocationRuntime _remoteCompileReloRuntime;
373
#endif /* defined(J9VM_OPT_JITSERVER) */
374
int32_t const _compThreadId; // unique number starting from 0; Only used for compilation on separate thread
375
bool const _onSeparateThread;
376
377
TR_J9VMBase * _vm;
378
TR_MethodToBeCompiled * _methodBeingCompiled;
379
TR::Compilation * _compiler;
380
TR_MethodMetaData * _metadata;
381
TR_DataCache * _reservedDataCache;
382
uintptr_t _timeWhenCompStarted;
383
int32_t _numJITCompilations; // num JIT compilations this thread has performed; AOT loads not counted
384
int32_t _qszWhenCompStarted; // size of compilation queue and compilation starts
385
386
/// Determines whether this compilation thread can be interrupted the compile at the next yield point. A different
387
/// thread may still request that the compilation _should_ be interrupted, however we may not be in a state at
388
/// which we _can_ interrupt.
389
bool _compilationCanBeInterrupted;
390
391
/// Counts the number of nested \see UninterruptibleOperation in the stack. An \see InterruptibleOperation can only
392
/// be issued if the depth of uninterruptable operations is 0.
393
int32_t _uninterruptableOperationDepth;
394
395
bool _addToJProfilingQueue;
396
397
volatile CompilationThreadState _compilationThreadState;
398
volatile CompilationThreadState _previousCompilationThreadState;
399
volatile uint8_t _compilationShouldBeInterrupted;
400
401
static TR::FILE *_perfFile; // used on Linux for perl tool support
402
403
#if defined(J9VM_OPT_JITSERVER)
404
ClientSessionData * _cachedClientDataPtr;
405
JITServer::ClientStream * _clientStream;
406
TR_PersistentMemory * _perClientPersistentMemory;
407
#endif /* defined(J9VM_OPT_JITSERVER) */
408
409
private:
410
void logCompilationSuccess(
411
J9VMThread *vmThread,
412
TR_J9VMBase & vm,
413
J9Method * method,
414
const TR::SegmentAllocator &scratchSegmentProvider,
415
TR_ResolvedMethod * compilee,
416
TR::Compilation *compiler,
417
TR_MethodMetaData *metadata,
418
TR_OptimizationPlan * optimizationPlan);
419
420
void processException(
421
J9VMThread *vmThread,
422
const TR::SegmentAllocator &scratchSegmentProvider,
423
TR::Compilation * compiler,
424
volatile bool & haveLockedClassUnloadMonitor,
425
const char *exceptionName
426
) throw();
427
428
void processExceptionCommonTasks(
429
J9VMThread *vmThread,
430
TR::SegmentAllocator const &scratchSegmentProvider,
431
TR::Compilation * compiler,
432
const char *exceptionName);
433
434
#if defined(TR_HOST_S390)
435
void outputVerboseMMapEntry(
436
TR_ResolvedMethod *compilee,
437
const struct ::tm &date,
438
const struct timeval &time,
439
void *startPC,
440
void *endPC,
441
const char *fmt,
442
const char *profiledString,
443
const char *compileString
444
);
445
void outputVerboseMMapEntries(
446
TR_ResolvedMethod *compilee,
447
TR_MethodMetaData *metaData,
448
const char *profiledString,
449
const char *compileString
450
);
451
#endif
452
453
}; // CompilationInfoPerThreadBase
454
}
455
456
//--------------------------------------------------------------------
457
// The following class will be use by the separate compilation threads
458
// TR::CompilationInfoPerThreadBase will be used by compilation on application thread
459
460
namespace TR
461
{
462
463
class CompilationInfoPerThread : public TR::CompilationInfoPerThreadBase
464
{
465
friend class TR::CompilationInfo;
466
public:
467
CompilationInfoPerThread(TR::CompilationInfo &compInfo, J9JITConfig *jitConfig, int32_t id, bool isDiagnosticThread);
468
bool initializationSucceeded() { return _initializationSucceeded; }
469
j9thread_t getOsThread() { return _osThread; }
470
void setOsThread(j9thread_t t) { _osThread = t; }
471
J9VMThread *getCompilationThread() {return _compilationThread;}
472
void setCompilationThread(J9VMThread *t) { _compilationThread = t; }
473
int32_t getCompThreadPriority() const { return _compThreadPriority; }
474
void setCompThreadPriority(int32_t priority) { _compThreadPriority = priority; }
475
int32_t changeCompThreadPriority(int32_t priority, int32_t locationCode);
476
TR::Monitor *getCompThreadMonitor() { return _compThreadMonitor; }
477
void run();
478
void processEntries();
479
virtual void processEntry(TR_MethodToBeCompiled &entry, J9::J9SegmentProvider &scratchSegmentProvider);
480
bool shouldPerformCompilation(TR_MethodToBeCompiled &entry);
481
void waitForWork();
482
void doSuspend();
483
void suspendCompilationThread();
484
void resumeCompilationThread();
485
void requeue(); // requeue only works for compilation on separate thread
486
virtual void setCompilationThreadState(CompilationThreadState v);
487
void waitForGCCycleMonitor(bool threadHasVMAccess);
488
char *getActiveThreadName() const { return _activeThreadName; }
489
char *getSuspendedThreadName() const { return _suspendedThreadName; }
490
int64_t getLastTimeThreadWasSuspended() const { return _lastTimeThreadWasSuspended; }
491
void setLastTimeThreadWasSuspended(int64_t t) { _lastTimeThreadWasSuspended = t; }
492
int64_t getLastTimeThreadWentToSleep() const { return _lastTimeThreadWentToSleep; }
493
void setLastTimeThreadWentToSleep(int64_t t) { _lastTimeThreadWentToSleep = t; }
494
int32_t getLastCompilationDuration() const { return _lastCompilationDuration; }
495
void setLastCompilationDuration(int32_t t) { _lastCompilationDuration = t; }
496
bool isDiagnosticThread() const { return _isDiagnosticThread; }
497
CpuSelfThreadUtilization& getCompThreadCPU() { return _compThreadCPU; }
498
TR::FILE *getRTLogFile() { return _rtLogFile; }
499
virtual void freeAllResources();
500
501
#if defined(J9VM_OPT_JITSERVER)
502
TR_J9ServerVM *getServerVM() const { return _serverVM; }
503
void setServerVM(TR_J9ServerVM *vm) { _serverVM = vm; }
504
TR_J9SharedCacheServerVM *getSharedCacheServerVM() const { return _sharedCacheServerVM; }
505
void setSharedCacheServerVM(TR_J9SharedCacheServerVM *vm) { _sharedCacheServerVM = vm; }
506
JITServer::ServerStream *getStream();
507
J9ROMClass *getAndCacheRemoteROMClass(J9Class *clazz);
508
J9ROMClass *getRemoteROMClassIfCached(J9Class *clazz);
509
PersistentUnorderedSet<TR_OpaqueClassBlock*> *getClassesThatShouldNotBeNewlyExtended() const { return _classesThatShouldNotBeNewlyExtended; }
510
#endif /* defined(J9VM_OPT_JITSERVER) */
511
512
protected:
513
J9::J9SegmentCache initializeSegmentCache(J9::J9SegmentProvider &segmentProvider);
514
515
j9thread_t _osThread;
516
J9VMThread *_compilationThread;
517
int32_t _compThreadPriority; // to reduce number of checks
518
TR::Monitor *_compThreadMonitor;
519
char *_activeThreadName; // name of thread when active
520
char *_suspendedThreadName; // name of thread when suspended
521
uint64_t _lastTimeThreadWasSuspended; // RAS; only accessed by the thread itself
522
uint64_t _lastTimeThreadWentToSleep; // RAS; only accessed by the thread itself
523
int32_t _lastCompilationDuration; // wall clock, ms
524
bool _initializationSucceeded;
525
bool _isDiagnosticThread;
526
CpuSelfThreadUtilization _compThreadCPU;
527
TR::FILE *_rtLogFile;
528
#if defined(J9VM_OPT_JITSERVER)
529
TR_J9ServerVM *_serverVM;
530
TR_J9SharedCacheServerVM *_sharedCacheServerVM;
531
// The following hastable caches <classLoader,classname> --> <J9Class> mappings
532
// The cache only lives during a compilation due to class unloading concerns
533
PersistentUnorderedSet<TR_OpaqueClassBlock*> *_classesThatShouldNotBeNewlyExtended;
534
#endif /* defined(J9VM_OPT_JITSERVER) */
535
536
}; // CompilationInfoPerThread
537
538
#if defined(J9VM_OPT_JITSERVER)
539
extern thread_local TR::CompilationInfoPerThread * compInfoPT;
540
#endif /* defined(J9VM_OPT_JITSERVER) */
541
542
} // namespace TR
543
544
#endif // COMPILATIONTHREAD_INCL
545
546