* src/vm/jit/codegen-common.cpp, src/vm/jit/x86_64/codegen.c: Generate
[cacao.git] / src / native / vm / gnuclasspath / java_lang_VMRuntime.cpp
1 /* src/native/vm/gnuclasspath/java_lang_VMRuntime.cpp
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #include "config.h"
27
28 #include <assert.h>
29 #include <string.h>
30 #include <stdint.h>
31 #include <stdlib.h>
32 #include <unistd.h>
33 #include <sys/utsname.h>
34
35 #if defined(__DARWIN__)
36 # if defined(__POWERPC__)
37 #  define OS_INLINE    /* required for <libkern/ppc/OSByteOrder.h> */
38 # endif
39 # include <mach/mach.h>
40 #endif
41
42 #include "mm/memory.hpp"
43 #include "mm/gc.hpp"
44
45 #include "native/jni.hpp"
46 #include "native/native.hpp"
47
48 #if defined(ENABLE_JNI_HEADERS)
49 # include "native/vm/include/java_lang_VMRuntime.h"
50 #endif
51
52 #include "vm/jit/builtin.hpp"
53 #include "vm/exceptions.hpp"
54 #include "vm/os.hpp"
55 #include "vm/string.hpp"
56 #include "vm/utf8.h"
57 #include "vm/vm.hpp"
58
59
60 static bool finalizeOnExit = false;
61
62
63 // Native functions are exported as C functions.
64 extern "C" {
65
66 /*
67  * Class:     java/lang/VMRuntime
68  * Method:    exit
69  * Signature: (I)V
70  */
71 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_exit(JNIEnv *env, jclass clazz, jint status)
72 {
73         if (finalizeOnExit)
74                 gc_finalize_all();
75
76         vm_shutdown(status);
77 }
78
79
80 /*
81  * Class:     java/lang/VMRuntime
82  * Method:    freeMemory
83  * Signature: ()J
84  */
85 JNIEXPORT jlong JNICALL Java_java_lang_VMRuntime_freeMemory(JNIEnv *env, jclass clazz)
86 {
87         return gc_get_free_bytes();
88 }
89
90
91 /*
92  * Class:     java/lang/VMRuntime
93  * Method:    totalMemory
94  * Signature: ()J
95  */
96 JNIEXPORT jlong JNICALL Java_java_lang_VMRuntime_totalMemory(JNIEnv *env, jclass clazz)
97 {
98         return gc_get_heap_size();
99 }
100
101
102 /*
103  * Class:     java/lang/VMRuntime
104  * Method:    maxMemory
105  * Signature: ()J
106  */
107 JNIEXPORT jlong JNICALL Java_java_lang_VMRuntime_maxMemory(JNIEnv *env, jclass clazz)
108 {
109         return gc_get_max_heap_size();
110 }
111
112
113 /*
114  * Class:     java/lang/VMRuntime
115  * Method:    gc
116  * Signature: ()V
117  */
118 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_gc(JNIEnv *env, jclass clazz)
119 {
120         gc_call();
121 }
122
123
124 /*
125  * Class:     java/lang/VMRuntime
126  * Method:    runFinalization
127  * Signature: ()V
128  */
129 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalization(JNIEnv *env, jclass clazz)
130 {
131         gc_invoke_finalizers();
132 }
133
134
135 /*
136  * Class:     java/lang/VMRuntime
137  * Method:    runFinalizersOnExit
138  * Signature: (Z)V
139  */
140 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizersOnExit(JNIEnv *env, jclass clazz, jboolean value)
141 {
142         /* XXX threading */
143
144         finalizeOnExit = value;
145 }
146
147
148 /*
149  * Class:     java/lang/VMRuntime
150  * Method:    runFinalizationsForExit
151  * Signature: ()V
152  */
153 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_runFinalizationForExit(JNIEnv *env, jclass clazz)
154 {
155 /*      if (finalizeOnExit) { */
156 /*              gc_call(); */
157         /* gc_finalize_all(); */
158 /*      } */
159 /*      log_text("Java_java_lang_VMRuntime_runFinalizationForExit called"); */
160         /*gc_finalize_all();*/
161         /*gc_invoke_finalizers();*/
162         /*gc_call();*/
163 }
164
165
166 /*
167  * Class:     java/lang/VMRuntime
168  * Method:    traceInstructions
169  * Signature: (Z)V
170  */
171 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_traceInstructions(JNIEnv *env, jclass clazz, jboolean par1)
172 {
173         /* not supported */
174 }
175
176
177 /*
178  * Class:     java/lang/VMRuntime
179  * Method:    traceMethodCalls
180  * Signature: (Z)V
181  */
182 JNIEXPORT void JNICALL Java_java_lang_VMRuntime_traceMethodCalls(JNIEnv *env, jclass clazz, jboolean par1)
183 {
184         /* not supported */
185 }
186
187
188 /*
189  * Class:     java/lang/VMRuntime
190  * Method:    availableProcessors
191  * Signature: ()I
192  */
193 JNIEXPORT jint JNICALL Java_java_lang_VMRuntime_availableProcessors(JNIEnv *env, jclass clazz)
194 {
195         return os::processors_online();
196 }
197
198
199 /*
200  * Class:     java/lang/VMRuntime
201  * Method:    nativeLoad
202  * Signature: (Ljava/lang/String;Ljava/lang/ClassLoader;)I
203  */
204 JNIEXPORT jint JNICALL Java_java_lang_VMRuntime_nativeLoad(JNIEnv *env, jclass clazz, jstring libname, jobject loader)
205 {
206         classloader_t* cl = loader_hashtable_classloader_add((java_handle_t *) loader);
207
208         /* REMOVEME When we use Java-strings internally. */
209
210         if (libname == NULL) {
211                 exceptions_throw_nullpointerexception();
212                 return 0;
213         }
214
215         utf* name = javastring_toutf((java_handle_t *) libname, false);
216
217         NativeLibrary library(name, cl);
218         return library.load(env);
219 }
220
221
222 /*
223  * Class:     java/lang/VMRuntime
224  * Method:    mapLibraryName
225  * Signature: (Ljava/lang/String;)Ljava/lang/String;
226  */
227 JNIEXPORT jstring JNICALL Java_java_lang_VMRuntime_mapLibraryName(JNIEnv *env, jclass clazz, jstring libname)
228 {
229         utf           *u;
230         char          *buffer;
231         int32_t        buffer_len;
232         java_handle_t *o;
233
234         if (libname == NULL) {
235                 exceptions_throw_nullpointerexception();
236                 return NULL;
237         }
238
239         u = javastring_toutf((java_handle_t *) libname, false);
240
241         /* calculate length of library name */
242
243         buffer_len =
244                 strlen(NATIVE_LIBRARY_PREFIX) +
245                 utf_bytes(u) +
246                 strlen(NATIVE_LIBRARY_SUFFIX) +
247                 strlen("0");
248
249         buffer = MNEW(char, buffer_len);
250
251         /* generate library name */
252
253         strcpy(buffer, NATIVE_LIBRARY_PREFIX);
254         utf_cat(buffer, u);
255         strcat(buffer, NATIVE_LIBRARY_SUFFIX);
256
257         o = javastring_new_from_utf_string(buffer);
258
259         /* release memory */
260
261         MFREE(buffer, char, buffer_len);
262
263         return (jstring) o;
264 }
265
266 } // extern "C"
267
268
269 /* native methods implemented by this file ************************************/
270
271 static JNINativeMethod methods[] = {
272         { (char*) "exit",                   (char*) "(I)V",                                         (void*) (uintptr_t) &Java_java_lang_VMRuntime_exit                   },
273         { (char*) "freeMemory",             (char*) "()J",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_freeMemory             },
274         { (char*) "totalMemory",            (char*) "()J",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_totalMemory            },
275         { (char*) "maxMemory",              (char*) "()J",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_maxMemory              },
276         { (char*) "gc",                     (char*) "()V",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_gc                     },
277         { (char*) "runFinalization",        (char*) "()V",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_runFinalization        },
278         { (char*) "runFinalizersOnExit",    (char*) "(Z)V",                                         (void*) (uintptr_t) &Java_java_lang_VMRuntime_runFinalizersOnExit    },
279         { (char*) "runFinalizationForExit", (char*) "()V",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_runFinalizationForExit },
280         { (char*) "traceInstructions",      (char*) "(Z)V",                                         (void*) (uintptr_t) &Java_java_lang_VMRuntime_traceInstructions      },
281         { (char*) "traceMethodCalls",       (char*) "(Z)V",                                         (void*) (uintptr_t) &Java_java_lang_VMRuntime_traceMethodCalls       },
282         { (char*) "availableProcessors",    (char*) "()I",                                          (void*) (uintptr_t) &Java_java_lang_VMRuntime_availableProcessors    },
283         { (char*) "nativeLoad",             (char*) "(Ljava/lang/String;Ljava/lang/ClassLoader;)I", (void*) (uintptr_t) &Java_java_lang_VMRuntime_nativeLoad             },
284         { (char*) "mapLibraryName",         (char*) "(Ljava/lang/String;)Ljava/lang/String;",       (void*) (uintptr_t) &Java_java_lang_VMRuntime_mapLibraryName         },
285 };
286
287
288 /* _Jv_java_lang_VMRuntime_init ************************************************
289
290    Register native functions.
291
292 *******************************************************************************/
293
294 void _Jv_java_lang_VMRuntime_init(void)
295 {
296         utf* u = utf_new_char("java/lang/VMRuntime");
297
298         NativeMethods& nm = VM::get_current()->get_nativemethods();
299         nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
300 }
301
302
303 /*
304  * These are local overrides for various environment variables in Emacs.
305  * Please do not remove this and leave it at the end of the file, where
306  * Emacs will automagically detect them.
307  * ---------------------------------------------------------------------
308  * Local variables:
309  * mode: c++
310  * indent-tabs-mode: t
311  * c-basic-offset: 4
312  * tab-width: 4
313  * End:
314  * vim:noexpandtab:sw=4:ts=4:
315  */