/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.lang;
import java.util.ArrayList;
import java.util.List;
/*-[
#import "mach/mach.h"
]-*/
/**
* Simple iOS version of java.lang.Runtime. No code was shared, just its
* public API.
*
* @author Tom Ball
*/
public class Runtime {
private List<Thread> shutdownHooks = new ArrayList<Thread>();
/**
* Holds the Singleton global instance of Runtime.
*/
private static final Runtime instance = new Runtime();
private Runtime() {
registerShutdownHooks();
}
public static Runtime getRuntime() {
return instance;
}
public native int availableProcessors() /*-[
return (int) [[NSProcessInfo processInfo] processorCount];
]-*/;
public native void exit(int status) /*-[
// exit() calls any functions registered with atexit().
exit(status);
]-*/;
public native void halt(int status) /*-[
// _Exit() doesn't call any functions registered with atexit().
_Exit(status);
]-*/;
public void gc() {
// No garbage collector, so do nothing.
}
public native long maxMemory() /*-[
return (long long) [[NSProcessInfo processInfo] physicalMemory];
]-*/;
public native long totalMemory() /*-[
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &info, &size);
return (long long) (kerr == KERN_SUCCESS) ? info.resident_size : 0;
]-*/;
public native long freeMemory() /*-[
mach_port_t host_port = mach_host_self();
mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
vm_size_t pagesize;
vm_statistics_data_t vm_stat;
host_page_size(host_port, &pagesize);
(void) host_statistics(host_port, HOST_VM_INFO, (host_info_t) &vm_stat, &host_size);
return (long long) vm_stat.free_count * pagesize;
]-*/;
public void addShutdownHook(Thread hook) {
if (shutdownHooks == null) {
throw new IllegalStateException("shutdown in progress");
}
if (hook.isAlive()) {
throw new IllegalArgumentException("hook already started");
}
if (shutdownHooks.contains(hook)) {
throw new IllegalArgumentException("hook previously added");
}
shutdownHooks.add(hook);
}
public boolean removeShutdownHook(Thread hook) {
return shutdownHooks.remove(hook);
}
private void runShutdownHooks() {
for (Thread t : shutdownHooks) {
t.start();
}
shutdownHooks = null; // Indicates the hooks were started.
}
private native void registerShutdownHooks() /*-[
atexit_b(^{
[self runShutdownHooks];
});
]-*/;
/**
* No-op on iOS, since all code must be linked into app bundle.
*/
public void load(String absolutePath) {}
/**
* No-op on iOS, since all code must be linked into app bundle.
*/
public void loadLibrary(String nickname) {}
/**
* No-op on iOS, since it doesn't use garbage collection.
*/
public void runFinalization() {}
/**
* No-op on iOS.
*/
public void traceInstructions(boolean enable) {}
/**
* No-op on iOS.
*/
public void traceMethodCalls(boolean enable) {}
}