+/* src/native/vm/sun/hpi.c - HotSpot HPI interface functions
+
+ Copyright (C) 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+ This file is part of CACAO.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+*/
+
+
+#include "config.h"
+
+/* We include hpi_md.h before hpi.h as the latter includes the
+ former. */
+
+#include INCLUDE_HPI_MD_H
+#include INCLUDE_HPI_H
+
+#include "mm/memory.h"
+
+#include "native/jni.h"
+#include "native/native.h"
+
+#include "vm/properties.h"
+#include "vm/vm.h"
+
+#include "vmcore/options.h"
+#include "vmcore/system.h"
+#include "vmcore/utf8.h"
+
+
+/* VM callback functions ******************************************************/
+
+static vm_calls_t callbacks = {
+ /* TODO What should we use here? */
+/* jio_fprintf, */
+/* unimplemented_panic, */
+/* unimplemented_monitorRegister, */
+ NULL,
+ NULL,
+ NULL,
+
+ NULL, /* unused */
+ NULL, /* unused */
+ NULL /* unused */
+};
+
+
+/* HPI interfaces *************************************************************/
+
+GetInterfaceFunc hpi_get_interface = NULL;
+HPI_FileInterface *hpi_file = NULL;
+HPI_SocketInterface *hpi_socket = NULL;
+HPI_LibraryInterface *hpi_library = NULL;
+HPI_SystemInterface *hpi_system = NULL;
+
+
+/* hpi_initialize **************************************************************
+
+ Initialize the Host Porting Interface (HPI).
+
+*******************************************************************************/
+
+void hpi_initialize(void)
+{
+ char *boot_library_path;
+ int len;
+ char *p;
+ utf *u;
+ lt_dlhandle handle;
+ lt_ptr dll_initialize;
+ int result;
+ jint (JNICALL * DLL_Initialize)(GetInterfaceFunc *, void *);
+
+ TRACESUBSYSTEMINITIALIZATION("hpi_init");
+
+ /* Load libhpi.so */
+
+ boot_library_path = properties_get("sun.boot.library.path");
+
+ len =
+ system_strlen(boot_library_path) +
+ system_strlen("/native_threads/libhpi.so") +
+ system_strlen("0");
+
+ p = MNEW(char, len);
+
+ system_strcpy(p, boot_library_path);
+ system_strcat(p, "/native_threads/libhpi.so");
+
+ u = utf_new_char(p);
+
+ if (opt_TraceHPI)
+ log_println("hpi_init: Loading HPI %s ", p);
+
+ MFREE(p, char, len);
+
+ handle = native_library_open(u);
+
+ if (handle == NULL)
+ if (opt_TraceHPI)
+ vm_abort("hpi_init: HPI open failed");
+
+ /* Resolve the DLL_Initialize function from the library. */
+
+ dll_initialize = lt_dlsym(handle, "DLL_Initialize");
+
+ DLL_Initialize = (jint (JNICALL *)(GetInterfaceFunc *, void *)) (intptr_t) dll_initialize;
+
+ if (opt_TraceHPI && DLL_Initialize == NULL)
+ log_println("hpi_init: HPI dlsym of DLL_Initialize failed: %s", lt_dlerror());
+
+ if (DLL_Initialize == NULL ||
+ (*DLL_Initialize)(&hpi_get_interface, &callbacks) < 0) {
+
+ if (opt_TraceHPI)
+ vm_abort("hpi_init: HPI DLL_Initialize failed");
+ }
+
+ native_library_add(u, NULL, handle);
+
+ if (opt_TraceHPI)
+ log_println("hpi_init: HPI loaded successfully");
+
+ /* Resolve the interfaces. */
+
+ result = (*hpi_get_interface)((void **) &hpi_file, "File", 1);
+
+ if (result != 0)
+ vm_abort("hpi_init: Can't find HPI_FileInterface");
+
+ result = (*hpi_get_interface)((void **) &hpi_library, "Library", 1);
+
+ if (result != 0)
+ vm_abort("hpi_init: Can't find HPI_LibraryInterface");
+
+ result = (*hpi_get_interface)((void **) &hpi_system, "System", 1);
+
+ if (result != 0)
+ vm_abort("hpi_init: Can't find HPI_SystemInterface");
+}
+
+
+/* hpi_initialize_socket_library ***********************************************
+
+ Initialize the library Host Porting Interface (HPI).
+
+*******************************************************************************/
+
+int hpi_initialize_socket_library(void)
+{
+ int result;
+
+ /* Resolve the socket library interface. */
+
+ result = (*hpi_get_interface)((void **) &hpi_socket, "Socket", 1);
+
+ if (result != 0) {
+ if (opt_TraceHPI)
+ log_println("hpi_initialize_socket_library: Can't find HPI_SocketInterface");
+
+ return JNI_ERR;
+ }
+
+ return JNI_OK;
+}
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */