1/*
2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package org.graalvm.compiler.debug;
24
25import static java.lang.Thread.currentThread;
26
27public class Management {
28
29    private static final com.sun.management.ThreadMXBean threadMXBean = Management.initThreadMXBean();
30
31    /**
32     * The amount of memory allocated by
33     * {@link com.sun.management.ThreadMXBean#getThreadAllocatedBytes(long)} itself.
34     */
35    private static final long threadMXBeanOverhead = -getCurrentThreadAllocatedBytes() + getCurrentThreadAllocatedBytes();
36
37    public static long getCurrentThreadAllocatedBytes() {
38        return threadMXBean.getThreadAllocatedBytes(currentThread().getId()) - threadMXBeanOverhead;
39    }
40
41    private static com.sun.management.ThreadMXBean initThreadMXBean() {
42        try {
43            return (com.sun.management.ThreadMXBean) java.lang.management.ManagementFactory.getThreadMXBean();
44        } catch (Error err) {
45            return new UnimplementedBean();
46        }
47    }
48
49    public static java.lang.management.ThreadMXBean getThreadMXBean() {
50        return threadMXBean;
51    }
52
53    private static class UnimplementedBean implements java.lang.management.ThreadMXBean, com.sun.management.ThreadMXBean {
54
55        @Override
56        public javax.management.ObjectName getObjectName() {
57            return null;
58        }
59
60        @Override
61        public long getThreadAllocatedBytes(long arg0) {
62            return 0;
63        }
64
65        @Override
66        public long[] getThreadAllocatedBytes(long[] arg0) {
67            return null;
68        }
69
70        @Override
71        public long[] getThreadCpuTime(long[] arg0) {
72            return null;
73        }
74
75        @Override
76        public long[] getThreadUserTime(long[] arg0) {
77            return null;
78        }
79
80        @Override
81        public boolean isThreadAllocatedMemoryEnabled() {
82            return false;
83        }
84
85        @Override
86        public boolean isThreadAllocatedMemorySupported() {
87            return false;
88        }
89
90        @Override
91        public void setThreadAllocatedMemoryEnabled(boolean arg0) {
92        }
93
94        @Override
95        public int getThreadCount() {
96            return 0;
97        }
98
99        @Override
100        public int getPeakThreadCount() {
101            return 0;
102        }
103
104        @Override
105        public long getTotalStartedThreadCount() {
106            return 0;
107        }
108
109        @Override
110        public int getDaemonThreadCount() {
111            return 0;
112        }
113
114        @Override
115        public long[] getAllThreadIds() {
116            return null;
117        }
118
119        @Override
120        public java.lang.management.ThreadInfo getThreadInfo(long id) {
121            return null;
122        }
123
124        @Override
125        public java.lang.management.ThreadInfo[] getThreadInfo(long[] ids) {
126            return null;
127        }
128
129        @Override
130        public java.lang.management.ThreadInfo getThreadInfo(long id, int maxDepth) {
131            return null;
132        }
133
134        @Override
135        public java.lang.management.ThreadInfo[] getThreadInfo(long[] ids, int maxDepth) {
136            return null;
137        }
138
139        @Override
140        public boolean isThreadContentionMonitoringSupported() {
141            return false;
142        }
143
144        @Override
145        public boolean isThreadContentionMonitoringEnabled() {
146            return false;
147        }
148
149        @Override
150        public void setThreadContentionMonitoringEnabled(boolean enable) {
151        }
152
153        @Override
154        public long getCurrentThreadCpuTime() {
155            return 0;
156        }
157
158        @Override
159        public long getCurrentThreadUserTime() {
160            return 0;
161        }
162
163        @Override
164        public long getThreadCpuTime(long id) {
165            return 0;
166        }
167
168        @Override
169        public long getThreadUserTime(long id) {
170            return 0;
171        }
172
173        @Override
174        public boolean isThreadCpuTimeSupported() {
175            return false;
176        }
177
178        @Override
179        public boolean isCurrentThreadCpuTimeSupported() {
180            return false;
181        }
182
183        @Override
184        public boolean isThreadCpuTimeEnabled() {
185            return false;
186        }
187
188        @Override
189        public void setThreadCpuTimeEnabled(boolean enable) {
190        }
191
192        @Override
193        public long[] findMonitorDeadlockedThreads() {
194            return null;
195        }
196
197        @Override
198        public void resetPeakThreadCount() {
199        }
200
201        @Override
202        public long[] findDeadlockedThreads() {
203            return null;
204        }
205
206        @Override
207        public boolean isObjectMonitorUsageSupported() {
208            return false;
209        }
210
211        @Override
212        public boolean isSynchronizerUsageSupported() {
213            return false;
214        }
215
216        @Override
217        public java.lang.management.ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers) {
218            return null;
219        }
220
221        @Override
222        public java.lang.management.ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers) {
223            return null;
224        }
225    }
226}
227