CACAO
management.cpp
Go to the documentation of this file.
1  /* src/native/vm/openjdk/management.cpp - HotSpot management interface functions
2 
3  Copyright (C) 1996-2013
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5  Copyright (C) 2008, 2009 Theobroma Systems Ltd.
6 
7  This file is part of CACAO.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2, or (at
12  your option) any later version.
13 
14  This program is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  02110-1301, USA.
23 
24 */
25 
26 
27 #include "config.h"
28 
29 // Include our JNI header before the JMM header, because the JMM
30 // header include jni.h and we want to override the typedefs in jni.h.
31 #include "native/jni.hpp"
32 
33 #include INCLUDE_JMM_H
34 
36 
37 #include "threads/threadlist.hpp"
38 
39 #include "toolbox/logging.hpp"
40 
41 #include "vm/array.hpp"
42 #include "vm/classcache.hpp"
43 #include "vm/globals.hpp" // XXX Remove!!!
44 #include "vm/options.hpp"
45 #include "vm/os.hpp"
46 #include "vm/vm.hpp"
47 
48 
49 /* debugging macros ***********************************************************/
50 
51 #if !defined(NDEBUG)
52 
53 # define TRACEJMMCALLS(x) \
54  do { \
55  if (opt_TraceJMMCalls) { \
56  log_println x; \
57  } \
58  } while (0)
59 
60 #else
61 
62 # define TRACEJMMCALLS(x)
63 
64 #endif
65 
66 
67 /**
68  * Initialize the Management subsystem.
69  */
71 {
72  // Initialize optional support
73  _optional_support.isLowMemoryDetectionSupported = 1;
74  _optional_support.isCompilationTimeMonitoringSupported = 1;
75  _optional_support.isThreadContentionMonitoringSupported = 1;
76 
77 // if (os::is_thread_cpu_time_supported()) {
78  if (false) {
79  _optional_support.isCurrentThreadCpuTimeSupported = 1;
80  _optional_support.isOtherThreadCpuTimeSupported = 1;
81  }
82  else {
83  _optional_support.isCurrentThreadCpuTimeSupported = 0;
84  _optional_support.isOtherThreadCpuTimeSupported = 0;
85  }
86 
87  _optional_support.isBootClassPathSupported = 1;
88  _optional_support.isObjectMonitorUsageSupported = 1;
89  _optional_support.isSynchronizerUsageSupported = 1;
90 }
91 
92 
93 /**
94  * Return a pointer to the optional support structure.
95  *
96  * @param Pointer to optional support structure.
97  */
98 const jmmOptionalSupport& Management::get_optional_support() const
99 {
100  return _optional_support;
101 }
102 
103 
104 // Interface functions are exported as C functions.
105 extern "C" {
106 
108 {
109  return JMM_VERSION;
110 }
111 
112 
113 jint jmm_GetOptionalSupport(JNIEnv* env, jmmOptionalSupport* support)
114 {
115  if (support == NULL) {
116  return -1;
117  }
118 
119  Management& mm = VM::get_current()->get_management();
120 
121  // memcpy the structure.
122  os::memcpy(support, &mm.get_optional_support(), sizeof(jmmOptionalSupport));
123 
124  return 0;
125 }
126 
127 
129 {
130  log_println("jmm_GetInputArguments: IMPLEMENT ME!");
131  return NULL;
132 }
133 
134 
136 {
137  log_println("jmm_GetInputArgumentArray: IMPLEMENT ME!");
138  return NULL;
139 }
140 
141 
143 {
144  TRACEJMMCALLS(("jmm_GetMemoryPools(env=%p, obj=%p)", env, obj));
145 
146  // XXX This should be an array of java/lang/management/MemoryPoolMXBean.
147  log_println("jmm_GetMemoryPools: FIX ME!");
149 
150  return oa.get_handle();
151 }
152 
153 
155 {
156  TRACEJMMCALLS(("jmm_GetMemoryManagers(env=%p, obj=%p)", env, obj));
157 
158  // XXX This should be an array of java/lang/management/MemoryManagerMXBean.
159  log_println("jmm_GetMemoryManagers: FIX ME!");
161 
162  return oa.get_handle();
163 }
164 
165 
167 {
168  log_println("jmm_GetMemoryPoolUsage: IMPLEMENT ME!");
169  return NULL;
170 }
171 
172 
174 {
175  log_println("jmm_GetPeakMemoryPoolUsage: IMPLEMENT ME!");
176  return NULL;
177 }
178 
179 
181 {
182  log_println("jmm_GetPoolCollectionUsage: IMPLEMENT ME!");
183  return NULL;
184 }
185 
186 
187 void jmm_SetPoolSensor(JNIEnv* env, jobject obj, jmmThresholdType type, jobject sensorObj)
188 {
189  log_println("jmm_SetPoolSensor: IMPLEMENT ME!");
190 }
191 
192 
193 jlong jmm_SetPoolThreshold(JNIEnv* env, jobject obj, jmmThresholdType type, jlong threshold)
194 {
195  log_println("jmm_SetPoolThreshold: IMPLEMENT ME!");
196  return 0;
197 }
198 
199 
200 jobject jmm_GetMemoryUsage(JNIEnv* env, jboolean heap)
201 {
202  log_println("jmm_GetMemoryUsage: IMPLEMENT ME!");
203  return NULL;
204 }
205 
206 
207 jboolean jmm_GetBoolAttribute(JNIEnv* env, jmmBoolAttribute att)
208 {
209  TRACEJMMCALLS(("jmm_GetBoolAttribute(env=%p, att=%d)", env, att));
210 
211  jboolean result;
212 
213  switch (att) {
214  case JMM_VERBOSE_GC:
215  result = opt_verbosegc;
216  break;
217  case JMM_VERBOSE_CLASS:
218  result = opt_verboseclass;
219  break;
220  default:
221  log_println("jmm_GetBoolAttribute: Unknown attribute %d", att);
222  return false;
223  }
224 
225  return result;
226 }
227 
228 
229 jboolean jmm_SetBoolAttribute(JNIEnv* env, jmmBoolAttribute att, jboolean flag)
230 {
231  TRACEJMMCALLS(("jmm_SetBoolAttribute(env=%p, att=%d, flag=%d)", env, att, flag));
232 
233  switch (att) {
234  case JMM_VERBOSE_GC:
235  opt_verbosegc = flag;
236  break;
237  case JMM_VERBOSE_CLASS:
238  opt_verboseclass = flag;
239  break;
240  default:
241  log_println("jmm_SetBoolAttribute: Unknown attribute %d", att);
242  return false;
243  }
244 
245  return true;
246 }
247 
248 
249 jlong jmm_GetLongAttribute(JNIEnv* env, jobject obj, jmmLongAttribute att)
250 {
251  TRACEJMMCALLS(("jmm_GetLongAttribute(env=%p, obj=%p, att=%d)", env, obj, att));
252 
253  jlong result;
254 
255  switch (att) {
256  case JMM_CLASS_LOADED_COUNT:
258  break;
259  case JMM_CLASS_UNLOADED_COUNT:
260  // XXX Fix this once we support class unloading!
261  result = 0;
262  break;
263  case JMM_THREAD_TOTAL_COUNT:
265  break;
266  case JMM_THREAD_LIVE_COUNT:
268  break;
269  case JMM_THREAD_PEAK_COUNT:
271  break;
272  case JMM_THREAD_DAEMON_COUNT:
274  break;
275  case JMM_JVM_INIT_DONE_TIME_MS:
276  result = VM::get_current()->get_inittime();
277  break;
278  case JMM_OS_PROCESS_ID:
279  result = os::getpid();
280  break;
281  default:
282  log_println("jmm_GetLongAttribute: Unknown attribute %d", att);
283  return -1;
284  }
285 
286  return result;
287 }
288 
289 
290 jint jmm_GetLongAttributes(JNIEnv* env, jobject obj, jmmLongAttribute* atts, jint count, jlong* result)
291 {
292  log_println("jmm_GetLongAttributes: IMPLEMENT ME!");
293  return 0;
294 }
295 
296 
297 jint jmm_GetThreadInfo(JNIEnv* env, jlongArray ids, jint maxDepth, jobjectArray infoArray)
298 {
299  log_println("jmm_GetThreadInfo: IMPLEMENT ME!");
300  return 0;
301 }
302 
303 
304 jobjectArray jmm_DumpThreads(JNIEnv* env, jlongArray thread_ids, jboolean locked_monitors, jboolean locked_synchronizers)
305 {
306  log_println("jmm_DumpThreads: IMPLEMENT ME!");
307  return NULL;
308 }
309 
310 
312 {
313  log_println("jmm_GetLoadedClasses: IMPLEMENT ME!");
314  return NULL;
315 }
316 
317 
318 jboolean jmm_ResetStatistic(JNIEnv* env, jvalue obj, jmmStatisticType type)
319 {
320  TRACEJMMCALLS(("jmm_ResetStatistic(env=%p, obj=%p, type=%d)", env, obj, type));
321 
322  switch (type) {
323  case JMM_STAT_PEAK_THREAD_COUNT:
325  break;
326  default:
327  log_println("jmm_ResetStatistic: Unknown statistic type %d", type);
328  return false;
329  }
330 
331  return true;
332 }
333 
334 
335 jlong jmm_GetThreadCpuTime(JNIEnv* env, jlong thread_id)
336 {
337  log_println("jmm_GetThreadCpuTime: IMPLEMENT ME!");
338  return 0;
339 }
340 
341 
342 jlong jmm_GetThreadCpuTimeWithKind(JNIEnv* env, jlong thread_id, jboolean user_sys_cpu_time)
343 {
344  log_println("jmm_GetThreadCpuTimeWithKind: IMPLEMENT ME!");
345  return 0;
346 }
347 
348 
350 {
351  log_println("jmm_GetVMGlobalNames: IMPLEMENT ME!");
352  return NULL;
353 }
354 
355 
356 jint jmm_GetVMGlobals(JNIEnv* env, jobjectArray names, jmmVMGlobal* globals, jint count)
357 {
358  log_println("jmm_GetVMGlobals: IMPLEMENT ME!");
359  return 0;
360 }
361 
362 
363 void jmm_SetVMGlobal(JNIEnv* env, jstring flag_name, jvalue new_value)
364 {
365  log_println("jmm_SetVMGlobal: IMPLEMENT ME!");
366 }
367 
368 
370 {
371  log_println("jmm_GetInternalThreadTimes: IMPLEMENT ME!");
372  return 0;
373 }
374 
375 
376 jobjectArray jmm_FindDeadlockedThreads(JNIEnv* env, jboolean object_monitors_only)
377 {
378  log_println("jmm_FindDeadlockedThreads: IMPLEMENT ME!");
379  return NULL;
380 }
381 
382 
384 {
385  log_println("jmm_FindMonitorDeadlockedThreads: IMPLEMENT ME!");
386  return NULL;
387 }
388 
389 
390 jint jmm_GetGCExtAttributeInfo(JNIEnv* env, jobject mgr, jmmExtAttributeInfo* info, jint count)
391 {
392  log_println("jmm_GetGCExtAttributeInfo: IMPLEMENT ME!");
393  return 0;
394 }
395 
396 
397 void jmm_GetLastGCStat(JNIEnv* env, jobject obj, jmmGCStat* gc_stat)
398 {
399  log_println("jmm_GetLastGCStat: IMPLEMENT ME!");
400 }
401 
402 
403 jint jmm_DumpHeap0(JNIEnv* env, jstring outputfile, jboolean live)
404 {
405  log_println("jmm_DumpHeap0: IMPLEMENT ME!");
406  return 0;
407 }
408 
409 } // extern "C"
410 
411 
412 const struct jmmInterface_1_ jmm_interface = {
413  NULL,
414  NULL,
424  NULL,
442  NULL,
446  NULL,
448 };
449 
450 
451 /**
452  * Return the requested management interface.
453  *
454  * @param version Requested management interface version.
455  *
456  * @return Pointer to management interface structure.
457  */
459 {
460  if (version == JMM_VERSION_1_0) {
461  return (void*) &jmm_interface;
462  }
463 
464  return NULL;
465 }
466 
467 /*
468  * These are local overrides for various environment variables in Emacs.
469  * Please do not remove this and leave it at the end of the file, where
470  * Emacs will automagically detect them.
471  * ---------------------------------------------------------------------
472  * Local variables:
473  * mode: c++
474  * indent-tabs-mode: t
475  * c-basic-offset: 4
476  * tab-width: 4
477  * End:
478  * vim:noexpandtab:sw=4:ts=4:
479  */
LiveInSetTy & live
Management support.
Definition: management.hpp:37
static pid_t getpid(void)
Definition: os.hpp:438
_Jv_JNIEnv JNIEnv
Definition: jni.hpp:112
virtual java_handle_array_t * get_handle() const
Definition: array.hpp:103
jlong jmm_GetThreadCpuTimeWithKind(JNIEnv *env, jlong thread_id, jboolean user_sys_cpu_time)
Definition: management.cpp:342
jobjectArray jmm_FindMonitorDeadlockedThreads(JNIEnv *env)
Definition: management.cpp:383
jobject jmm_GetInputArguments(JNIEnv *env)
Definition: management.cpp:128
static void * get_jmm_interface(int version)
Return the requested management interface.
Definition: management.cpp:458
int64_t get_inittime()
Definition: vm.hpp:111
void jmm_GetLastGCStat(JNIEnv *env, jobject obj, jmmGCStat *gc_stat)
Definition: management.cpp:397
jobjectArray jmm_GetInputArgumentArray(JNIEnv *env)
Definition: management.cpp:135
jobject jmm_GetPeakMemoryPoolUsage(JNIEnv *env, jobject obj)
Definition: management.cpp:173
jobjectArray jmm_GetVMGlobalNames(JNIEnv *env)
Definition: management.cpp:349
Actual implementation of access class for Java Object arrays.
Definition: array.hpp:381
jobjectArray jmm_GetLoadedClasses(JNIEnv *env)
Definition: management.cpp:311
void jmm_SetPoolSensor(JNIEnv *env, jobject obj, jmmThresholdType type, jobject sensorObj)
Definition: management.cpp:187
jobject jmm_GetMemoryPoolUsage(JNIEnv *env, jobject obj)
Definition: management.cpp:166
int32_t get_number_of_daemon_java_threads()
Return the number of daemon threads visible to Java.
Definition: threadlist.cpp:164
const jmmOptionalSupport & get_optional_support() const
Return a pointer to the optional support structure.
Definition: management.cpp:98
jobject jmm_GetMemoryUsage(JNIEnv *env, jboolean heap)
Definition: management.cpp:200
void log_println(const char *text,...)
Definition: logging.cpp:193
jobjectArray jmm_GetMemoryPools(JNIEnv *env, jobject obj)
Definition: management.cpp:142
jint jmm_GetOptionalSupport(JNIEnv *env, jmmOptionalSupport *support)
Definition: management.cpp:113
Management()
Initialize the Management subsystem.
Definition: management.cpp:70
jobjectArray jmm_DumpThreads(JNIEnv *env, jlongArray thread_ids, jboolean locked_monitors, jboolean locked_synchronizers)
Definition: management.cpp:304
#define TRACEJMMCALLS(x)
Definition: management.cpp:53
void reset_peak_of_active_java_threads()
Definition: threadlist.hpp:174
int32_t get_peak_of_active_java_threads()
Definition: threadlist.hpp:167
jlong jmm_GetThreadCpuTime(JNIEnv *env, jlong thread_id)
Definition: management.cpp:335
static ThreadList * get()
Provides access to singleton.
Definition: threadlist.hpp:62
struct jmmInterface_1_ jmm_interface
Definition: management.cpp:412
jint jmm_GetVMGlobals(JNIEnv *env, jobjectArray names, jmmVMGlobal *globals, jint count)
Definition: management.cpp:356
static void version(bool opt_exit)
Definition: vm.cpp:529
void jmm_SetVMGlobal(JNIEnv *env, jstring flag_name, jvalue new_value)
Definition: management.cpp:363
int32_t get_number_of_active_java_threads()
Definition: threadlist.hpp:160
jint jmm_GetInternalThreadTimes(JNIEnv *env, jobjectArray names, jlongArray times)
Definition: management.cpp:369
jobject jmm_GetPoolCollectionUsage(JNIEnv *env, jobject obj)
Definition: management.cpp:180
bool opt_verbosegc
Definition: options.cpp:74
static void * memcpy(void *dest, const void *src, size_t n)
Definition: os.hpp:492
jint jmm_GetGCExtAttributeInfo(JNIEnv *env, jobject mgr, jmmExtAttributeInfo *info, jint count)
Definition: management.cpp:390
jint jmm_GetVersion(JNIEnv *env)
Definition: management.cpp:107
jmmOptionalSupport _optional_support
Definition: management.hpp:39
bool opt_verboseclass
Definition: options.cpp:73
jobjectArray jmm_GetMemoryManagers(JNIEnv *env, jobject obj)
Definition: management.cpp:154
classinfo * class_java_lang_String
Definition: globals.cpp:39
jobjectArray jmm_FindDeadlockedThreads(JNIEnv *env, jboolean object_monitors_only)
Definition: management.cpp:376
jint jmm_DumpHeap0(JNIEnv *env, jstring outputfile, jboolean live)
Definition: management.cpp:403
JNIEnv jthread jmethodID jlocation jclass jobject jfieldID char jvalue new_value
Definition: jvmti.h:231
jint jmm_GetLongAttributes(JNIEnv *env, jobject obj, jmmLongAttribute *atts, jint count, jlong *result)
Definition: management.cpp:290
jlong jmm_GetLongAttribute(JNIEnv *env, jobject obj, jmmLongAttribute att)
Definition: management.cpp:249
alloc::map< PassInfo::IDTy, const char * >::type names
jboolean jmm_ResetStatistic(JNIEnv *env, jvalue obj, jmmStatisticType type)
Definition: management.cpp:318
jint jmm_GetThreadInfo(JNIEnv *env, jlongArray ids, jint maxDepth, jobjectArray infoArray)
Definition: management.cpp:297
s4 classcache_get_loaded_class_count(void)
int32_t get_number_of_started_java_threads()
Definition: threadlist.hpp:153
jboolean jmm_GetBoolAttribute(JNIEnv *env, jmmBoolAttribute att)
Definition: management.cpp:207
jboolean jmm_SetBoolAttribute(JNIEnv *env, jmmBoolAttribute att, jboolean flag)
Definition: management.cpp:229
jlong jmm_SetPoolThreshold(JNIEnv *env, jobject obj, jmmThresholdType type, jlong threshold)
Definition: management.cpp:193
static VM * get_current()
Definition: vm.hpp:99