--- a/jdk/make/common/Defs-linux.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Defs-linux.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -75,15 +75,6 @@
CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required!
#
-# Default HPI libraries. Build will build only native, unless
-# overriden at the make command line. This makes it convenient for
-# people doing, say, a pthreads port -- they can create a posix
-# directory here, and say "gnumake HPIS=posix" at the top
-# level.
-#
-HPIS = native
-
-#
# Default optimization
#
--- a/jdk/make/common/Defs-solaris.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Defs-solaris.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -75,15 +75,6 @@
CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required!
#
-# Default HPI libraries. Build will build only native unless
-# overriden at the make command line. This makes it convenient for
-# people doing, say, a pthreads port -- they can create a posix
-# directory here, and say "gnumake HPIS=posix" at the top
-# level.
-#
-HPIS = native
-
-#
# Java default optimization (-x04/-O2) etc. Applies to the VM.
#
ifndef OPTIMIZATION_LEVEL
--- a/jdk/make/common/Defs-windows.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Defs-windows.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -43,7 +43,6 @@
# The suffix applied to scripts (.bat for windows, nothing for unix)
SCRIPT_SUFFIX = .bat
-HPIS = windows
# LIB_LOCATION, which for windows identifies where .exe files go, may be
# set by each GNUmakefile. The default is BINDIR.
ifndef LIB_LOCATION
--- a/jdk/make/common/Defs.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Defs.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -271,10 +271,9 @@
# An attempt is made to generate unique enough directories for the
# generated files to not have name collisisons. Most build units
# defines PRODUCT (except Release.gmk), but then they may or may
-# not define PACKAGE, THREADIR (only HPI uses this), PROGRAM, and
-# LIBRARY. This code chunk attempts to generate a unique
-# OBJDIR/CLASSHDRDIR for each build unit based on which of those
-# values are set within each build unit.
+# not define PACKAGE, PROGRAM, and LIBRARY. This code attempts to
+# generate a unique OBJDIR/CLASSHDRDIR for each build unit based
+# on which of those values are set within each build unit.
UNIQUE_LOCATION_STRING = tmp
@@ -298,10 +297,6 @@
endif
endif
-ifneq ($(THREADDIR),)
- UNIQUE_LOCATION_STRING += /$(THREADDIR)
-endif
-
#
# Build units may or may not define MODULE. Default to "other".
#
--- a/jdk/make/common/Modules.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Modules.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -222,7 +222,7 @@
@# Remove certain *.lib files
$(CD) $(JRE_MODULE_IMAGE_DIR)/lib && \
$(RM) java.$(LIB_SUFFIX) jvm.$(LIB_SUFFIX) \
- hpi.$(LIB_SUFFIX) awt.$(LIB_SUFFIX) jawt.$(LIB_SUFFIX)
+ awt.$(LIB_SUFFIX) jawt.$(LIB_SUFFIX)
ifeq ($(ARCH_DATA_MODEL), 32)
@# The Java Kernel JRE image ships with a special VM. It is not included
@# in the full JRE image, so remove it. Also, is it only for 32-bit windows.
@@ -415,8 +415,7 @@
trim-module-image-jdk::
@# Remove tools that should not be part of SDK.
for t in $(NOTJDKTOOLS); do \
- $(RM) $(JDK_MODULE_IMAGE_DIR)/bin/$${t}$(EXE_SUFFIX) \
- $(JDK_MODULE_IMAGE_DIR)/bin/*/native_threads/$${t}$(EXE_SUFFIX); \
+ $(RM) $(JDK_MODULE_IMAGE_DIR)/bin/$${t}$(EXE_SUFFIX); \
done
# Get list of Elf files in the jdk
--- a/jdk/make/common/Release.gmk Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/common/Release.gmk Fri Jan 07 15:49:44 2011 +0000
@@ -133,7 +133,6 @@
# absolute directory names: note, these must exist prior to build
# time - they are created in the main Makefile.
JRE_IMAGE_BINDIR = $(JRE_IMAGE_DIR)/bin
-JRE_IMAGE_THREADIR = $(JRE_IMAGE_DIR)/bin/*/native_threads
MAINMANIFEST = $(JDK_TOPDIR)/make/tools/manifest.mf
BEANMANIFEST = $(JDK_TOPDIR)/make/javax/swing/beaninfo/manifest
@@ -802,7 +801,7 @@
@# Remove certain *.lib files
$(CD) $(JRE_IMAGE_DIR)/lib && \
$(RM) java.$(LIB_SUFFIX) jvm.$(LIB_SUFFIX) \
- hpi.$(LIB_SUFFIX) awt.$(LIB_SUFFIX) jawt.$(LIB_SUFFIX)
+ awt.$(LIB_SUFFIX) jawt.$(LIB_SUFFIX)
ifeq ($(ARCH_DATA_MODEL), 32)
@# The Java Kernel JRE image ships with a special VM. It is not included
@# in the full JRE image, so remove it. Also, is it only for 32-bit windows.
@@ -1089,8 +1088,7 @@
trim-image-jdk::
@# Remove tools that should not be part of SDK.
for t in $(NOTJDKTOOLS); do \
- $(RM) $(JDK_IMAGE_DIR)/bin/$${t}$(EXE_SUFFIX) \
- $(JDK_IMAGE_DIR)/bin/*/native_threads/$${t}$(EXE_SUFFIX); \
+ $(RM) $(JDK_IMAGE_DIR)/bin/$${t}$(EXE_SUFFIX); \
done
# Get list of Elf files in the jdk
--- a/jdk/make/java/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/java/Makefile Fri Jan 07 15:49:44 2011 +0000
@@ -34,7 +34,7 @@
#
# The order of subdirs here is important
#
-SUBDIRS += hpi version jvm redist verify fdlibm java sun_nio jli main zip
+SUBDIRS += version jvm redist verify fdlibm java sun_nio jli main zip
# Others
# Note: java_crw_demo java_hprof_demo are demos but must be delivered built in sdk
--- a/jdk/make/java/fdlibm/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/java/fdlibm/Makefile Fri Jan 07 15:49:44 2011 +0000
@@ -24,7 +24,7 @@
#
#
-# Makefile for native threads HPI.
+# Makefile for fdlibm
#
# Note:
# The fdlibm libraries are built using special rules in Library.gmk.
--- a/jdk/make/java/hpi/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# Build HPI (Host Porting Interface) libraries
-#
-
-BUILDDIR = ../..
-include $(BUILDDIR)/common/Defs.gmk
-
-#
-# Build specified the HPI implementations
-#
-SUBDIRS = $(HPIS)
-include $(BUILDDIR)/common/Subdirs.gmk
-
-all build clean clobber::
- $(SUBDIRS-loop)
-
--- a/jdk/make/java/hpi/hpi_common.gmk Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# Shared files between the different threads types on Solaris. Be
-# careful when including this, you must get your variables right.
-#
-
-#
-# Common files on Solaris.
-#
-ifneq ($(PLATFORM), windows)
-FILES_c += \
- interrupt.c \
- linker_md.c \
- memory_md.c \
- system_md.c \
- hpi.c
-endif
-
-#
-# Include paths can also be shared.
-#
-ifneq ($(PLATFORM), windows)
-OTHER_INCLUDES += \
- -I$(PLATFORM_SRC)/hpi/$(THREADDIR)/include \
- -I$(PLATFORM_SRC)/hpi/include \
- -I$(PLATFORM_SRC)/hpi/export \
- -I$(SHARE_SRC)/hpi/include \
- -I$(SHARE_SRC)/hpi/export
-else
-OTHER_INCLUDES += \
- -I$(PLATFORM_SRC)/hpi/include \
- -I$(PLATFORM_SRC)/hpi/export \
- -I$(SHARE_SRC)/hpi/include \
- -I$(SHARE_SRC)/hpi/export
-endif
-
-#
-# Add to the default C and assembly file search paths. Clear any initial
-# vpath settings to ensure that we don't look in unexpected places for HPI
-# files.
-#
-vpath %.c
-vpath %.c $(PLATFORM_SRC)/hpi/$(THREADDIR)/src
-vpath %.c $(PLATFORM_SRC)/hpi/src
-vpath %.c $(SHARE_SRC)/hpi/src
-
-vpath %.s
-vpath %.s $(PLATFORM_SRC)/hpi/$(THREADDIR)/src
-vpath %.s $(PLATFORM_SRC)/hpi/src
-
-#
-# By default leave out locking statistics
-#
-ifneq ($(PLATFORM), windows)
-LOCKSTATS = false
-ifeq ($(LOCKSTATS), true)
- CFLAGS_COMMON += -DLOCKSTATS
-endif
-endif
-
-#
-# Things that must be linked in.
-#
-ifneq ($(PLATFORM), windows)
-OTHER_LDLIBS += $(LIBSOCKET) $(LIBNSL) $(LIBM) -ldl
-endif
--- a/jdk/make/java/hpi/native/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-#
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# Makefile for native threads HPI.
-#
-
-BUILDDIR = ../../..
-MODULE = base
-LIBRARY = hpi
-PRODUCT = java
-THREADDIR = native_threads
-LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/$(THREADDIR)
-include $(BUILDDIR)/common/Defs.gmk
-
-#
-# Native threads specific C and .s files.
-#
-FILES_c = \
- monitor_md.c \
- threads_md.c \
- condvar_md.c \
- interrupt_md.c \
- mutex_md.c \
- sys_api_td.c \
- threads_$(PLATFORM).c
-
-#
-# Other files/flags shared between the HPIs.
-#
-include $(BUILDDIR)/java/hpi/hpi_common.gmk
-
-#
-# Rules for the .so file.
-#
-ifeq ($(PLATFORM), solaris)
- ifneq ($(ARCH), amd64)
- FILES_reorder += reorder-$(ARCH)
- endif
-endif
-include $(BUILDDIR)/common/Mapfile-vers.gmk
-include $(BUILDDIR)/common/Library.gmk
-
-#
-# HPI flags for native threads.
-#
-OTHER_CPPFLAGS += -D_REENTRANT -DNATIVE
-
-ifeq ($(USE_PTHREADS),true)
-OTHER_CPPFLAGS += -DUSE_PTHREADS
-ifeq ($(MOOT_PRIORITIES),true)
-OTHER_CPPFLAGS += -DMOOT_PRIORITIES
-endif
-LIBPOSIX4 = -lposix4
-OTHER_LDLIBS += -lpthread $(LIBPOSIX4)
-endif
-
-HAVE_GETHRVTIME=true
-ifeq ($(HAVE_GETHRVTIME),true)
-OTHER_CPPFLAGS += -DHAVE_GETHRVTIME
-endif
-
-HAVE_FILIOH=true
-ifeq ($(HAVE_FILIOH),true)
-OTHER_CPPFLAGS += -DHAVE_FILIOH
-endif
-
-ifeq ($(NO_INTERRUPTIBLE_IO),true)
-OTHER_CPPFLAGS += -DNO_INTERRUPTIBLE_IO
-endif
-
--- a/jdk/make/java/hpi/native/mapfile-vers Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-#
-# Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-SUNWprivate_1.1 {
- global:
- DLL_Initialize;
-
- local:
- *;
-};
--- a/jdk/make/java/hpi/native/reorder-i586 Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-data = R0x2000;
-text = LOAD ?RXO;
-# Test Null
-text: .text%_init;
-text: .text%checkForCorrectLibthread: OUTPUTDIR/tmp/java/hpi/native_threads/obj/threads_solaris.o;
-text: .text%init64IO: OUTPUTDIR/tmp/java/hpi/native_threads/obj/system_md.o;
-text: .text%DLL_Initialize;
-text: .text%GetInterface: OUTPUTDIR/tmp/java/hpi/native_threads/obj/hpi.o;
-text: .text%sysBuildLibName;
-text: .text%sysLoadLibrary;
-text: .text%sysFindLibraryEntry;
-text: .text%sysNativePath;
-text: .text%sysOpen;
-text: .text%sysSeek;
-text: .text%lseek64_w;
-# Test Exit
-# Test Hello
-# Test Sleep
-# Test IntToString
-# Test LoadToolkit
-text: .text%sysAvailable;
-text: .text%sysFfileMode;
-text: .text%sysGetLastErrorString;
-# Test LoadFrame
-# Test LoadJFrame
-# Test JHello
-# SwingSet
--- a/jdk/make/java/hpi/native/reorder-sparc Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-data = R0x2000;
-text = LOAD ?RXO;
-# Test Null
-text: .text%checkForCorrectLibthread: OUTPUTDIR/tmp/java/hpi/native_threads/obj/threads_solaris.o;
-text: .text%init64IO: OUTPUTDIR/tmp/java/hpi/native_threads/obj/system_md.o;
-text: .text%DLL_Initialize;
-text: .text%GetInterface: OUTPUTDIR/tmp/java/hpi/native_threads/obj/hpi.o;
-text: .text%sysBuildLibName;
-text: .text%sysLoadLibrary;
-text: .text%sysFindLibraryEntry;
-text: .text%sysNativePath;
-text: .text%sysOpen;
-text: .text%sysFfileMode;
-text: .text%sysSeek;
-text: .text%lseek64_w;
-text: .text%sysAvailable;
-# Test Exit
-# Test Hello
-# Test Sleep
-# Test IntToString
-# Test LoadToolkit
-text: .text%sysGetLastErrorString;
-# Test LoadFrame
-# Test LoadJFrame
-# Test JHello
-# SwingSet
--- a/jdk/make/java/hpi/native/reorder-sparcv9 Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-data = R0x2000;
-text = LOAD ?RXO;
-# Test Null
-text: .text%checkForCorrectLibthread: OUTPUTDIR/tmp/java/hpi/native_threads/obj64/threads_solaris.o;
-text: .text%init64IO: OUTPUTDIR/tmp/java/hpi/native_threads/obj64/system_md.o;
-text: .text%DLL_Initialize;
-text: .text%GetInterface: OUTPUTDIR/tmp/java/hpi/native_threads/obj64/hpi.o;
-text: .text%sysBuildLibName;
-text: .text%sysLoadLibrary;
-text: .text%sysFindLibraryEntry;
-text: .text%sysNativePath;
-text: .text%sysOpen;
-text: .text%sysFfileMode;
-text: .text%sysSeek;
-text: .text%lseek64_w;
-text: .text%sysAvailable;
-# Test Exit
-# Test Hello
-# Test Sleep
-# Test IntToString
-# Test LoadToolkit
-text: .text%sysGetLastErrorString;
-# Test LoadFrame
-# Test LoadJFrame
-# Test JHello
-# SwingSet
--- a/jdk/make/java/hpi/windows/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-#
-# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# Makefile for Windows HPI DLL
-#
-BUILDDIR = ../../..
-MODULE = base
-LIBRARY = hpi
-PRODUCT = java
-THREADDIR = windows_threads
-LIB_LOCATION = $(BINDIR)
-
-include $(BUILDDIR)/common/Defs.gmk
-
-# windows compiler flags
-ifeq ($(PLATFORM),windows)
- CPPFLAGS_DBG += -DLOGGING
-endif
-
-FILES_c = \
- linker_md.c \
- memory_md.c \
- monitor_md.c \
- path_md.c \
- socket_md.c \
- sys_api_md.c \
- system_md.c \
- threads_md.c \
- hpi.c # trailing blank required!
-
-JVMLIB =
-JAVALIB =
-OTHER_LCF = -export:DLL_Initialize
-EXTRA_LIBS =
-
-
-#
-# Other files/flags shared between the HPIs.
-#
-include $(BUILDDIR)/java/hpi/hpi_common.gmk
-
-#
-# Rules for the .so file.
-#
-include $(BUILDDIR)/common/Library.gmk
-
--- a/jdk/make/tools/reorder/Makefile Tue Jan 04 17:05:38 2011 -0800
+++ b/jdk/make/tools/reorder/Makefile Fri Jan 07 15:49:44 2011 +0000
@@ -85,7 +85,6 @@
libs.reorder :
ifeq ($(PLATFORM), solaris)
$(MAKE) LIBBLDDIR=java/zip LIBTMPDIR=sun/java.util.zip/zip reorder.lib
- $(MAKE) LIBBLDDIR=java/hpi/native LIBTMPDIR=java/hpi/native_threads reorder.lib
$(MAKE) LIBBLDDIR=java/java LIBTMPDIR=java/java.lang/java reorder.lib
$(MAKE) LIBBLDDIR=java/nio LIBTMPDIR=java/java.nio/nio reorder.lib
$(MAKE) LIBBLDDIR=sun/font LIBTMPDIR=sun/sun.awt.font/fontmanager reorder.lib
@@ -96,7 +95,6 @@
libs.copy:
ifeq ($(PLATFORM), solaris)
$(CP) $(OUTDIR)/reorder_java_zip-$(ARCH) ../../java/zip/reorder-$(ARCH)
- $(CP) $(OUTDIR)/reorder_java_hpi_native-$(ARCH) ../../java/hpi/native/reorder-$(ARCH)
$(CP) $(OUTDIR)/reorder_java_java-$(ARCH) ../../java/java/reorder-$(ARCH)
$(CP) $(OUTDIR)/reorder_sun_font-$(ARCH) ../../sun/font/reorder-$(ARCH)
$(CP) $(OUTDIR)/reorder_sun_jpeg-$(ARCH) ../../sun/jpeg/reorder-$(ARCH)
--- a/jdk/src/share/hpi/export/bool.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_BOOL_H_
-#define _JAVASOFT_BOOL_H_
-
-#undef TRUE
-#undef FALSE
-
-typedef enum {
- FALSE = 0,
- TRUE = 1
-} bool_t;
-
-#endif /* !_JAVASOFT_BOOL_H_ */
--- a/jdk/src/share/hpi/export/dll.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_DLL_H_
-#define _JAVASOFT_DLL_H_
-
-#include <jni.h>
-
-/* DLL.H: A common interface for helper DLLs loaded by the VM.
- * Each library exports the main entry point "DLL_Initialize". Through
- * that function the programmer can obtain a function pointer which has
- * type "GetInterfaceFunc." Through the function pointer the programmer
- * can obtain other interfaces supported in the DLL.
- */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef jint (JNICALL * GetInterfaceFunc)
- (void **intfP, const char *name, jint ver);
-
-jint JNICALL DLL_Initialize(GetInterfaceFunc *, void *args);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !_JAVASOFT_DLL_H_ */
--- a/jdk/src/share/hpi/export/hpi.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,306 +0,0 @@
-/*
- * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Host Porting Interface. This defines the "porting layer" for
- * POSIX.1 compliant operating systems.
- */
-
-#ifndef _JAVASOFT_HPI_H_
-#define _JAVASOFT_HPI_H_
-
-#include <stdio.h>
-#include <sys/types.h>
-
-#include "jni.h"
-#include "bool.h"
-#include "hpi_md.h"
-#include "dll.h"
-
-#ifdef __solaris__
-#define SSIZE_T ssize_t
-#else
-#ifdef _LP64
-#define SSIZE_T ssize_t
-#else
-#define SSIZE_T int
-#endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * memory allocations
- */
-typedef struct {
- /*
- * Malloc must return a unique pointer if size == 0.
- */
- void * (*Malloc)(size_t size);
- void * (*Realloc)(void *ptr, size_t new_size);
- /*
- * Free must allow ptr == NULL to be a no-op.
- */
- void (*Free)(void *ptr);
- /*
- * Calloc must return a unique pointer for if
- * n_item == 0 || item_size == 0.
- */
- void * (*Calloc)(size_t n_item, size_t item_size);
- char * (*Strdup)(const char *str);
-
- void * (*MapMem)(size_t req_size, size_t *maped_size);
- void * (*UnmapMem)(void *req_addr, size_t req_size, size_t *unmap_size);
- /*
- * CommitMem should round the ptr down to the nearest page and
- * round the size up to the nearest page so that the committed
- * region is at least as large as the requested region.
- */
- void * (*CommitMem)(void *ptr, size_t size, size_t *actual);
- /*
- * sysDecommitMem should round the ptr up to the nearest page and
- * round the size down to the nearest page so that the decommitted
- * region is no greater than the requested region.
- */
- void * (*DecommitMem)(void *ptr, size_t size, size_t *actual);
-
-#define HPI_PAGE_ALIGNMENT (64 * 1024)
-
- void * (*AllocBlock)(size_t size, void **headP);
- void (*FreeBlock)(void *head);
-} HPI_MemoryInterface;
-
-/*
- * dynamic linking libraries
- */
-typedef struct {
- void (*BuildLibName)(char *buf, int buf_len, char *path, char *name);
- int (*BuildFunName)(char *name, int name_len, int arg_size, int en_idx);
-
- void * (*LoadLibrary)(const char *name, char *err_buf, int err_buflen);
- void (*UnloadLibrary)(void *lib);
- void * (*FindLibraryEntry)(void *lib, const char *name);
-} HPI_LibraryInterface;
-
-typedef void (*signal_handler_t)(int sig, void *siginfo, void *context);
-
-#define HPI_SIG_DFL (signal_handler_t)0
-#define HPI_SIG_ERR (signal_handler_t)-1
-#define HPI_SIG_IGN (signal_handler_t)1
-
-typedef struct {
- char *name; /* name such as green/native threads. */
- int isMP;
-} HPI_SysInfo;
-
-typedef struct {
- HPI_SysInfo * (*GetSysInfo)(void);
- long (*GetMilliTicks)(void);
- jlong (*TimeMillis)(void);
-
- signal_handler_t (*Signal)(int sig, signal_handler_t handler);
- void (*Raise)(int sig);
- void (*SignalNotify)(int sig);
- int (*SignalWait)(void);
-
- int (*Shutdown)(void);
-
- int (*SetLoggingLevel)(int level);
- bool_t (*SetMonitoringOn)(bool_t on);
- int (*GetLastErrorString)(char *buf, int len);
-} HPI_SystemInterface;
-
-/*
- * threads and monitors
- */
-typedef struct sys_thread sys_thread_t;
-typedef struct sys_mon sys_mon_t;
-
-#define HPI_OK 0
-#define HPI_ERR -1
-#define HPI_INTRPT -2 /* Operation was interrupted */
-#define HPI_TIMEOUT -3 /* A timer ran out */
-#define HPI_NOMEM -5 /* Ran out of memory */
-#define HPI_NORESOURCE -6 /* Ran out of some system resource */
-
-/* There are three basic states: RUNNABLE, MONITOR_WAIT, and CONDVAR_WAIT.
- * When the thread is suspended in any of these states, the
- * HPI_THREAD_SUSPENDED bit will be set
- */
-enum {
- HPI_THREAD_RUNNABLE = 1,
- HPI_THREAD_MONITOR_WAIT,
- HPI_THREAD_CONDVAR_WAIT
-};
-
-#define HPI_MINIMUM_PRIORITY 1
-#define HPI_MAXIMUM_PRIORITY 10
-#define HPI_NORMAL_PRIORITY 5
-
-#define HPI_THREAD_SUSPENDED 0x8000
-#define HPI_THREAD_INTERRUPTED 0x4000
-
-typedef struct {
- sys_thread_t *owner;
- long entry_count;
- sys_thread_t **monitor_waiters;
- sys_thread_t **condvar_waiters;
- int sz_monitor_waiters;
- int sz_condvar_waiters;
- int n_monitor_waiters;
- int n_condvar_waiters;
-} sys_mon_info;
-
-typedef struct {
- int (*ThreadBootstrap)(sys_thread_t **tidP,
- sys_mon_t **qlockP,
- int nReservedBytes);
- int (*ThreadCreate)(sys_thread_t **tidP,
- long stk_size,
- void (*func)(void *),
- void *arg);
- sys_thread_t * (*ThreadSelf)(void);
- void (*ThreadYield)(void);
- int (*ThreadSuspend)(sys_thread_t *tid);
- int (*ThreadResume)(sys_thread_t *tid);
- int (*ThreadSetPriority)(sys_thread_t *tid, int prio);
- int (*ThreadGetPriority)(sys_thread_t *tid, int *prio);
- void * (*ThreadStackPointer)(sys_thread_t *tid);
- void * (*ThreadStackTop)(sys_thread_t *tid);
- long * (*ThreadRegs)(sys_thread_t *tid, int *regs);
- int (*ThreadSingle)(void);
- void (*ThreadMulti)(void);
- int (*ThreadEnumerateOver)(int (*func)(sys_thread_t *, void *),
- void *arg);
- int (*ThreadCheckStack)(void);
- void (*ThreadPostException)(sys_thread_t *tid, void *arg);
- void (*ThreadInterrupt)(sys_thread_t *tid);
- int (*ThreadIsInterrupted)(sys_thread_t *tid, int clear);
- int (*ThreadAlloc)(sys_thread_t **tidP);
- int (*ThreadFree)(void);
- jlong (*ThreadCPUTime)(void);
- int (*ThreadGetStatus)(sys_thread_t *tid, sys_mon_t **monitor);
- void * (*ThreadInterruptEvent)(void);
- void * (*ThreadNativeID)(sys_thread_t *tid);
-
- /* These three functions are used by the CPU time profiler.
- * sysThreadIsRunning determines whether the thread is running (not just
- * runnable). It is only safe to call this function after calling
- * sysThreadProfSuspend.
- */
- bool_t (*ThreadIsRunning)(sys_thread_t *tid);
- void (*ThreadProfSuspend)(sys_thread_t *tid);
- void (*ThreadProfResume)(sys_thread_t *tid);
-
- int (*AdjustTimeSlice)(int ms);
-
- size_t (*MonitorSizeof)(void);
- int (*MonitorInit)(sys_mon_t *mid);
- int (*MonitorDestroy)(sys_mon_t *mid);
- int (*MonitorEnter)(sys_thread_t *self, sys_mon_t *mid);
- bool_t (*MonitorEntered)(sys_thread_t *self, sys_mon_t *mid);
- int (*MonitorExit)(sys_thread_t *self, sys_mon_t *mid);
- int (*MonitorNotify)(sys_thread_t *self, sys_mon_t *mid);
- int (*MonitorNotifyAll)(sys_thread_t *self, sys_mon_t *mid);
- int (*MonitorWait)(sys_thread_t *self, sys_mon_t *mid, jlong ms);
- bool_t (*MonitorInUse)(sys_mon_t *mid);
- sys_thread_t * (*MonitorOwner)(sys_mon_t *mid);
- int (*MonitorGetInfo)(sys_mon_t *mid, sys_mon_info *info);
-
-} HPI_ThreadInterface;
-
-/*
- * files
- */
-
-#define HPI_FILETYPE_REGULAR (0)
-#define HPI_FILETYPE_DIRECTORY (1)
-#define HPI_FILETYPE_OTHER (2)
-
-typedef struct {
- char * (*NativePath)(char *path);
- int (*FileType)(const char *path);
- int (*Open)(const char *name, int openMode, int filePerm);
- int (*Close)(int fd);
- jlong (*Seek)(int fd, jlong offset, int whence);
- int (*SetLength)(int fd, jlong length);
- int (*Sync)(int fd);
- int (*Available)(int fd, jlong *bytes);
- size_t (*Read)(int fd, void *buf, unsigned int nBytes);
- size_t (*Write)(int fd, const void *buf, unsigned int nBytes);
- int (*FileSizeFD)(int fd, jlong *size);
-} HPI_FileInterface;
-
-/*
- * sockets
- */
-struct sockaddr;
-struct hostent;
-
-typedef struct {
- int (*Close)(int fd);
- long (*Available)(int fd, jint *pbytes);
- int (*Connect)(int fd, struct sockaddr *him, int len);
- int (*Accept)(int fd, struct sockaddr *him, int *len);
- SSIZE_T (*SendTo)(int fd, char *buf, int len, int flags,
- struct sockaddr *to, int tolen);
- SSIZE_T (*RecvFrom)(int fd, char *buf, int nbytes, int flags,
- struct sockaddr *from, int *fromlen);
- int (*Listen)(int fd, int count);
- SSIZE_T (*Recv)(int fd, char *buf, int nBytes, int flags);
- SSIZE_T (*Send)(int fd, char *buf, int nBytes, int flags);
- int (*Timeout)(int fd, long timeout);
- struct hostent * (*GetHostByName)(char *hostname);
- int (*Socket)(int domain, int type, int protocol);
- int (*SocketShutdown)(int fd, int howto);
- int (*Bind)(int fd, struct sockaddr *him, int len);
- int (*GetSocketName)(int fd, struct sockaddr *him, int *len);
- int (*GetHostName)(char *hostname, int namelen);
- struct hostent * (*GetHostByAddr)(const char *hostname, int len, int type);
- int (*SocketGetOption)(int fd, int level, int optname, char *optval, int *optlen);
- int (*SocketSetOption)(int fd, int level, int optname, const char *optval, int optlen);
- struct protoent * (*GetProtoByName)(char* name);
-} HPI_SocketInterface;
-
-/*
- * callbacks.
- */
-typedef struct vm_calls {
- int (*jio_fprintf)(FILE *fp, const char *fmt, ...);
- void (*panic)(const char *fmt, ...);
- void (*monitorRegister)(sys_mon_t *mid, char *info_str);
-
- void (*monitorContendedEnter)(sys_thread_t *self, sys_mon_t *mid);
- void (*monitorContendedEntered)(sys_thread_t *self, sys_mon_t *mid);
- void (*monitorContendedExit)(sys_thread_t *self, sys_mon_t *mid);
-} vm_calls_t;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !_JAVASOFT_HPI_H_ */
--- a/jdk/src/share/hpi/include/hpi_impl.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_HPI_IMPL_H_
-#define _JAVASOFT_HPI_IMPL_H_
-
-#include "hpi.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "vm_calls.h"
-
-extern int nReservedBytes;
-sys_thread_t *allocThreadBlock(void);
-void freeThreadBlock(sys_thread_t *tid);
-int threadBootstrapMD(sys_thread_t **tid, sys_mon_t **lockP, int nb);
-
-HPI_SysInfo *sysGetSysInfo(void);
-long sysGetMilliTicks(void);
-jlong sysTimeMillis(void);
-
-signal_handler_t sysSignal(int sig, signal_handler_t handler);
-void sysRaise(int sig);
-void sysSignalNotify(int sig);
-int sysSignalWait(void);
-int sysShutdown(void);
-int sysSetLoggingLevel(int level);
-bool_t sysSetMonitoringOn(bool_t on);
-int sysGetLastErrorString(char *buf, int len);
-
-void * sysMalloc(size_t);
-void * sysRealloc(void*, size_t);
-void sysFree(void*);
-void * sysCalloc(size_t, size_t);
-char * sysStrdup(const char * string);
-void * sysMapMem(size_t, size_t *);
-void * sysUnmapMem(void *, size_t, size_t *);
-void * sysCommitMem(void * ptr, size_t size, size_t * actual);
-void * sysDecommitMem(void * ptr, size_t size, size_t * actual);
-void * sysAllocBlock(size_t, void**);
-void sysFreeBlock(void *);
-
-void sysBuildLibName(char *, int, char *, char *);
-int sysBuildFunName(char *, int, int, int);
-void * sysLoadLibrary(const char *, char *err_buf, int err_buflen);
-void sysUnloadLibrary(void *);
-void * sysFindLibraryEntry(void *, const char *);
-
-int sysThreadBootstrap(sys_thread_t **, sys_mon_t **, int);
-int sysThreadCreate(sys_thread_t **,
- long,
- void (*)(void *),
- void *arg);
-void sysThreadExit(void);
-sys_thread_t * sysThreadSelf(void);
-void sysThreadYield(void);
-int sysThreadSuspend(sys_thread_t *);
-int sysThreadResume(sys_thread_t *);
-int sysThreadSetPriority(sys_thread_t *, int);
-int sysThreadGetPriority(sys_thread_t *, int *);
-void * sysThreadStackPointer(sys_thread_t *);
-void * sysThreadStackTop(sys_thread_t *);
-long * sysThreadRegs(sys_thread_t *, int *);
-int sysThreadSingle(void);
-void sysThreadMulti(void);
-int sysThreadEnumerateOver(int (*)(sys_thread_t *, void *), void *);
-int sysThreadCheckStack(void);
-void sysThreadPostException(sys_thread_t *, void *);
-void sysThreadInterrupt(sys_thread_t *);
-int sysThreadIsInterrupted(sys_thread_t *, int);
-int sysThreadAlloc(sys_thread_t **);
-int sysThreadFree(void);
-size_t sysThreadSizeof(void);
-jlong sysThreadCPUTime(void);
-int sysThreadGetStatus(sys_thread_t *, sys_mon_t **);
-int sysAdjustUserThreadCount(int delta);
-bool_t sysThreadIsRunning(sys_thread_t *);
-void sysThreadProfSuspend(sys_thread_t *);
-void sysThreadProfResume(sys_thread_t *);
-int sysAdjustTimeSlice(int);
-int sysThreadEnumerateOver(int (*f)(sys_thread_t *, void *), void *arg);
-void * sysThreadInterruptEvent(void);
-void * sysThreadNativeID(sys_thread_t *);
-
-size_t sysMonitorSizeof(void);
-int sysMonitorInit(sys_mon_t *);
-int sysMonitorDestroy(sys_mon_t *);
-int sysMonitorEnter(sys_thread_t *, sys_mon_t *);
-bool_t sysMonitorEntered(sys_thread_t *, sys_mon_t *);
-int sysMonitorExit(sys_thread_t *, sys_mon_t *);
-int sysMonitorNotify(sys_thread_t *, sys_mon_t *);
-int sysMonitorNotifyAll(sys_thread_t *, sys_mon_t *);
-int sysMonitorWait(sys_thread_t *, sys_mon_t *, jlong);
-bool_t sysMonitorInUse(sys_mon_t *);
-sys_thread_t * sysMonitorOwner(sys_mon_t *);
-int sysMonitorGetInfo(sys_mon_t *, sys_mon_info *);
-
-char *sysNativePath(char *path);
-int sysFileType(const char *path);
-int sysOpen(const char *name, int openMode, int filePerm);
-int sysClose(int fd);
-jlong sysSeek(int fd, jlong offset, int whence);
-int sysSetLength(int fd, jlong length);
-int sysSync(int fd);
-int sysAvailable(int fd, jlong *bytes);
-size_t sysRead(int fd, void *buf, unsigned int nBytes);
-size_t sysWrite(int fd, const void *buf, unsigned int nBytes);
-int sysFileSizeFD(int fd, jlong *size);
-
-int sysSocketClose(int fd);
-int sysSocketShutdown(int fd, int howto);
-long sysSocketAvailable(int fd, jint *pbytes);
-int sysConnect(int fd, struct sockaddr *him, int len);
-int sysBind(int fd, struct sockaddr *him, int len);
-int sysAccept(int fd, struct sockaddr *him, int *len);
-int sysGetSockName(int fd, struct sockaddr *him, int *len);
-#ifdef _LP64
-ssize_t sysSendTo(int fd, char *buf, int len, int flags, struct sockaddr *to,
- int tolen);
-ssize_t sysRecvFrom(int fd, char *buf, int nbytes, int flags,
- struct sockaddr *from, int *fromlen);
-ssize_t sysRecv(int fd, char *buf, int nBytes, int flags);
-ssize_t sysSend(int fd, char *buf, int nBytes, int flags);
-#else
-int sysSendTo(int fd, char *buf, int len, int flags, struct sockaddr *to,
- int tolen);
-int sysRecvFrom(int fd, char *buf, int nbytes, int flags,
- struct sockaddr *from, int *fromlen);
-int sysRecv(int fd, char *buf, int nBytes, int flags);
-int sysSend(int fd, char *buf, int nBytes, int flags);
-#endif
-int sysListen(int fd, int count);
-int sysTimeout(int fd, long timeout);
-int sysGetHostName(char* name, int namelen);
-struct hostent *sysGetHostByAddr(const char* name, int len, int type);
-struct hostent *sysGetHostByName(char *hostname);
-int sysSocket(int domain, int type, int protocol);
-int sysGetSockOpt(int fd, int level, int optname, char *optval, int *optlen);
-int sysSetSockOpt(int fd, int level, int optname, const char *optval, int optlen);
-struct protoent * sysGetProtoByName(char* name);
-
-#define SYS_SIG_DFL HPI_SIG_DFL
-#define SYS_SIG_ERR HPI_SIG_ERR
-#define SYS_SIG_IGN HPI_SIG_IGN
-
-#define SYS_OK HPI_OK
-#define SYS_ERR HPI_ERR
-#define SYS_INTRPT HPI_INTRPT
-#define SYS_TIMEOUT HPI_TIMEOUT
-#define SYS_NOMEM HPI_NOMEM
-#define SYS_NORESOURCE HPI_NORESOURCE
-
-#define SYS_THREAD_RUNNABLE HPI_THREAD_RUNNABLE
-#define SYS_THREAD_MONITOR_WAIT HPI_THREAD_MONITOR_WAIT
-#define SYS_THREAD_CONDVAR_WAIT HPI_THREAD_CONDVAR_WAIT
-
-#define MinimumPriority HPI_MINIMUM_PRIORITY
-#define MaximumPriority HPI_MAXIMUM_PRIORITY
-#define NormalPriority HPI_NORMAL_PRIORITY
-
-#define SYS_THREAD_SUSPENDED HPI_THREAD_SUSPENDED
-
-#define PAGE_ALIGNMENT HPI_PAGE_ALIGNMENT
-
-#define SYS_TIMEOUT_INFINITY HPI_TIMEOUT_INFINITY
-
-#define SYS_FILETYPE_REGULAR HPI_FILETYPE_REGULAR
-#define SYS_FILETYPE_DIRECTORY HPI_FILETYPE_DIRECTORY
-#define SYS_FILETYPE_OTHER HPI_FILETYPE_OTHER
-
-typedef void *stackp_t;
-
-/* global vars */
-
-extern int logging_level;
-extern bool_t profiler_on;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !_JAVASOFT_HPI_IMPL_H_ */
--- a/jdk/src/share/hpi/include/vm_calls.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_VM_CALLS_H_
-#define _JAVASOFT_VM_CALLS_H_
-
-/* This file defines the function table and macros exported from the VM
- * for the implementation of HPI.
- */
-
-extern vm_calls_t *vm_calls;
-
-#define VM_CALLS_READY() vm_calls
-#define VM_CALL(f) (vm_calls->f)
-
-#undef sysAssert
-
-#ifdef DEBUG
-#define sysAssert(expression) { \
- if (!(expression)) { \
- vm_calls->panic \
- ("\"%s\", line %d: assertion failure\n", __FILE__, __LINE__); \
- } \
-}
-#else
-#define sysAssert(expression) ((void) 0)
-#endif
-
-#ifdef LOGGING
-
-#define Log(level, message) { \
- if (vm_calls && level <= logging_level) \
- vm_calls->jio_fprintf(stderr, message); \
-}
-
-#define Log1(level, message, x1) { \
- if (vm_calls && level <= logging_level) \
- vm_calls->jio_fprintf(stderr, message, (x1)); \
-}
-
-#define Log2(level, message, x1, x2) { \
- if (vm_calls && level <= logging_level) \
- vm_calls->jio_fprintf(stderr, message, (x1), (x2)); \
-}
-
-#define Log3(level, message, x1, x2, x3) { \
- if (vm_calls && level <= logging_level) \
- vm_calls->jio_fprintf(stderr, message, (x1), (x2), (x3)); \
-}
-
-#define Log4(level, message, x1, x2, x3, x4) { \
- if (vm_calls && level <= logging_level) \
- vm_calls->jio_fprintf(stderr, message, (x1), (x2), (x3), (x4)); \
-}
-
-#else
-
-#define Log(level, message) ((void) 0)
-#define Log1(level, message, x1) ((void) 0)
-#define Log2(level, message, x1, x2) ((void) 0)
-#define Log3(level, message, x1, x2, x3) ((void) 0)
-#define Log4(level, message, x1, x2, x3, x4) ((void) 0)
-
-#endif /* LOGGING */
-
-#endif /* !_JAVASOFT_VM_CALLS_H_ */
--- a/jdk/src/share/hpi/src/hpi.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <string.h>
-
-#include "hpi_impl.h"
-#include "threads_md.h"
-
-int logging_level = 0;
-bool_t profiler_on = FALSE;
-
-int sysSetLoggingLevel(int level)
-{
- int old = logging_level;
- logging_level = level;
- return old;
-}
-
-bool_t sysSetMonitoringOn(bool_t s)
-{
- bool_t old = profiler_on;
- profiler_on = s;
- return old;
-}
-
-int nReservedBytes;
-
-sys_thread_t *allocThreadBlock()
-{
- char *p = sysCalloc(nReservedBytes + sizeof(sys_thread_t), 1);
- if (p == NULL) {
- return NULL;
- }
- return (sys_thread_t *)(p + nReservedBytes);
-}
-
-void freeThreadBlock(sys_thread_t *tid)
-{
- sysFree((char *)tid - nReservedBytes);
-}
-
-vm_calls_t *vm_calls = NULL;
-
-static HPI_MemoryInterface hpi_memory_interface = {
- sysMalloc,
- sysRealloc,
- sysFree,
- sysCalloc,
- sysStrdup,
- sysMapMem,
- sysUnmapMem,
- sysCommitMem,
- sysDecommitMem,
- sysAllocBlock,
- sysFreeBlock,
-};
-
-static HPI_LibraryInterface hpi_library_interface = {
- sysBuildLibName,
- sysBuildFunName,
- sysLoadLibrary,
- sysUnloadLibrary,
- sysFindLibraryEntry,
-};
-
-static HPI_SystemInterface hpi_system_interface = {
- sysGetSysInfo,
- sysGetMilliTicks,
- sysTimeMillis,
- sysSignal,
- sysRaise,
- sysSignalNotify,
- sysSignalWait,
- sysShutdown,
- sysSetLoggingLevel,
- sysSetMonitoringOn,
- sysGetLastErrorString
-};
-
-static HPI_ThreadInterface hpi_thread_interface = {
- sysThreadBootstrap,
- sysThreadCreate,
- sysThreadSelf,
- sysThreadYield,
- sysThreadSuspend,
- sysThreadResume,
- sysThreadSetPriority,
- sysThreadGetPriority,
- sysThreadStackPointer,
- sysThreadStackTop,
- sysThreadRegs,
- sysThreadSingle,
- sysThreadMulti,
- sysThreadEnumerateOver,
- sysThreadCheckStack,
- sysThreadPostException,
- sysThreadInterrupt,
- sysThreadIsInterrupted,
- sysThreadAlloc,
- sysThreadFree,
- sysThreadCPUTime,
- sysThreadGetStatus,
- sysThreadInterruptEvent,
- sysThreadNativeID,
- sysThreadIsRunning,
- sysThreadProfSuspend,
- sysThreadProfResume,
- sysAdjustTimeSlice,
- sysMonitorSizeof,
- sysMonitorInit,
- sysMonitorDestroy,
- sysMonitorEnter,
- sysMonitorEntered,
- sysMonitorExit,
- sysMonitorNotify,
- sysMonitorNotifyAll,
- sysMonitorWait,
- sysMonitorInUse,
- sysMonitorOwner,
- sysMonitorGetInfo,
-};
-
-static HPI_FileInterface hpi_file_interface = {
- sysNativePath,
- sysFileType,
- sysOpen,
- sysClose,
- sysSeek,
- sysSetLength,
- sysSync,
- sysAvailable,
- sysRead,
- sysWrite,
- sysFileSizeFD
-};
-
-static HPI_SocketInterface hpi_socket_interface = {
- sysSocketClose,
- sysSocketAvailable,
- sysConnect,
- sysAccept,
- sysSendTo,
- sysRecvFrom,
- sysListen,
- sysRecv,
- sysSend,
- sysTimeout,
- sysGetHostByName,
- sysSocket,
- sysSocketShutdown,
- sysBind,
- sysGetSockName,
- sysGetHostName,
- sysGetHostByAddr,
- sysGetSockOpt,
- sysSetSockOpt,
- sysGetProtoByName,
-};
-
-static jint JNICALL
-GetInterface(void **intfP, const char *name, jint version)
-{
- *intfP = NULL;
- if (version != 1) {
- return -1;
- }
- if (strcmp(name, "Memory") == 0) {
- *intfP = &hpi_memory_interface;
- return 0;
- }
- if (strcmp(name, "Library") == 0) {
- *intfP = &hpi_library_interface;
- return 0;
- }
- if (strcmp(name, "System") == 0) {
- *intfP = &hpi_system_interface;
- return 0;
- }
- if (strcmp(name, "Thread") == 0) {
- *intfP = &hpi_thread_interface;
- return 0;
- }
- if (strcmp(name, "File") == 0) {
- *intfP = &hpi_file_interface;
- return 0;
- }
- if (strcmp(name, "Socket") == 0) {
- *intfP = &hpi_socket_interface;
- return 0;
- }
- return -2;
-}
-
-jint JNICALL
-DLL_Initialize(GetInterfaceFunc *gi, void *args)
-{
- vm_calls = args;
- *gi = GetInterface;
- return SYS_OK;
-}
--- a/jdk/src/solaris/hpi/export/byteorder_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Solaris-dependent byte order include
- */
-
-#ifndef _JAVASOFT_SOLARIS_BYTE_MD_H_
-#define _JAVASOFT_SOLARIS_BYTE_MD_H_
-
-#include <netinet/in.h>
-
-#endif /* !_JAVASOFT_SOLARIS_BYTE_MD_H_ */
--- a/jdk/src/solaris/hpi/export/hpi_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_HPI_MD_H_
-#define _JAVASOFT_HPI_MD_H_
-
-#include "timeval_md.h"
-#include "io_md.h"
-#include "path_md.h"
-#include "byteorder_md.h"
-
-#define HPI_TIMEOUT_INFINITY ((jlong)(-1))
-
-#endif /* !_JAVASOFT_HPI_MD_H_ */
--- a/jdk/src/solaris/hpi/export/io_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Solaris-dependent I/O
- */
-
-#ifndef _JAVASOFT_SOLARIS_IO_MD_H_
-#define _JAVASOFT_SOLARIS_IO_MD_H_
-
-#include <sys/param.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
-#define LINE_SEPARATOR "\n"
-
-/* file system macros moved to sysmacros_md.h */
-
-#endif /* !_JAVASOFT_SOLARIS_IO_MD_H_ */
--- a/jdk/src/solaris/hpi/export/path_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Solaris-dependent search path definitions and API
- */
-
-#ifndef _JAVASOFT_SOLARIS_PATH_MD_H_
-#define _JAVASOFT_SOLARIS_PATH_MD_H_
-
-#define PATH_SEPARATOR ":"
-#define PATH_CURDIR "."
-
-#define DIR_SEPARATOR '/'
-#define LOCAL_DIR_SEPARATOR '/'
-
-#endif /* !_JAVASOFT_SOLARIS_PATH_MD_H_ */
--- a/jdk/src/solaris/hpi/export/timeval_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_SOLARIS_TIMEVAL_H_
-#define _JAVASOFT_SOLARIS_TIMEVAL_H_
-
-typedef struct {
- long tv_sec; /* seconds */
- long tv_usec; /* microseconds (NOT milliseconds) */
-} timeval_t;
-
-#endif /* !_JAVASOFT_SOLARIS_TIMEVAL_H_ */
--- a/jdk/src/solaris/hpi/include/hpi_init.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_SOLARIS_HPI_INIT_H_
-#define _JAVASOFT_SOLARIS_HPI_INIT_H_
-
-#ifndef NATIVE
-extern void InitializeSbrk(void);
-extern void InitializeAsyncIO(void);
-extern void InitializeHelperThreads(void);
-#endif /* NATIVE */
-
-extern void InitializeMem(void);
-
-#endif /* _JAVASOFT_SOLARIS_HPI_INIT_H_ */
--- a/jdk/src/solaris/hpi/include/interrupt.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 1994, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Interrupt dispatch interface
- */
-
-#ifndef _JAVASOFT_INTERRUPT_H_
-#define _JAVASOFT_INTERRUPT_H_
-
-/*
- * Type definitions.
- */
-
-/*-
- * A function that handles interrupt dispatch requests is of type
- * intr_handler_t. This type definition is mostly for convenience.
- * A declaration of a handler function, should look like this:
- *
- * void myHandler(int interrupt, void *siginfo, void *context, void *arg);
- *
- * An intr_handler_t is constrained:
- *
- * - It runs on the exception stack.
- * - It cannot yield.
- * - It cannot allocate/free memory.
- * - It can only call interrupt-safe routines.
- *
- * "arg" is set to the "handlerArg" specified in intrRegister().
- */
-typedef void (*intr_handler_t)(int interrupt, void *siginfo,
- void *context, void *arg);
-
-/*
- * Routines.
- */
-
-/* Initialize the interrupt system */
-void intrInit(void);
-
-/* Set a handler for a particular interrupt */
-signal_handler_t intrRegister(int interrupt, intr_handler_t handler,
- void *handlerArg);
-
-/* Dispatch an interrupt (called from the low-level handlers) */
-void intrDispatch(int interrupt, void *siginfo, void *context);
-
-/*-
- * The target specific header file should define the following
- *
- * Constants
- *
- * N_INTERRUPTS - The number of interrupt channels. These
- * are numbered from 0 to (N_INTERRUPTS - 1).
- */
-#ifdef __linux__
-#define N_INTERRUPTS NSIG /* 0 to NSIG - 1*/
-#else
-#define N_INTERRUPTS 32 /* 0 to 31 */
-#endif
-
-/*-
- * Routines/Macros that control whether interrupts are enabled or
- * not.
- *
- * void intrLock(void) - Disable all interrupts.
- * void intrUnlock(void) - Enable all interrupts.
- *
- * Note: intrLock()/intrUnlock() pairs can be nested.
- *
- */
-
-void intrLock(void);
-void intrUnlock(void);
-
-/*-
- * intrInitMD() --
- * Initialize the machine-dependant interrupt software.
- *
- * This routine should leave the all interrupts disabled as if
- * one (1) intrLock() had been called. At the end of the
- * bootstrap, a single intrUnlock(), will be called to turn
- * interrupts on.
- */
-
-void intrInitMD(void);
-
-#if defined(__solaris__) && !defined(SA_SIGINFO)
-#error signal.h has not been included?
-#endif
-
-#ifdef SA_SIGINFO
-/* Thread implementation dependent interrupt dispatcher. */
-void intrDispatchMD(int sig, siginfo_t *info, void *uc);
-#else
-void intrDispatchMD(int sig);
-#endif
-
-/* Whether the signal is used by the HPI implementation */
-bool_t intrInUse(int sig);
-
-#endif /* !_JAVASOFT_INTERRUPT_H_ */
--- a/jdk/src/solaris/hpi/include/largefile.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_LARGEFILE_SUPPORT_H_
-#define _JAVASOFT_LARGEFILE_SUPPORT_H_
-
-#ifdef __solaris__
-#include "largefile_solaris.h"
-#endif
-
-#ifdef __linux__
-#include "largefile_linux.h"
-#endif
-
-/*
- * Prototypes for wrappers that we define. These wrapper functions
- * are low-level I/O routines that will use 64 bit versions if
- * available, else revert to the 32 bit ones.
- */
-extern off64_t lseek64_w(int fd, off64_t offset, int whence);
-extern int fstat64_w(int fd, struct stat *buf);
-extern int ftruncate64_w(int fd, off64_t length);
-extern int open64_w(const char *path, int oflag, int mode);
-
-/* This is defined in system_md.c */
-extern int sysFfileMode(int fd, int* mode);
-
-#endif /* _JAVASOFT_LARGEFILE_SUPPORT_H_ */
--- a/jdk/src/solaris/hpi/include/largefile_linux.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_LINUX_LARGEFILE_SUPPORT_H_
-#define _JAVASOFT_LINUX_LARGEFILE_SUPPORT_H_
-
-/*
- * For building on glibc-2.0 we need to define stat64 here.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#endif /* _JAVASOFT_LINUX_LARGEFILE_SUPPORT_H_ */
--- a/jdk/src/solaris/hpi/include/largefile_solaris.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_SOLARIS_LARGEFILE_SUPPORT_H_
-#define _JAVASOFT_SOLARIS_LARGEFILE_SUPPORT_H_
-
-#include <sys/stat.h>
-#include <sys/types.h>
-
-/**
- * This file contains the definitions for providing 64 bit File I/O support.
- */
-
-#if !defined(_LFS_LARGEFILE) || !_LFS_LARGEFILE
-
-#ifdef __GLIBC__
-typedef jlong longlong_t;
-#endif
-
-/*
- * This definition is from Solaris 2.6; it is required by systems that do not
- * support large files (e.g., Solaris 2.5.1).
- */
-
-typedef longlong_t off64_t; /* offsets within files */
-
-
-#ifdef __GLIBC__
-/* Doesn't matter what these are, there is no 64 bit support. */
-typedef int u_longlong_t;
-typedef int timestruc_t;
-#define _ST_FSTYPSZ 1
-#endif /* __GLIBC__ */
-
-/*
- * The stat64 structure must be provided on systems without large file
- * support (e.g., Solaris 2.5.1). These definitions are from Solaris 2.6
- * sys/stat.h and sys/types.h.
- */
-
-typedef u_longlong_t ino64_t; /* expanded inode type */
-typedef longlong_t blkcnt64_t; /* count of file blocks */
-
-struct stat64 {
- dev_t st_dev;
- long st_pad1[3];
- ino64_t st_ino;
- mode_t st_mode;
- nlink_t st_nlink;
- uid_t st_uid;
- gid_t st_gid;
- dev_t st_rdev;
- long st_pad2[2];
- off64_t st_size;
- timestruc_t st_atim;
- timestruc_t st_mtim;
- timestruc_t st_ctim;
- long st_blksize;
- blkcnt64_t st_blocks;
- char st_fstype[_ST_FSTYPSZ];
- long st_pad4[8];
-};
-
-#define O_LARGEFILE 0x2000 /* Solaris 2.6 sys/fcntl.h */
-#endif /* !_LFS_LARGEFILE */
-
-#endif /* !_JAVASOFT_SOLARIS_LARGEFILE_SUPPORT_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/condvar_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Interface to condition variable HPI implementation for Solaris
- */
-
-#ifndef _JAVASOFT_CONDVAR_MD_H_
-#define _JAVASOFT_CONDVAR_MD_H_
-
-#include "threads_md.h"
-
-typedef struct condvar {
- cond_t cond; /* Manual-reset event for notifications */
- unsigned int counter; /* Current number of notifications */
-} condvar_t;
-
-int condvarInit(condvar_t *);
-int condvarDestroy(condvar_t *);
-int condvarWait(condvar_t *, mutex_t *, thread_state_t wtype);
-int condvarTimedWait(condvar_t *, mutex_t *, jlong millis, thread_state_t wtype);
-int condvarSignal(condvar_t *);
-int condvarBroadcast(condvar_t *);
-
-#endif /* !_JAVASOFT_CONDVAR_MD_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/monitor_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Monitor interface 10/25/94
- *
- * Private data structures and interfaces used in the monitor code.
- * This file is used to share declarations and such between the different
- * files implementing monitors. It does not contain exported API.
- */
-
-#ifndef _JAVASOFT_SOLARIS_MONITOR_MD_H_
-#define _JAVASOFT_SOLARIS_MONITOR_MD_H_
-
-#include <mutex_md.h>
-#include <condvar_md.h>
-#include <threads_md.h>
-
-/*
- * Type definitions.
- */
-
-typedef struct monitor_waiter monitor_waiter_t;
-typedef struct monitor_wait_queue monitor_wait_queue_t;
-
-/* Element of the MonitorWaitQ - representing thread doing a monitor wait */
-/*
- * The only reason we do the queueing is for sysMonitorDumpInfo.
- * The counting, though, is used to avoid extraneous calls to
- * condvarBroadcast and condvarSignal, for instance.
- */
-struct monitor_waiter {
- monitor_waiter_t *next;
- monitor_waiter_t **prev;
- sys_thread_t *waiting_thread;
-};
-
-struct monitor_wait_queue {
- monitor_waiter_t *head; /* linked list of waiting threads */
- short count; /* number of waiters on the list */
-};
-
-#define ANY_WAITING(mwq) ((mwq).count > 0)
-#define INIT_MONITOR_WAIT_QUEUE(mwq) { (mwq).head = NULL; (mwq).count = 0; }
-
-/* The system-level monitor data structure */
-struct sys_mon {
- mutex_t mutex; /* The monitor's mutex */
- condvar_t cv_monitor; /* Notify those doing monitorWait on
- the monitor */
- /*
- * Threads waiting on either of the above condvars put themselves
- * on one of these lists.
- */
- monitor_wait_queue_t mwait_queue; /* Head of MonitorWaitQ */
-
- /* Thread currently executing in this monitor */
- sys_thread_t *monitor_owner;
- long entry_count; /* Recursion depth */
- int contention_count;
-};
-
-void initializeContentionCountMutex();
-
-typedef enum {
- ASYNC_REGISTER,
- ASYNC_UNREGISTER
-} async_action_t;
-
-/*
- * Macros
- */
-
-#define SYS_MID_NULL ((sys_mon_t *) 0)
-
-typedef enum {
- SYS_ASYNC_MON_ALARM = 1,
- SYS_ASYNC_MON_IO,
- SYS_ASYNC_MON_EVENT,
- SYS_ASYNC_MON_CHILD,
- SYS_ASYNC_MON_MAX
-} async_mon_key_t;
-
-#define SYS_ASYNC_MON_INPUT SYS_ASYNC_MON_IO
-#define SYS_ASYNC_MON_OUTPUT SYS_ASYNC_MON_IO
-
-sys_mon_t *asyncMon(async_mon_key_t);
-
-#endif /* !_JAVASOFT_SOLARIS_MONITOR_MD_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/mutex_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Interface to mutex HPI implementation for Solaris
- */
-
-#ifndef _JAVASOFT_MUTEX_MD_H_
-#define _JAVASOFT_MUTEX_MD_H_
-
-#include "porting.h"
-
-/*
- * Generally, we would typedef mutex_t to be whatever the system
- * supplies. But Solaris gives us mutex_t directly.
- */
-
-#ifdef USE_PTHREADS
-#define mutexInit(m) pthread_mutex_init(m, 0)
-#else
-#define mutexInit(m) mutex_init(m, USYNC_THREAD, 0)
-#endif
-#define mutexDestroy(m) mutex_destroy(m)
-#define mutexLock(m) mutex_lock(m)
-#define mutexUnlock(m) mutex_unlock(m)
-bool_t mutexLocked(mutex_t *);
-
-#endif /* !_JAVASOFT_MUTEX_MD_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/np.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Non-posix parts of the threads HPI.
- */
-
-#ifndef _JAVASOFT_NP_H_
-#define _JAVASOFT_NP_H_
-
-extern int np_suspend(sys_thread_t *tid);
-extern int np_continue(sys_thread_t *tid);
-
-extern int np_single(void);
-extern void np_multi(void);
-extern int np_stackinfo(void **addr, long *size);
-extern int np_initialize(void);
-extern void np_initialize_thread(sys_thread_t *tid);
-#ifdef __linux__
-extern int np_initial_suspend(sys_thread_t *tid);
-extern void np_free_thread(sys_thread_t *tid);
-#endif
-
-extern void np_profiler_init(sys_thread_t *tid);
-extern int np_profiler_suspend(sys_thread_t *tid);
-extern int np_profiler_continue(sys_thread_t *tid);
-extern bool_t np_profiler_thread_is_running(sys_thread_t *tid);
-
-#endif /* !_JAVASOFT_NP_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/porting.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_PORTING_H_
-#define _JAVASOFT_PORTING_H_
-
-#ifndef USE_PTHREADS
-
-#include <thread.h>
-#include <sys/lwp.h>
-#include <synch.h>
-
-#else /* USE_PTHREADS */
-
-#include <pthread.h>
-
-/* There is a handshake between a newly created thread and its creator
- * at thread startup because the creator thread needs to suspend the
- * new thread. Currently there are two ways to do this -- with
- * semaphores and with mutexes. The semaphore based implementation is
- * cleaner and hence is the default. We wish the mutex based one will
- * go away, but turns out the implementation of semaphores on
- * Linux/ppc etc is flaky, so the mutex based solution lives for now.
- */
-#ifndef USE_MUTEX_HANDSHAKE
-#include <semaphore.h>
-#endif
-
-#undef BOUND_THREADS
-
-#define thread_t pthread_t
-
-#define mutex_t pthread_mutex_t
-#define mutex_lock pthread_mutex_lock
-#define mutex_trylock pthread_mutex_trylock
-#define mutex_unlock pthread_mutex_unlock
-#define mutex_destroy pthread_mutex_destroy
-
-#define cond_t pthread_cond_t
-#define cond_destroy pthread_cond_destroy
-#define cond_wait pthread_cond_wait
-#define cond_timedwait pthread_cond_timedwait
-#define cond_signal pthread_cond_signal
-#define cond_broadcast pthread_cond_broadcast
-
-#define thread_key_t pthread_key_t
-#define thr_setspecific pthread_setspecific
-#define thr_keycreate pthread_key_create
-
-#define thr_sigsetmask pthread_sigmask
-#define thr_self pthread_self
-#define thr_yield sched_yield
-#define thr_kill pthread_kill
-#define thr_exit pthread_exit
-#ifdef __linux__
-void intrHandler(void*);
-#endif
-#endif /* USE_PTHREADS */
-
-#endif /* !_JAVASOFT_PORTING_H_ */
--- a/jdk/src/solaris/hpi/native_threads/include/threads_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of the Java threads HPI on top of Solaris threads
- */
-
-#ifndef _JAVASOFT_SOLARIS_THREADS_MD_H_
-#define _JAVASOFT_SOLARIS_THREADS_MD_H_
-
-#include "porting.h"
-
-#ifdef sparc
-#define N_TRACED_REGS 12
-#elif i386
-#define N_TRACED_REGS 7
-#elif amd64
-#define N_TRACED_REGS 15
-#elif ppc
-#define N_TRACED_REGS 1
-#elif m68k
-#define N_TRACED_REGS 8
-#elif ia64
-/* [RGV] I don't think this is referenced in the linux code */
-#define N_TRACED_REGS 32
-#else
-// TODO: delete this file - threads_md.[ch] is obsolete. struct sys_thread is
-// never used. Define a value just to keep compiler happy.
-#define N_TRACED_REGS 32
-#endif
-
-/* Turn on if we want all java threads to be bound tolwps */
-/* #define BOUND_THREADS */
-/* Use /proc soln to stop lwps in place of siglwp soln */
-#define PROCLWP
-
-/*
- * Thread C stack overflow check
-#define sysThreadCheckStack(redzone, var) \
- ((var = sysThreadSelf()) && \
- (unsigned int)((char *)&(var) - (char *)(var)->stack_base)\
- < (redzone))
-*/
-/*
- * Forward definition of machine dependent monitor struct
- */
-struct sys_mon;
-
-/*
- * The following thread states are really hints since there is no
- * interface to get at a native thread's true state. The states
- * are maintained by updating the states where ever possible
- * such as a transition to CONDVAR_WAIT occurs in the definition of
- * the routine condvarWait().
- * This state maintenance should disappear once we have a threads interface
- * to obtain a thread's state.
- */
-typedef enum {
- FIRST_THREAD_STATE,
- RUNNABLE = FIRST_THREAD_STATE,
- SUSPENDED,
- CONDVAR_WAIT,
- NUM_THREAD_STATES
-} thread_state_t;
-
-#if defined( USE_PTHREADS) && !defined(__linux__)
-/*
- * Mechanism for starting a new thread suspended.
- */
-typedef enum {
- NEW_THREAD_MUST_REQUEST_SUSPEND,
- NEW_THREAD_REQUESTED_SUSPEND,
- NEW_THREAD_SUSPENDED
-} new_thr_state_t;
-
-typedef struct {
- pthread_mutex_t m;
- pthread_cond_t c;
- new_thr_state_t state;
-} new_thr_cond_t;
-#endif /* USE_PTHREADS */
-
-/*
- * Machine dependent info in a sys_thread_t
- */
-struct sys_thread {
- /*
- * Fields below this point may change on a per-architecture basis
- * depending on how much work is needed to present the sysThread
- * model on any given thread implementation.
- */
- mutex_t mutex; /* per thread lock to protect thread fields */
- thread_t sys_thread; /* The native thread id */
- struct sys_thread *next; /* Pointer to next thread in the */
- /* queue of all threads. */
- thread_state_t state;
-
- /* Thread status flags */
- unsigned int primordial_thread:1;
- unsigned int system_thread:1;
- unsigned int cpending_suspend:1;
-#ifdef __linux__
- unsigned int pending_interrupt:1;
-#endif
- unsigned int interrupted:1;
- unsigned int onproc:1; /* set if thread is on an LWP */
- unsigned int :0;
-
-#ifdef BOUND_THREADS
- lwpid_t lwpid;
-#endif
-
-#ifdef __linux__
- void *sp;
-#else
- unsigned long sp; /* sp at time of last (native) thread switch */
-#endif
- void * stack_bottom; /* The real bottom (high address) of stack */
- void * stack_top; /* should be equal to stack_bottom - stack_size */
- long stack_size; /* The stack size for a native thread */
-
- long regs[N_TRACED_REGS]; /* stores registers as GC roots. */
-
- /* Monitor specific.
-
- Every monitor keeps track of the number of times it is
- entered. When that count goes to 0, the monitor can be
- freed up. But each thread has its own entry count on a
- particular monitor, because multiple threads can be using a
- single monitor (as one does a wait, another enters, etc.).
- Each thread can only be waiting in exactly one monitor.
- That monitor waited on is saved in mon_wait, and the value
- of the monitor's entry_count when the wait was performed is
- saved in monitor_entry_count. That is restored into the
- monitor when this waiting thread is notified. */
-
- long monitor_entry_count; /* For recursive monitor entry */
- struct sys_mon *mon_wait; /* CONDVAR_WAIT'ing */
-
- struct sys_mon *mon_enter; /* blocked waiting to enter */
-
- void (*start_proc)(void *);
- void *start_parm;
- int lwp_id;
- long last_sum;
-
- struct sys_thread *prevBlocked; /* Used by nonblocking close semantics */
- struct sys_thread *nextBlocked;
-#ifdef USE_PTHREADS
- int suspend_count;
-#ifdef __linux__
- sem_t sem_suspended;
- sem_t sem_ready_to_suspend;
- sem_t sem_selfsuspend;
- int selfsuspended;
-#endif
-#ifdef USE_MUTEX_HANDSHAKE
- new_thr_cond_t ntcond;
-#else
- sem_t sem;
-#endif /* USE_MUTEX_HANDSHAKE */
-#endif /* USE_PTHREADS */
-};
-
-#define SYS_THREAD_NULL ((sys_thread_t *) 0)
-
-/*
- * following macro copied from sys/signal.h since inside #ifdef _KERNEL there.
- */
-#ifndef sigmask
-#define sigmask(n) ((unsigned int)1 << (((n) - 1) & (32 - 1)))
-#endif
-
-#ifdef __linux__
-extern thread_key_t intrJmpbufkey;
-#else
-extern thread_key_t sigusr1Jmpbufkey;
-extern sigset_t sigusr1Mask;
-#endif
-
-extern sys_mon_t *_sys_queue_lock;
-
-#define SYS_QUEUE_LOCK(self) sysMonitorEnter(self, _sys_queue_lock)
-#define SYS_QUEUE_LOCKED(self) sysMonitorEntered(self, _sys_queue_lock)
-#define SYS_QUEUE_UNLOCK(self) sysMonitorExit(self, _sys_queue_lock)
-#define SYS_QUEUE_NOTIFYALL(self) sysMonitorNotifyAll(self, _sys_queue_lock)
-#define SYS_QUEUE_WAIT(self) sysMonitorWait(self, _sys_queue_lock, \
- SYS_TIMEOUT_INFINITY)
-
-extern void setFPMode(void);
-
-extern sys_thread_t *ThreadQueue;
-
-extern int ActiveThreadCount; /* All threads */
-
-#endif /* !_JAVASOFT_SOLARIS_THREADS_MD_H_ */
--- a/jdk/src/solaris/hpi/native_threads/src/condvar_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 1994, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Condition variable HPI implementation for Solaris
- */
-
-#include <errno.h>
-#include <time.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <limits.h>
-
-#include "hpi_impl.h"
-
-#include "condvar_md.h"
-#include "mutex_md.h"
-#include "threads_md.h"
-
-int
-condvarInit(condvar_t *condvar)
-{
- int err;
-
-#ifdef USE_PTHREADS
- err = pthread_cond_init(&condvar->cond, NULL);
-#else
- err = cond_init(&condvar->cond, USYNC_THREAD, 0 /* ignored */);
-#endif
- condvar->counter = 0;
- return (err == 0 ? SYS_OK : SYS_ERR);
-}
-
-int
-condvarDestroy(condvar_t *condvar)
-{
- int err;
-
-#ifdef __linux__
- err = pthread_cond_destroy((cond_t *) &condvar->cond);
-#else
- err = cond_destroy((cond_t *) condvar);
-#endif
- return (err == 0 ? SYS_OK : SYS_ERR);
-}
-
-int
-condvarWait(condvar_t *condvar, mutex_t *mutex, thread_state_t wtype)
-{
- sigjmp_buf jmpbuf;
- int err;
-
- sys_thread_t *self = sysThreadSelf();
- /*
- * There is no threads interface to get a thread's state. So, instead,
- * we use this hack so that the debugger agent can get at this thread's
- * state. Of course, this is not very reliable, but when a thread goes
- * to sleep, it *will* be reported as sleeping. During the transition
- * from running to sleep, it may be incorrectly reported, since the
- * setting of the state here is not atomic with the voluntary sleep.
- * The better fix is to extend the Solaris threads interface and have
- * the debugger agent call this interface OR to use libthread_db for
- * intra-process state reporting.
- *
- * Now, condition variables are used either for waiting to enter a
- * monitor (MONITOR_WAIT) or to execute a "wait()" method when already
- * holding a monitor (CONDVAR_WAIT). So, when condvarWait() is called
- * it could be to wait for a monitor or for a condition within a
- * monitor. This is indicated by the "wtype" argument to condvarWait().
- * This type is set in the thread state before going to sleep.
- */
- self->state = wtype;
-
-#ifdef __linux__
- /*
- * Register our intrHandler as a cleanup handler. If we get
- * interrupted (i.e. canceled), we longjmp out of this handler.
- */
- pthread_cleanup_push(intrHandler, NULL);
- if (setjmp(jmpbuf) == 0) {
- /*
- * Set the jmp buf and enable cancellation.
- */
- thr_setspecific(intrJmpbufkey, &jmpbuf);
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-
- /*
- * Note: pthread_cond_wait is _not_ interruptible on Linux
- */
-#else
- thr_setspecific(sigusr1Jmpbufkey, &jmpbuf);
- if (sigsetjmp(jmpbuf, 1) == 0) {
- sigset_t osigset;
-
- thr_sigsetmask(SIG_UNBLOCK, &sigusr1Mask, &osigset);
-again:
-#endif
- err = cond_wait((cond_t *) condvar, (mutex_t *) mutex);
- switch(err) {
- case 0:
- err = SYS_OK;
- break;
-#ifndef __linux__
- case EINTR: /* Signals other than USR1 were received. */
- goto again;
-#endif
- default:
- err = SYS_ERR;
- }
-#ifdef __linux__
- /*
- * Disable cancellation and clear the jump buf.
- */
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
- thr_setspecific(intrJmpbufkey, NULL);
-#else
- thr_sigsetmask(SIG_SETMASK, &osigset, NULL);
-#endif
- } else {
- /*
- * we've received a SIGUSR1 to interrupt our wait. We just return
- * and something above use notices the change.
- * clear the jump buf just to be paranoid.
- */
-#ifndef __linux__
- thr_setspecific(sigusr1Jmpbufkey, NULL);
-#endif
- err = SYS_INTRPT;
- }
-#ifdef __linux__
- pthread_cleanup_pop(0);
-#endif
- /*
- * After having woken up, change the thread state to RUNNABLE, since
- * it is now runnable.
- */
- self->state = RUNNABLE;
-
- return err;
-}
-
-/*
- * Returns 0 if condition variable became true before timeout expired.
- * Returns 1 if timeout expired first.
- * Returns <0 if wait fails for any other reason.
- */
-int
-condvarTimedWait(condvar_t *condvar, mutex_t *mutex,
- jlong millis, thread_state_t wtype)
-{
-#ifdef __linux__
- jmp_buf jmpbuf;
-#else
- sigjmp_buf jmpbuf;
-#endif
- int err;
- struct timespec timeout;
- sys_thread_t *self;
- jlong end_time;
-
- if (millis < 0)
- return SYS_ERR;
-
- if (millis > (jlong)INT_MAX) {
- return condvarWait(condvar, mutex, wtype);
- }
-
- end_time = sysTimeMillis() + millis;
-
- self = sysThreadSelf();
- self->state = wtype;
-
-#ifdef __linux__
- /*
- * Register our intrHandler as a cleanup handler. If we get
- * interrupted (i.e. canceled), we longjmp out of this handler.
- */
- pthread_cleanup_push(intrHandler, NULL);
- if (setjmp(jmpbuf) == 0) {
- /*
- * Set the jmp buf and enable cancellation.
- */
- thr_setspecific(intrJmpbufkey, &jmpbuf);
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-
- /*
- * Calculate an absolute timeout value.
- */
- timeout.tv_sec = end_time / 1000;
- timeout.tv_nsec = (end_time % 1000) * 1000000;
-
- again:
-#else
- thr_setspecific(sigusr1Jmpbufkey, &jmpbuf);
- if (sigsetjmp(jmpbuf, 1) == 0) {
- sigset_t osigset;
-
- thr_sigsetmask(SIG_UNBLOCK, &sigusr1Mask, &osigset);
-
- again:
- timeout.tv_sec = end_time / 1000;
- timeout.tv_nsec = (end_time % 1000) * 1000000;
-#endif
- err = cond_timedwait((cond_t *)condvar, (mutex_t *)mutex, &timeout);
- switch(err) {
- case 0:
- err = SYS_OK;
- break;
- case EINTR: /* Signals other than USR1 were received. */
- if (sysTimeMillis() < end_time) {
- goto again;
- }
- /*FALLTHRU*/
-#ifdef USE_PTHREADS
- case ETIMEDOUT:
-#else
- case ETIME:
-#endif
- err = SYS_TIMEOUT;
- break;
- default:
- err = SYS_ERR;
- }
-#ifdef __linux__
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
- thr_setspecific(intrJmpbufkey, NULL);
-#else
- thr_sigsetmask(SIG_SETMASK, &osigset, NULL);
-#endif
- } else {
- /*
- * we've received a SIGUSR1 to interrupt our wait. We just return
- * and something above use notices the change.
- * clear the jump buf just to be paranoid.
- */
-#ifndef __linux__
- thr_setspecific(sigusr1Jmpbufkey, NULL);
-#endif
- err = SYS_INTRPT;
- }
-#ifdef __linux__
- /* Remove intrHandler without calling it. */
- pthread_cleanup_pop(0);
-
- sysAssert(pthread_mutex_trylock(mutex) == EBUSY);
-
- /*
- * After having woken up, change the thread state to RUNNABLE, since
- * it is now runnable.
- */
-#endif
- self->state = RUNNABLE;
- return err;
-}
-
-int
-condvarSignal(condvar_t *condvar)
-{
- int err;
-
- err = cond_signal((cond_t *) condvar);
- condvar->counter++;
- return (err == 0 ? SYS_OK : SYS_ERR);
-}
-
-int
-condvarBroadcast(condvar_t *condvar)
-{
- int err;
-
- err = cond_broadcast((cond_t *) condvar);
- condvar->counter++;
- return (err == 0 ? SYS_OK : SYS_ERR);
-}
--- a/jdk/src/solaris/hpi/native_threads/src/interrupt_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 1994, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Solaris 2.X dependant interrupt handling code.
- */
-
-/*
- * Header files.
- */
-#include <stdio.h>
-#include <signal.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "hpi_impl.h"
-
-#include "mutex_md.h"
-#include "condvar_md.h"
-#include "monitor_md.h"
-#include "threads_md.h"
-#include "interrupt.h"
-
-static int pending_signals[N_INTERRUPTS];
-
-/* Stubs used from interrupt.c: they are nontrivial on Green */
-void intrLock() {}
-void intrUnlock() {}
-#ifdef __linux__
-extern int sr_sigsusp;
-extern int sr_sigresu;
-#endif
-
-/* We need a special monitor implementation for signals because
- * signal handlers are not necessarily called in a Java thread.
- */
-struct {
- thread_t owner;
- unsigned int count;
- mutex_t mutex;
- condvar_t condvar;
-} userSigMon;
-
-static void sigMonitorInit()
-{
- userSigMon.owner = 0;
- userSigMon.count = 0;
- mutexInit(&userSigMon.mutex);
- condvarInit(&userSigMon.condvar);
-}
-
-static void sigMonitorEnter()
-{
- thread_t self = thr_self();
-
- if (userSigMon.owner == self) {
- userSigMon.count++;
- } else {
- mutex_lock(&userSigMon.mutex);
- userSigMon.owner = self;
- userSigMon.count = 1;
- }
-}
-
-static void sigMonitorExit()
-{
- thread_t self = thr_self();
-
- sysAssert(userSigMon.owner == self);
- sysAssert(userSigMon.count > 0);
- if (--userSigMon.count == 0) {
- userSigMon.owner = 0;
- mutex_unlock(&userSigMon.mutex);
- }
-}
-
-static void sigMonitorNotify()
-{
- thread_t self = thr_self();
-
- sysAssert(userSigMon.owner == self);
- sysAssert(userSigMon.count > 0);
- condvarSignal(&userSigMon.condvar);
-}
-
-static void sigMonitorWait()
-{
- thread_t self = thr_self();
-
- unsigned int saved_count = userSigMon.count;
-
- sysAssert(userSigMon.owner == self);
- sysAssert(userSigMon.count > 0);
-
- userSigMon.count = 0;
- userSigMon.owner = 0;
-
- condvarWait(&userSigMon.condvar, &userSigMon.mutex, CONDVAR_WAIT);
-
- sysAssert(userSigMon.owner == 0);
- sysAssert(userSigMon.count == 0);
-
- userSigMon.count = saved_count;
- userSigMon.owner = self;
-}
-
-static int
-my_sigignore(int sig)
-{
-#ifndef HAVE_SIGIGNORE
- struct sigaction action;
- sigset_t set;
-
- action.sa_handler = SIG_IGN;
- action.sa_flags = 0;
- sigemptyset(&action.sa_mask);
-
- if (sigaction(sig, &action, (struct sigaction *)0) < 0)
- return -1;
- sigemptyset(&set);
- if (sigaddset(&set, sig) < 0)
- return -1;
- return sigprocmask(SIG_UNBLOCK, &set, (sigset_t *)0);
-#else
- return sigignore(sig);
-#endif /* HAVE_SIGIGNORE */
-}
-
-
-/*
- * intrInitMD() -- Target-specific initialization.
- */
-extern void
-intrInitMD()
-{
- memset(pending_signals, 0, sizeof(pending_signals));
- (void)my_sigignore(SIGPIPE);
- sigMonitorInit();
-}
-
-/*-
- * intrDispatchMD() -- Turn our signal into an intrDispatch().
- */
-void
-#ifdef SA_SIGINFO
-intrDispatchMD(int sig, siginfo_t *info, void *uc)
-#else
-intrDispatchMD(int sig)
-#endif /* SA_SIGINFO */
-{
- Log1(1, "signalHandlerDispatch(sig=%d)\n", sig);
-
- sigMonitorEnter();
-#ifdef SA_SIGINFO
-#if defined(__linux__) && defined(__sparc__)
- uc = (((char *)&sig) + 4 + 0x20);
- info = (siginfo_t *)(((char *)uc) + 0x60);
-#endif
- intrDispatch(sig, info, uc);
-#else
- intrDispatch(sig, 0, 0);
-#endif /* SA_SIGINFO */
-
- sigMonitorExit();
-}
-
-bool_t intrInUse(int sig)
-{
- /* Signals used in native threads implementation. */
-#ifdef __linux__
- return sig == SIGPIPE || sig == sr_sigsusp || sig == sr_sigresu;
-#else
- return sig == SIGPIPE || sig == SIGUSR1;
-#endif
-}
-
-void sysSignalNotify(int sig)
-{
- sigMonitorEnter();
- pending_signals[sig]++;
- sigMonitorNotify();
- sigMonitorExit();
-}
-
-static int lookupSignal()
-{
- int i;
- for (i = 0; i < N_INTERRUPTS; i++) {
- if (pending_signals[i]) {
- pending_signals[i]--;
- return i;
- }
- }
- return -1;
-}
-
-int sysSignalWait()
-{
- int sig;
- sigMonitorEnter();
- while ((sig = lookupSignal()) == -1) {
- sigMonitorWait();
- }
- sigMonitorExit();
- return sig;
-}
--- a/jdk/src/solaris/hpi/native_threads/src/monitor_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Monitor implementation for Native Solaris threads
- *
- * Java Monitors are implemented using one solaris mutex and two
- * condition variables. Because solaris mutex is not re-entrant we
- * cannot simply have a monitor map to a mutex as re-entering a monitor
- * would deadlock an application.
- *
- * Monitor is implemented using:
- * mutex_t mutex;
- * condvar_t cv_monitor;
- * condvar_t cv_waiters;
- *
- * mutex protects the monitor state.
- * cv_monitor is the condtion variable used along with mutex for
- * supporting wait and notify on the monitor.
- * cv_waiters is used for all the threads waiting to acquire the monitor
- * lock.
- *
- * All of the sysMonitorXXX() functions that are passed a sys_mon_t
- * assume that they get something nonnull, and only check when debugging.
- */
-
-#include "hpi_impl.h"
-
-#include "threads_md.h"
-#include "monitor_md.h"
-
-#include <errno.h>
-#include <limits.h>
-
-static mutex_t contention_count_mutex;
-
-void initializeContentionCountMutex()
-{
- mutexInit(&contention_count_mutex);
-}
-
-/*
- * Operations on monitors
- */
-/*
- * Return the size of the lib-dependent portion of monitors. This
- * is done this way so that monitors can be all of one piece,
- * without paying the penalty of an extra level of indirection on
- * each sys_mon reference. This is not how it is done for threads
- * and it might be a good idea to use a pointer the same way that
- * threads do.
- */
-size_t
-sysMonitorSizeof()
-{
- return sizeof(struct sys_mon);
-}
-
-int
-sysMonitorInit(sys_mon_t *mid)
-{
- int ret;
-
- sysAssert(mid != SYS_MID_NULL);
- ret = mutexInit(&mid->mutex);
- ret = (ret == SYS_OK ? condvarInit(&mid->cv_monitor) : ret);
-
- mid->entry_count = 0;
- mid->monitor_owner = SYS_THREAD_NULL;
- mid->contention_count = 0;
- INIT_MONITOR_WAIT_QUEUE( mid->mwait_queue );
-
- return ret;
-}
-
-/*
- * Free any system-dependent resources held by monitors. There is
- * nothing to be done for native Solaris mutexes or condition variables.
- */
-int
-sysMonitorDestroy(sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- return SYS_OK;
-}
-
-static void
-enqueue_me(monitor_waiter_t *mp, monitor_wait_queue_t *queue,
- sys_thread_t *self)
-{
- /*
- * Order does not matter here. It is more convenient to
- * enqueue ourselves at the head of the list, so we do so.
- */
- mp->waiting_thread = self;
- mp->next = queue->head;
- mp->prev = &(queue->head);
- if ( queue->head != NULL ){
- queue->head->prev = &(mp->next);
- }
- queue->head = mp;
- queue->count++;
-}
-
-static void
-dequeue_me(monitor_waiter_t *mp, monitor_wait_queue_t *queue)
-{
- queue->count--;
- *(mp->prev) = mp->next;
- if (mp->next != NULL ){
- mp->next->prev = mp->prev;
- }
- mp->next = NULL;
-}
-
-int
-sysMonitorEnter(sys_thread_t *self, sys_mon_t *mid)
-{
- int err;
-
- sysAssert(mid != SYS_MID_NULL);
- err = mutex_trylock(&mid->mutex);
- if (err == 0) { /* no one owns it */
- mid->monitor_owner = self;
- mid->entry_count = 1;
- return SYS_OK;
- } else if (err == EBUSY) { /* it's already locked */
- if (mid->monitor_owner == self) {
- mid->entry_count++;
- return SYS_OK;
- } else {
- self->mon_enter = mid;
- /* block on it */
- if (profiler_on) {
- VM_CALL(monitorContendedEnter)(self, mid);
- mutexLock(&contention_count_mutex);
- mid->contention_count++;
- mutexUnlock(&contention_count_mutex);
- }
- mutex_lock(&mid->mutex);
- mid->monitor_owner = self;
- mid->entry_count = 1;
- self->mon_enter = NULL;
- if (profiler_on) {
- mutexLock(&contention_count_mutex);
- mid->contention_count--;
- mutexUnlock(&contention_count_mutex);
- VM_CALL(monitorContendedEntered)(self, mid);
- }
- return SYS_OK;
- }
- } else {
- sysAssert(err == 0);
- return SYS_ERR;
- }
-}
-
-/*
- * Return true if we currently own this monitor (and threads have been
- * initialized.
- */
-bool_t
-sysMonitorEntered(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- /* We can only have locked monitors if threads have been initialized */
- return (mid->monitor_owner == self);
-}
-
-int
-sysMonitorExit(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- if (mid->monitor_owner == self) {
- sysAssert(mid->entry_count > 0);
- if (--mid->entry_count == 0) {
- mid->monitor_owner = SYS_THREAD_NULL;
- if (!mid->contention_count || !profiler_on) {
- mutex_unlock(&mid->mutex);
- } else {
- mutex_unlock(&mid->mutex);
- VM_CALL(monitorContendedExit)(self, mid);
- }
- }
- return SYS_OK;
- } else {
- return SYS_ERR;
- }
-}
-
-int
-sysMonitorNotify(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
- if (self == mid->monitor_owner) {
- if (ANY_WAITING(mid->mwait_queue)) {
- /* If there is someone doing a monitor wait */
- condvarSignal(&(mid->cv_monitor));
- }
- return SYS_OK;
- } else
- return SYS_ERR;
-}
-
-int
-sysMonitorNotifyAll(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
- if (self == mid->monitor_owner) {
- if (ANY_WAITING(mid->mwait_queue)) {
- /* If there is someone doing a monitor wait */
- condvarBroadcast(&(mid->cv_monitor));
- }
- return SYS_OK;
- } else
- return SYS_ERR;
-}
-
-int
-sysMonitorWait(sys_thread_t *self, sys_mon_t *mid, jlong millis)
-{
- int ret = SYS_OK;
- monitor_waiter_t me;
- sysAssert(mid != SYS_MID_NULL);
-
- if (self != mid->monitor_owner) {
- return SYS_ERR;
- }
- if (sysThreadIsInterrupted(self, TRUE)) {
- return SYS_INTRPT;
- }
-
- /* Prepare to wait: drop mutex ownership */
- sysAssert(self->monitor_entry_count == 0);
- sysAssert(self->mon_wait == 0);
- self->mon_wait = (sys_mon_t *) mid;
- self->monitor_entry_count = mid->entry_count;
- mid->entry_count = 0;
- mid->monitor_owner = SYS_THREAD_NULL;
-
- /* Add myself to the monitor waitq */
- enqueue_me(&me, &mid->mwait_queue, self);
- if (millis == SYS_TIMEOUT_INFINITY) {
- ret = condvarWait(&mid->cv_monitor, &mid->mutex, CONDVAR_WAIT);
- } else {
- ret = condvarTimedWait(&mid->cv_monitor, &mid->mutex, millis,
- CONDVAR_WAIT);
- }
- dequeue_me(&me, &mid->mwait_queue);
-
- sysAssert(mid->monitor_owner == NULL);
- sysAssert(mid->entry_count == 0);
- mid->monitor_owner = self;
- mid->entry_count = self->monitor_entry_count;
- self->monitor_entry_count = 0;
- self->mon_wait = 0;
-
- /* Did we get interrupted in mid-wait? (IS THIS THE RIGHT PLACE?) */
- if (sysThreadIsInterrupted(self, TRUE)) {
- return SYS_INTRPT;
- }
-
- return ret;
-}
-
-static int
-dumpWaitingQueue(monitor_wait_queue_t *queue, sys_thread_t **waiters, int sz)
-{
- int n;
- monitor_waiter_t * waiter;
- if (queue == NULL || ( waiter = queue->head ) == NULL ) {
- return 0;
- }
- for (n = 0; waiter != 0; waiter = waiter->next, n++, sz--) {
- if (sz > 0) {
- waiters[n] = waiter->waiting_thread;
- }
- }
- return n;
-}
-
-typedef struct {
- sys_mon_t *mid;
- sys_thread_t **waiters;
- int sz;
- int nwaiters;
-} wait_info;
-
-static int
-findWaitersHelper(sys_thread_t *t, void *arg)
-{
- wait_info * winfo = (wait_info *) arg;
- if (t->mon_enter == winfo->mid) {
- if (winfo->sz > 0) {
- winfo->waiters[winfo->nwaiters] = t;
- }
- winfo->sz--;
- winfo->nwaiters++;
- }
- return SYS_OK;
-}
-
-int
-sysMonitorGetInfo(sys_mon_t *mid, sys_mon_info *info)
-{
- wait_info winfo;
-
- sysAssert(mid != SYS_MID_NULL);
- info->owner = mid->monitor_owner;
- if (mid->monitor_owner) {
- info->entry_count = mid->entry_count;
- }
-
- winfo.mid = mid;
- winfo.nwaiters = 0;
- winfo.waiters = info->monitor_waiters;
- winfo.sz = info->sz_monitor_waiters;
- sysThreadEnumerateOver(findWaitersHelper, (void *) &winfo);
- info->n_monitor_waiters = winfo.nwaiters;
-
- info->n_condvar_waiters = dumpWaitingQueue(&mid->mwait_queue,
- info->condvar_waiters,
- info->sz_condvar_waiters);
-
- return SYS_OK;
-}
-
-
-bool_t
-sysMonitorInUse(sys_mon_t * mon)
-{
- return mon->monitor_owner != 0 ||
- mon->mwait_queue.count != 0;
-}
-
-sys_thread_t *
-sysMonitorOwner(sys_mon_t *mon)
-{
- return mon->monitor_owner;
-}
--- a/jdk/src/solaris/hpi/native_threads/src/mutex_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Mutex HPI implementation for Solaris
- *
- * Mutexes are used both by the system-independent monitor implementation and
- * to implement critical regions elsewhere within the runtime.
- */
-
-#include <errno.h>
-
-#include "hpi_impl.h"
-
-#include "mutex_md.h"
-#include "threads_md.h"
-
-/*
- * Return true of the mutex in question is already locked. note:
- * this does not tell if the mutex is already locked by *this*
- * thread, only that is is locked by *some* thread.
- */
-bool_t
-mutexLocked(mutex_t *mutex)
-{
- if (mutex_trylock(mutex) == 0) {
- mutex_unlock(mutex);
- return FALSE;
- }
- return TRUE;
-}
--- a/jdk/src/solaris/hpi/native_threads/src/sys_api_td.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,599 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Solaris-dependent I/O Note: Routines here are just place holders -
- * eventually we need to put in a solution that involves using
- * setjmp/longjmp to avoid io races. Look at green_threads/io_md.c for
- * more detailed comments on the architechture of the io modules.
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#ifdef HAVE_FILIOH
-#include <sys/filio.h>
-#else
-#include <sys/ioctl.h>
-#endif
-
-#include <sys/socket.h>
-#include <setjmp.h>
-#include <signal.h>
-#ifndef USE_SELECT
-#include <poll.h>
-#endif
-
-#include "hpi_impl.h"
-
-#include "threads_md.h"
-#include "io_md.h"
-#include "largefile.h"
-#include "mutex_md.h"
-
-#if defined(__solaris__) && defined(NO_INTERRUPTIBLE_IO)
-#error If there was no policy change, this could be a makefile error.
-#endif
-
-#ifdef NO_INTERRUPTIBLE_IO
-#undef CLOSEIO
-#else
-#define CLOSEIO
-#endif /* NO_INTERRUPTIBLE_IO */
-
-/* Get typedef for rlim_t */
-#include <sys/resource.h>
-
-#ifdef CLOSEIO
-
-/*
- * Structure for file control block, used by closable IO.
- * We should NOT add more field into the data structure.
- * Otherwise, the sysRead() will only work with sysOpen,
- * and may NOT work with a fd return by open()
- */
-typedef struct
-{
- mutex_t lock; /* lock against the entry */
- sys_thread_t* list; /* blocking list on the fd */
-} file_t;
-
-/*
- * Global data structure for interruptable io.
- * It must be initialized before any IO access.
- */
-static file_t * fd_table = 0;
-static int fd_limit = 0;
-
-/*
- * Initialize global data structure for non-blocking
- * close semantics for Solaris 2.6 and ealier.
- */
-int InitializeIO(rlim_t limit)
-{
- int i;
-
- fd_limit = (int) limit;
-
- fd_table = (file_t *) sysCalloc(fd_limit, sizeof(file_t));
- if (fd_table == 0) {
- return SYS_ERR;
- }
-
- for (i = 0; i < fd_limit; i++) {
- mutexInit(&(fd_table[i].lock));
- }
-
- return SYS_OK;
-}
-
-/*
- * Cleanup the data structure allocated as above.
- * For JDK 1.2, this function is not called ...
- */
-void FinalizeIO() {
- int i;
- for (i = 0; i < fd_limit; i++) {
- mutexDestroy(&fd_table[i].lock);
- }
- sysFree(fd_table);
- fd_table = 0;
-}
-
-/*
- * Non-blocking close semantics on Solaris native thread.
- */
-int sysClose(int fd)
-{
- int ret;
-
- /* Check if it is valid fd. */
- if (fd >= 0 && fd < fd_limit) {
- file_t* file = &fd_table[fd];
- sys_thread_t *thread;
- sys_thread_t *next;
-
- /* Lock the corresponding fd. */
- mutexLock(&file->lock);
-
- /* Read the blocking list. */
- thread = file->list;
-
- /* Iterates the list and interrupt every thread in there. */
- while (thread) {
- /* This is the classic double-linked list operation. */
- if (thread->nextBlocked != thread) {
- next = thread->nextBlocked;
-
- next->prevBlocked = thread->prevBlocked;
- thread->prevBlocked->nextBlocked = next;
- } else {
- next = 0;
- }
-
- thread->nextBlocked = 0;
- thread->prevBlocked = 0;
-
- /*
- * Use current interruptable IO mechanism to
- * implement non-blocking closable IO.
- */
- sysThreadInterrupt(thread);
-
- thread = next;
- }
-
- file->list = 0;
-
- ret = close(fd);
-
- mutexUnlock(&file->lock);
- } else {
- /* It is not a valid fd. */
- errno = EBADF;
- ret = SYS_ERR;
- }
-
- return ret;
-}
-
-/*
- * Called before entering blocking IO. Enqueue the current
- * thread to the fd blocking list. Need fd lock.
- */
-static void BeginIO(sys_thread_t* self, file_t* file) {
- mutexLock(&file->lock);
-
- if (!file->list) {
- file->list = self->nextBlocked = self->prevBlocked = self;
- } else {
- sys_thread_t* head = file->list;
-
- self->prevBlocked = head->prevBlocked;
- self->nextBlocked = head;
- head->prevBlocked->nextBlocked = self;
- head->prevBlocked = self;
- }
- mutexUnlock(&file->lock);
-}
-
-/*
- * Called after finishing blocking IO. Dequeue the current
- * thread from the blocking list. Note: It may be waken up
- * by thread interrupt or fd close operation.
- */
-static ssize_t EndIO(sys_thread_t* self, file_t* file, ssize_t ret) {
- mutexLock(&file->lock);
-
- /*
- * Dequeue the current thread. It is classic double
- * linked list operation.
- */
-#ifdef __linux__
- if (!sysThreadIsInterrupted(self, 1) && self->prevBlocked) {
-#else
- if (self->prevBlocked) {
-#endif
- if (self->nextBlocked != self) {
- self->prevBlocked->nextBlocked = self->nextBlocked;
- self->nextBlocked->prevBlocked = self->prevBlocked;
- file->list = self->nextBlocked;
- } else {
- file->list = 0;
- }
- self->nextBlocked = 0;
- self->prevBlocked = 0;
- } else {
-#ifdef __linux__
- if (self->nextBlocked && self->prevBlocked) {
- if (self->nextBlocked != self) {
- self->prevBlocked->nextBlocked = self->nextBlocked;
- self->nextBlocked->prevBlocked = self->prevBlocked;
- file->list = self->nextBlocked;
- } else {
- file->list = 0;
- }
- }
- self->nextBlocked = 0;
- self->prevBlocked = 0;
-#endif
- /* file got closed during blocking call */
- errno = EBADF;
- ret = SYS_ERR;
- }
-
- mutexUnlock(&file->lock);
-
- return ret;
-}
-
-/*
- * The following is a big macro used to implement the closable IO.
- * Note: It is also used by interruptable IO. If later we need to
- * deprecate interruptable IO, all we need to change the return
- * value and errno to EBADF instead of EINTR. The high level
- * routine will interpret it as IOException instead of
- * InterruptedIOException. No other change is needed.
- * The underlying mechanism is using the SIGUSR1 signal to wake up the
- * blocking thread. This may cause severe conflicts with any other
- * libraries that also use SIGUSR1.
- */
-#ifdef __linux__
-#define INTERRUPT_IO(cmd) \
-{\
- ssize_t ret = 0;\
- file_t* file;\
- sys_thread_t* self = sysThreadSelf();\
-\
- if (fd < 0 || fd >= fd_limit) {\
- errno = EBADF;\
- return SYS_ERR;\
- }\
-\
- file = &fd_table[fd];\
- BeginIO(self, file);\
-\
- {\
- jmp_buf jmpbuf;\
-\
- /*\
- * Register our intrHandler as a cleanup handler. If we get\
- * interrupted (i.e. canceled), we longjmp out of this handler.\
- */\
- pthread_cleanup_push(intrHandler, NULL);\
- if (setjmp(jmpbuf) == 0) {\
- thr_setspecific(intrJmpbufkey, &jmpbuf);\
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);\
- ret = cmd;\
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);\
- thr_setspecific(intrJmpbufkey, NULL);\
- } else {\
- /* [jk] should/can we call sysThreadIsInterrupted(self, 1) here */
-
- self->interrupted = FALSE;\
- errno = EINTR;\
- ret = SYS_INTRPT;\
- }\
- /* Remove intrHandler without calling it. */\
- pthread_cleanup_pop(0);\
- }\
-\
- return EndIO(self, file, ret);\
-}
-#else
-#define INTERRUPT_IO(cmd) \
-{\
- int ret = 0;\
- file_t* file;\
- sys_thread_t* self = sysThreadSelf();\
-\
- if (fd < 0 || fd >= fd_limit) {\
- errno = EBADF;\
- return SYS_ERR;\
- }\
-\
- file = &fd_table[fd];\
- BeginIO(self, file);\
-\
- {\
- sigjmp_buf jmpbuf;\
- sigset_t omask;\
-\
- thr_setspecific(sigusr1Jmpbufkey, &jmpbuf);\
- if (sigsetjmp(jmpbuf, 1) == 0) {\
- thr_sigsetmask(SIG_UNBLOCK, &sigusr1Mask, &omask);\
- ret = cmd;\
- thr_sigsetmask(SIG_SETMASK, &omask, NULL);\
- } else {\
- sysThreadIsInterrupted(self, TRUE);\
- errno = EINTR;\
- ret = SYS_INTRPT;\
- }\
- }\
-\
- return EndIO(self, file, ret);\
-}
-#endif
-
-#else /* CLOSEIO */
-
-#define INTERRUPT_IO(cmd) \
- return cmd;
-
-int sysClose(int fd) {
- return close(fd);
-}
-
-int InitializeIO(rlim_t limit)
-{
- return SYS_OK;
-}
-#endif /* CLOSEIO */
-
-/*
- * sys API for I/O
- */
-
-size_t
-sysRead(int fd, void *buf, unsigned int nBytes) {
- INTERRUPT_IO(read(fd, buf, nBytes))
-}
-
-size_t
-sysWrite(int fd, const void *buf, unsigned int nBytes) {
- INTERRUPT_IO(write(fd, buf, nBytes))
-}
-
-int
-sysSocket(int domain, int type, int protocol) {
- return socket(domain, type, protocol);
-}
-
-ssize_t
-sysRecv(int fd, char *buf, int nBytes, int flags) {
- INTERRUPT_IO(recv(fd, buf, nBytes, flags))
-}
-
-ssize_t
-sysSend(int fd, char *buf, int nBytes, int flags) {
- INTERRUPT_IO(send(fd, buf, nBytes, flags))
-}
-/*
-int
-sysClose(int fd) {
- INTERRUPT_IO(close(fd))
-}
-*/
-jlong
-sysSeek(int fd, jlong offset, int whence) {
- return lseek64_w(fd, offset, whence);
-}
-
-int
-sysSetLength(int fd, jlong length) {
- return ftruncate64_w(fd, length);
-}
-
-int
-sysSync(int fd) {
- /*
- * XXX: Is fsync() interruptible by the interrupt method?
- * Is so, add the TSD, sigsetjmp()/longjmp() code here.
- *
- * This probably shouldn't be throwing an error and should
- * be a macro.
- */
- int ret;
- if ((ret = fsync(fd)) == -1) {
- }
- return ret;
-}
-
-int
-sysAvailable(int fd, jlong *pbytes) {
- jlong cur, end;
- int mode;
-
- if (sysFfileMode(fd, &mode) >= 0) {
- if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
- /*
- * XXX: is the following call interruptible? If so, this might
- * need to go through the INTERRUPT_IO() wrapper as for other
- * blocking, interruptible calls in this file.
- */
- int n;
- if (ioctl(fd, FIONREAD, &n) >= 0) {
- *pbytes = n;
- return 1;
- }
- }
- }
- if ((cur = lseek64_w(fd, 0L, SEEK_CUR)) == -1) {
- return 0;
- } else if ((end = lseek64_w(fd, 0L, SEEK_END)) == -1) {
- return 0;
- } else if (lseek64_w(fd, cur, SEEK_SET) == -1) {
- return 0;
- }
- *pbytes = end - cur;
- return 1;
-}
-
-/* IO routines that take in a FD object */
-
-int
-sysTimeout(int fd, long timeout) {
-#ifndef USE_SELECT
- struct pollfd pfd;
-
-#ifdef __linux__
- jlong end_time = sysTimeMillis() + (jlong) timeout;
- volatile jlong to = (jlong) timeout;
-#endif
-
- pfd.fd = fd;
- pfd.events = POLLIN;
-
-#ifdef __linux__
- INTERRUPT_IO(__extension__ ({
- int __result;
- do {
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
- __result = poll(&pfd, 1, ((int)to));
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
- } while (__result == -1 && errno == EINTR &&
- (to = end_time - sysTimeMillis()) > 0 &&
- ((pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) == 0));
- if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
- __result = -1;
- errno = EBADF;
- }
- (__result == -1 && errno == EINTR) ? 0 : __result;
- }))
-#else
- INTERRUPT_IO(poll(&pfd, 1, (int)timeout))
-#endif
-#else
- fd_set tbl;
- struct timeval t;
-
- t.tv_sec = timeout / 1000;
- t.tv_usec = (timeout % 1000) * 1000;
-
- FD_ZERO(&tbl);
- FD_SET(fd, &tbl);
-
-#ifdef __linux__
- INTERRUPT_IO(TEMP_FAILURE_RETRY(select(fd + 1, &tbl, 0, 0, &t)))
-#else
- INTERRUPT_IO(select(fd + 1, &tbl, 0, 0, &t))
-#endif
-#endif
-}
-
-
-/*
- * sys API for networking
- */
-
-long
-sysSocketAvailable(int fd, jint *pbytes) {
- long ret = 1;
- /*
- * An ILP64 port of this code should pass the address of a local int
- * to the ioctl and then convert that to jint with any error handling
- * required for overflows, if overflow is possible.
- */
-
- /*
- * XXX: is the following call interruptible? If so, this might
- * need to go through the INTERRUPT_IO() wrapper as for other
- * blocking, interruptible calls in this file.
- */
- if (fd < 0 || ioctl(fd, FIONREAD, pbytes) < 0) {
- ret = 0;
- }
- return ret;
-}
-
-int
-sysListen(int fd, int count) {
- return listen(fd, count);
-}
-
-int
-sysConnect(int fd, struct sockaddr *addr, int size) {
- INTERRUPT_IO(connect(fd, addr, size))
-}
-
-int
-sysBind(int fd, struct sockaddr *addr, int size) {
- INTERRUPT_IO(bind(fd, addr, size))
-}
-
-int
-sysAccept(int fd, struct sockaddr *him, int *len) {
- INTERRUPT_IO(accept(fd, him, (uint *)len))
-}
-
-int
-sysGetSockName(int fd, struct sockaddr *him, int *len) {
- return getsockname(fd, him, (uint *)len);
-}
-
-int
-sysSocketClose(int fd) {
- return sysClose(fd);
-}
-
-int
-sysSocketShutdown(int fd, int howto) {
- return shutdown(fd, howto);
-}
-
-int
-sysGetSockOpt(int fd, int level, int optname, char *optval, int *optlen) {
- return getsockopt(fd, level, optname, optval, optlen);
-}
-
-int
-sysSetSockOpt(int fd, int level, int optname, const char *optval, int optlen) {
- return setsockopt(fd, level, optname, optval, optlen);
-}
-
-int
-sysGetHostName(char *hostname, int namelen) {
- return gethostname(hostname, namelen);
-}
-
-struct hostent *
-sysGetHostByAddr(const char *hostname, int len, int type) {
- return gethostbyaddr(hostname, len, type);
-}
-
-struct hostent *
-sysGetHostByName(char *hostname) {
- return gethostbyname(hostname);
-}
-
-struct protoent *
-sysGetProtoByName(char* name) {
- return getprotobyname(name);
-}
-
-/*
- * Routines to do datagrams
- */
-ssize_t
-sysSendTo(int fd, char *buf, int len,
- int flags, struct sockaddr *to, int tolen) {
- INTERRUPT_IO(sendto(fd, buf, len, flags, to, tolen))
-}
-
-ssize_t
-sysRecvFrom(int fd, char *buf, int nBytes,
- int flags, struct sockaddr *from, int *fromlen) {
- INTERRUPT_IO(recvfrom(fd, buf, nBytes, flags, from, (uint *)fromlen))
-}
--- a/jdk/src/solaris/hpi/native_threads/src/threads_linux.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,411 +0,0 @@
-/*
- * Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of notposix.h on Linux.
- */
-
-#include <pthread.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <time.h>
-
-#include "hpi_impl.h"
-#include "monitor_md.h"
-#include "threads_md.h"
-#include "np.h"
-
-#undef LOG_THREADS
-
-/* Global lock used when calling np_suspend and np_resume */
-static pthread_mutex_t sr_lock;
-
-/* Semaphore used to acknowledge when the handler has received HANDLER_SIG */
-static sem_t sr_sem;
-
-/* The tid of the thread being suspended/resumed */
-static sys_thread_t *sr_tid;
-
-int sr_sigsusp;
-int sr_sigresu;
-
-static void prtsigset(char *s, sigset_t *set)
-{
- int sig;
- dprintf(2, "%s:", s);
- for (sig = 1; sig < _NSIG; sig++) {
- if (sigismember(set, sig)) {
- dprintf(2, " %d", sig);
- }
- }
- dprintf(2, "\n");
-}
-
-/*
- * Handler function invoked when a thread's execution is suspended
- * We have to be careful that only async-safe functions are
- * called here. I'm not even sure if calling sysThreadSelf is safe so
- * we temporarily stash SP in a global variable instead.
- */
-static void
-#ifdef SA_SIGINFO
-susp_handler(int sig, siginfo_t* info, void* arg)
-#else
-susp_handler(int sig)
-#endif
-{
- sys_thread_t *tid = sr_tid;
- sigset_t set;
- /* Save the current SP */
- tid->sp = &tid;
- sem_post(&sr_sem);
- sigfillset(&set);
- sigdelset(&set,(sr_sigresu));
- /* block until we receive resume signal. */
- sigsuspend(&set);
-}
-
-static void
-#ifdef SA_SIGINFO
-resu_handler(int sig, siginfo_t* info, void* arg)
-#else
-resu_handler(int sig)
-#endif
-{
- return;
-}
-
-/*
- * Initialize signal handlers for suspend and resume}.
- */
-int
-np_initialize()
-{
- struct sigaction act;
- char *s;
- int err;
-
- /* Signal numbers used to suspend and resume */
-#if __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
-#ifdef SIGUNUSED
- sr_sigsusp = SIGUNUSED;
-#else
- sr_sigsusp = SIGLOST;
-#endif
-#ifdef SIGPWR
- sr_sigresu = SIGPWR;
-#else
- sr_sigresu = SIGXFSZ;
-#endif
-#else
- /* use real time signals */
- /* currently __SIGRTMIN, +1, +2 are all used by LinuxThreads */
- sr_sigsusp = SIGRTMIN + 3;
- sr_sigresu = SIGRTMIN + 4;
-#endif
-
- /* Set up signal handler for suspend and resume */
-#if defined(SA_SIGINFO) && !defined(__sparc__)
- act.sa_handler = 0;
- act.sa_sigaction = susp_handler;
-#else
- act.sa_handler = (__sighandler_t) susp_handler;
-#endif
-#ifdef SA_SIGINFO
- act.sa_flags = SA_RESTART | SA_SIGINFO;
-#else
- act.sa_flags = SA_RESTART;
-#endif
- sigfillset(&act.sa_mask);
- if (sigaction(sr_sigsusp, &act, 0) == -1) {
- return -1;
- }
-#if defined(SA_SIGINFO) && !defined(__sparc__)
- act.sa_handler = 0;
- act.sa_sigaction = resu_handler;
-#else
- act.sa_handler = (__sighandler_t) resu_handler;
-#endif
-#ifdef SA_SIGINFO
- act.sa_flags = SA_SIGINFO;
-#else
- act.sa_flags = 0;
-#endif
- sigfillset(&act.sa_mask);
- if (sigaction(sr_sigresu, &act, 0) == -1) {
- return -1;
- }
-
- /* Initialize semaphore used by np_{suspend/resume} */
- if (sem_init(&sr_sem, 0, 0) == -1) {
- return SYS_ERR;
- }
-
- /* Initialize mutex used by np_{suspend/resume} */
- err = mutexInit(&sr_lock);
- sysAssert(err == 0);
-
- return SYS_OK;
-}
-
-int
-np_initial_suspend(sys_thread_t* tid)
-{
- int count;
-
- tid->selfsuspended = (tid == sysThreadSelf());
- sysAssert(tid->selfsuspended);
-
- count = tid->suspend_count++;
- sysAssert(count == 0);
-
-#ifdef LOG_THREADS
- dprintf(2,
- "[Initial self-suspend [tid = %ld, sys_thread = %ld]\n",
- pthread_self(), tid->sys_thread);
-#endif
-
- /* Order should not matter but doing the post first should be faster */
- sem_post(&tid->sem_suspended);
- do {
- sem_wait(&tid->sem_selfsuspend);
- } while (tid->selfsuspended); /* paranoid */
- return 0;
-}
-
-
-int
-np_suspend(sys_thread_t *tid)
-{
- int count, ret = 0;
-
- int err = mutexLock(&sr_lock);
- sysAssert(err == 0);
-
- tid->selfsuspended = (tid == sysThreadSelf());
-
- count = tid->suspend_count++;
-#ifdef LOG_THREADS
- dprintf(2, "[Suspending fromtid = %ld, tid = %ld, pid = %d, count = %d]\n",
- pthread_self(), tid->sys_thread, tid->lwp_id, count);
-#endif
- if (count == 0) {
- if (tid->selfsuspended) {
-#ifdef LOG_THREADS
- dprintf(2,
- "[Self-suspending [tid = %ld, sys_thread = %ld]\n",
- pthread_self(), tid->sys_thread);
-#endif
- mutexUnlock(&sr_lock);
- do {
- sem_wait(&tid->sem_selfsuspend);
- } while (tid->selfsuspended);
- /* [jk] What is the correct return value here?
- There was no error, but when we return the thread
- has already been resumed. */
- return SYS_OK;
-
- } else {
- sr_tid = tid;
- ret = pthread_kill(tid->sys_thread, sr_sigsusp);
- if (ret == 0) {
- sem_wait(&sr_sem);
- }
-#ifdef LOG_THREADS
- dprintf(2,
- "[Suspended fromtid = %ld, pthread_kill(%ld, %d) = %d]\n",
- pthread_self(), tid->sys_thread, sr_sigsusp, ret);
-#endif
- }
- }
-
- err = mutexUnlock(&sr_lock);
- sysAssert(err == 0);
-
- return ret == 0 ? SYS_OK : SYS_ERR;
-}
-
-int
-np_continue(sys_thread_t *tid)
-{
- int count, ret = 0;
-
- int err = mutexLock(&sr_lock);
- sysAssert(err == 0);
-
- count = --tid->suspend_count;
-#ifdef LOG_THREADS
- dprintf(2, "[Resuming fromtid = %ld, tid = %ld, pid = %d, count = %d]\n",
- pthread_self(), tid->sys_thread, tid->lwp_id, count);
-#endif
- if (count == 0) {
- if (tid->selfsuspended) {
- tid->selfsuspended = 0;
- sem_post(&tid->sem_selfsuspend);
- } else {
- sr_tid = tid;
- ret = pthread_kill(tid->sys_thread, sr_sigresu);
- }
-#ifdef LOG_THREADS
- dprintf(2, "[Resumed fromtid = %ld, pthread_kill(%ld, %d) = %d]\n",
- pthread_self(), tid->sys_thread, sr_sigresu, ret);
-#endif
- } else if (count < 0) {
- /* Ignore attempts to resume a thread that has not been suspended */
- tid->suspend_count = 0;
- }
-
- err = mutexUnlock(&sr_lock);
- sysAssert(err == 0);
-
- return ret == 0 ? SYS_OK : SYS_ERR;
-}
-
-/*
- * Get the stack base and size.
- */
-int
-np_stackinfo(void **addr, long *size)
-{
- /* For now assume stack is 2 meg, from internals.h. */
-#define STACK_SIZE (2 * 1024 * 1024)
- void *p;
- char *sp = (char *)&p; /* rougly %esp */
-
- *addr = (void *)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1;
- *size = STACK_SIZE;
-
- return SYS_OK;
-}
-
-typedef unsigned long ulong_t;
-#define VALID_SP(sp, bottom, top) \
- (((ulong_t)(sp)) < ((ulong_t)(bottom)) && ((ulong_t)(sp)) > ((ulong_t)(top)))
-
-/*
- * Go into single threaded mode for GC.
- */
-int
-np_single()
-{
- sys_thread_t *tid;
- pthread_t me = pthread_self();
- int i;
-
-#ifdef LOG_THREADS
- dprintf(2, "[Entering np_single: thread count = %d]\n", ActiveThreadCount);
-#endif
- /* Stop all other threads. */
- tid = ThreadQueue;
- for (i = 0; i < ActiveThreadCount && tid != 0; i++) {
- if ((tid->sys_thread != me) && (tid->state != SUSPENDED)) {
- np_suspend(tid);
- sysAssert(VALID_SP(tid->sp, tid->stack_bottom, tid->stack_top));
- tid->onproc = FALSE; /* REMIND: Might not need this */
- }
- tid = tid->next;
- }
-#ifdef LOG_THREADS
- dprintf(2, "[Leaving np_single]\n");
-#endif
- return SYS_OK;
-}
-
-/*
- * Per thread initialization.
- */
-void
-np_initialize_thread(sys_thread_t *tid)
-{
- sigset_t set;
-
- /* Block SIGQUIT so that it can be handled by the SIGQUIT handler thread */
- sigemptyset(&set);
- sigaddset(&set, SIGQUIT);
- pthread_sigmask(SIG_BLOCK, &set, 0);
- /* Set process id */
- tid->lwp_id = getpid();
- tid->suspend_count = 0;
-
- /* Semaphore used for self-suspension */
- sem_init(&tid->sem_selfsuspend, 0, 0);
- tid->selfsuspended = 0;
-
-#ifdef LOG_THREADS
- dprintf(2, "[Init thread, tid = %ld, pid = %d, base = %p, size = %lu]\n",
- pthread_self(), tid->lwp_id, tid->stack_bottom, tid->stack_size);
-#endif
-}
-
-void
-np_free_thread(sys_thread_t *tid)
-{
- sem_destroy(&tid->sem_selfsuspend);
-}
-
-/*
- * Recover from single threaded mode after GC.
- */
-void
-np_multi()
-{
- int i;
- sys_thread_t *tid;
- pthread_t me = pthread_self();
-
- tid = ThreadQueue;
- for (i = 0; i < ActiveThreadCount && tid != 0; i++) {
- if ((tid->sys_thread != me) && (tid->state != SUSPENDED)) {
- np_continue(tid);
- }
- tid = tid->next;
- }
-}
-
-void
-np_profiler_init(sys_thread_t *tid)
-{
-}
-
-int
-np_profiler_suspend(sys_thread_t *tid)
-{
- return np_suspend(tid);
-}
-
-int
-np_profiler_continue(sys_thread_t *tid)
-{
- return np_continue(tid);
-}
-
-bool_t
-np_profiler_thread_is_running(sys_thread_t *tid)
-{
- return TRUE;
-}
--- a/jdk/src/solaris/hpi/native_threads/src/threads_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1133 +0,0 @@
-/*
- * Copyright (c) 1994, 2002, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of Java threads HPI on top of native Solaris threads
- *
- * [Sheng 1/18/97] Do not include any JVM-specific header file (such
- * as interpreter.h) here! This file implements the thread-related
- * APIs sys_api.h.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/signal.h>
-#include <sys/resource.h>
-
-#include "hpi_impl.h"
-
-#include "threads_md.h"
-#include "monitor_md.h"
-
-#include "np.h"
-
-extern int InitializeIO(rlim_t limit);
-
-#if defined(__solaris__) && !defined(SA_SIGINFO)
-#error That can NOT possibly be right.
-#endif
-
-#ifdef SA_SIGINFO
-static void sigusr1Handler(int sig, siginfo_t *info, void *uc);
-#else
-static void sigusr1Handler(int sig);
-#endif /* SA_SIGINFO */
-
-static void removeFromActiveQ(sys_thread_t *p);
-static void clear_onproc_flags(void);
-
-sys_thread_t *ThreadQueue;
-int ActiveThreadCount = 0; /* All threads */
-sys_mon_t *_sys_queue_lock;
-
-/* This is explained in linker_md.c. */
-#ifdef __GLIBC__
-#define NEED_DL_LOCK
-#endif /* __GLIBC__ */
-
-#ifdef NEED_DL_LOCK
-extern sys_mon_t _dl_lock;
-#endif /* NEED_DL_LOCK */
-
-/*
- * threads_initialized simplifies the check that has to be done in
- * sysThreadCheckStack(). Otherwise, before sysThreadInit() is called
- * on the primordial thread, we need to handle there being no current
- * thread at all, and there being one with a 0 stack_base.
- */
-static int threads_initialized = 0;
-
-/* The tid_key is a global key to *native* thread-specific data. That is,
- * each native thread has a back pointer to the Java TID associated with it.
- */
-static thread_key_t tid_key = (thread_key_t) -1;
-
-/*
- * The sigusr1Jmpbufkey is used to get at the jmp buffer to longjmp to in a
- * SIGUSR1 handler - used to implement stop(). The jmp buffer
- * should have been allocated off the thread's stack.
- */
-#ifdef __linux__
-thread_key_t intrJmpbufkey;
-static sigset_t squm = {{sigmask(SIGUSR1), 0, 0, 0}};
-#else
-thread_key_t sigusr1Jmpbufkey;
-sigset_t sigusr1Mask = {{sigmask(SIGUSR1), 0, 0, 0}};
-#endif
-
-/*
- * Thread C stack overflow check
- *
- * sysThreadCheckStack() being a function call is unfortunate, as it
- * takes stack space to do, but that is weakly accounted for by the
- * previous stack redzone. In general, where we can't predict stack
- * use by C, thread stack overflow checking doesn't really work.
- */
-
-#define STACK_REDZONE 4096
-
-#ifdef __linux__
-int jdk_waitpid(pid_t pid, int* status, int options);
-int fork1(void);
-int jdk_sem_init(sem_t*, int, unsigned int);
-int jdk_sem_post(sem_t*);
-int jdk_sem_wait(sem_t*);
-int jdk_pthread_sigmask(int, const sigset_t*, sigset_t*);
-pid_t waitpid(pid_t, int*, int);
-
-int jdk_waitpid(pid_t pid, int* status, int options) {
- return waitpid(pid, status, options);
-}
-
-int fork1() {
- return fork();
-}
-
-int
-jdk_sem_init(sem_t *sem, int pshared, unsigned int value) {
- return sem_init(sem, pshared, value);
-}
-
-int
-jdk_sem_post(sem_t *sem) {
- return sem_post(sem);
-}
-
-int
-jdk_sem_wait(sem_t *sem) {
- return sem_wait(sem);
-}
-
-int
-jdk_pthread_sigmask(int how , const sigset_t* newmask, sigset_t* oldmask) {
- return pthread_sigmask(how , newmask, oldmask);
-}
-
-#endif
-
-/* REMIND: port _CurrentThread changes to make process
- of getting the tid more efficient */
-
-int
-sysThreadCheckStack()
-{
- sys_thread_t *tid = sysThreadSelf();
-
- /* Stacks grow toward lower addresses on Solaris... */
- if (!threads_initialized ||
- (char *)(tid)->stack_bottom - (char *)&(tid) + STACK_REDZONE <
- tid->stack_size) {
- return 1;
- } else {
- return 0;
- }
-}
-
-#ifndef __linux__
-static sigset_t squm = {{sigmask(SIGUSR1), 0, 0, 0}};
-#endif
-
-
-/*
- * Allocate and initialize the sys_thread_t structure for an arbitary
- * native thread.
- */
-int
-sysThreadAlloc(sys_thread_t **tidP)
-{
- int err;
- sys_thread_t *tid = allocThreadBlock();
- if (tid == NULL) {
- return SYS_NOMEM;
- }
-#ifdef __linux__
- memset((char *)tid, 0, sizeof(sys_thread_t));
-#endif
-
- if (profiler_on) {
- np_profiler_init(tid);
- }
-
- if (np_stackinfo(&tid->stack_bottom, &tid->stack_size) == SYS_ERR) {
- return SYS_ERR;
- }
-#ifdef __linux__
- tid->stack_top = tid->stack_bottom - tid->stack_size;
-#else
- tid->stack_top = (void *)((char *)(tid->stack_bottom) - tid->stack_size);
-#endif
-
- tid->primordial_thread = 0;
-#ifdef __linux__
- tid->interrupted = tid->pending_interrupt = FALSE;
-#else
- tid->interrupted = FALSE;
-#endif
- tid->onproc = FALSE;
- tid->sys_thread = thr_self();
-#ifdef __linux__
- /*
- * Disable cancellation. The default cancel type is
- * PTHREAD_CANCEL_DEFERRED, so if we set the cancel state to
- * PTHREAD_CANCEL_ENABLE again, we'll get deferred cancellation.
- */
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
-#endif
- np_initialize_thread(tid);
-
- /*
- * For the Invocation API:
- * We update the thread-specific storage before locking the
- * queue because sysMonitorEnter will access sysThreadSelf.
- */
- err = thr_setspecific(tid_key, tid);
- /* sys_thread_t * back pointer from native */
-#ifdef __linux__
- thr_setspecific(intrJmpbufkey, NULL); /* paranoid */
-#endif
- assert (err == 0);
-
- if (threads_initialized)
- SYS_QUEUE_LOCK(sysThreadSelf());
- ActiveThreadCount++; /* Count the thread */
- tid->next = ThreadQueue; /* Chain all threads */
- ThreadQueue = tid;
- if (threads_initialized)
- SYS_QUEUE_UNLOCK(sysThreadSelf());
- else
- threads_initialized = TRUE;
-
- /*
- * Ensure that SIGUSR1 is masked for interruptable IO
- * Signal mask inheritance ensures all child threads are masked too.
- */
-#ifndef __linux__
- thr_sigsetmask(SIG_BLOCK, &squm, NULL);
-#endif
-
- setFPMode();
-
- *tidP = tid;
- return SYS_OK;
-}
-
-/*
- * threadBootstrapMD() bootstraps the UNIX process running from main()
- * into a first primordial thread. This thread is distinguishable because
- * it uniquely has the primordial_thread flag on in its private data.
- * However, so that we have to special-case it as little as possible, we
- * set it up to look as closely as possible to a thread that we created.
- * One difference is that its stack is *not* known to us.
- */
-int
-threadBootstrapMD(sys_thread_t **tidP, sys_mon_t **lockP, int nb)
-{
- /* We are running out of file descriptors in fonts. As a temporary
- * fix, bump up the number of open file descriptors to OPEN_MAX.
- */
- struct rlimit nbr_files;
-
- getrlimit(RLIMIT_NOFILE, &nbr_files);
- nbr_files.rlim_cur = nbr_files.rlim_max;
- setrlimit(RLIMIT_NOFILE, &nbr_files);
-
- /*
- * Use the above setting for initialize (closable) IO package.
- */
- if (InitializeIO(nbr_files.rlim_cur) != SYS_OK) {
- return SYS_ERR;
- }
-
- /* Create a thread-private key for a pointer back to the sys_thread_t *.
- * Note that we don't need to worry about the destructor, as that's taken
- * care of elsewhere.
- */
- thr_keycreate(&tid_key, NULL);
-
-#ifdef __linux__
- thr_keycreate(&intrJmpbufkey, NULL);
-#else
- thr_keycreate(&sigusr1Jmpbufkey, NULL);
-#endif
-
-#ifndef NO_INTERRUPTIBLE_IO
- {
- /* initialize SIGUSR1 handler for interruptable IO */
- struct sigaction sigAct;
-
-#ifdef SA_SIGINFO
- sigAct.sa_handler = NULL;
- sigAct.sa_sigaction = sigusr1Handler;
-#else
- sigAct.sa_handler = sigusr1Handler;
-#endif /* SA_SIGINFO */
- memset((char *)&(sigAct.sa_mask), 0, sizeof (sigset_t));
- /* we do not want the restart flag for SIGUSR1 */
- sigAct.sa_flags = 0;
- sigaction(SIGUSR1, &sigAct, (struct sigaction *)0);
- }
-#endif /* NO_INTERRUPTIBLE_IO */
-
- nReservedBytes = (nb + 7) & (~7);
- if (sysThreadAlloc(tidP) < 0) {
- return SYS_NOMEM;
- }
-
- /* profiler_on may have not been setup yet. */
- np_profiler_init(*tidP);
-
-#ifdef NEED_DL_LOCK
- VM_CALL(monitorRegister)(&_dl_lock, "Dynamic loading lock");
-#endif /* NEED_DL_LOCK */
-
- /* Initialize the queue lock monitor */
- _sys_queue_lock = (sys_mon_t *)sysMalloc(sysMonitorSizeof());
- if (_sys_queue_lock == NULL) {
- return SYS_ERR;
- }
- VM_CALL(monitorRegister)(_sys_queue_lock, "Thread queue lock");
- *lockP = _sys_queue_lock;
-
- (*tidP)->primordial_thread = 1;
-
- if (np_initialize() == SYS_ERR) {
- return SYS_ERR;
- }
-
- return SYS_OK;
-}
-
-/*
- * Access to the thread stack pointer of an arbitrary thread (for GC).
- * This information should be legitimately available in Solaris 2.5.
- */
-void *
-sysThreadStackPointer(sys_thread_t * tid)
-{
- char *thread_info;
-
- if (tid == sysThreadSelf()) {
- /*
- * doing this assigment gets around a warning about returning
- * the address of a local variable
- */
- void *aStackAddress = &thread_info;
- return aStackAddress;
- } else {
- return (void *) tid->sp;
- }
-}
-
-/*
- * Get the end of stack (if you step beyond (above or below depending
- * on your architecture) you can die. We refer to the logical top of
- * stack.
- *
- * NOTE! There are restrictions about when you can call this method. If
- * you did a sysThreadAlloc, then you can call this method as soon as
- * sysThreadAlloc returns. If you called sysThreadCreate(start_function),
- * then you must call sysThreadStackTop only inside start_function and not
- * as soon as sysThreadCreate returns.
- */
-void *
-sysThreadStackTop(sys_thread_t *tid)
-{
- return tid->stack_top;
-}
-
-long *
-sysThreadRegs(sys_thread_t * tid, int *nregs)
-{
- *nregs = N_TRACED_REGS;
- return tid->regs;
-}
-
-static void *
-_start(void *tid_)
-{
- sys_thread_t *tid = (sys_thread_t *)tid_;
-
- np_initialize_thread(tid);
-
-#ifdef __linux__
- /*
- * Disable cancellation. The default cancel type is
- * PTHREAD_CANCEL_DEFERRED, so if we set the cancel state to
- * PTHREAD_CANCEL_ENABLE again, we'll get deferred cancellation.
- */
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
-
- tid->sp = 0;
- thr_setspecific(tid_key, tid);
- thr_setspecific(intrJmpbufkey, NULL); /* paranoid */
- np_stackinfo(&tid->stack_bottom, &tid->stack_size);
- tid->stack_top = (void *)((char *)(tid->stack_bottom) - tid->stack_size);
-
- /* Wait for resume signal */
- np_initial_suspend(tid);
-#else
-#ifdef USE_PTHREADS
-#ifndef USE_MUTEX_HANDSHAKE
- /* Wait for semaphore to be posted once thread has been suspended */
- sem_wait(&tid->sem);
- sem_destroy(&tid->sem);
-#else
- /* I'm a new thread, and I must co-operate so I can be suspended. */
- pthread_mutex_lock(&tid->ntcond.m);
- tid->ntcond.state = NEW_THREAD_REQUESTED_SUSPEND;
- pthread_cond_signal(&tid->ntcond.c);
- while (tid->ntcond.state != NEW_THREAD_SUSPENDED)
- pthread_cond_wait(&tid->ntcond.c, &tid->ntcond.m);
- pthread_mutex_unlock(&tid->ntcond.m);
-#endif /* USE_MUTEX_HANDSHAKE */
-#endif /* USE_PTHREADS */
-#endif /* !linux */
- if (profiler_on) {
- np_profiler_init(tid);
- }
-
-#ifndef __linux__
- tid->sp = 0;
- thr_setspecific(tid_key, tid);
-#endif
-
- tid->state = RUNNABLE;
-
-#ifndef __linux__
- np_stackinfo(&tid->stack_bottom, &tid->stack_size);
- tid->stack_top = (void *)((char *)(tid->stack_bottom) - tid->stack_size);
-#endif
-
- setFPMode();
- tid->start_proc(tid->start_parm);
-#ifdef __linux__
- /* Paranoid: We don't want to be canceled now, it would have
- unpredictable consequences */
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
-#endif
-
- sysThreadFree();
- thr_exit(0);
- /* NOT REACHED */
- return 0;
-}
-
-int
-sysThreadCreate(sys_thread_t **tidP, long ss, void (*start)(void *), void *arg)
-{
- size_t stack_size = ss;
- int err;
- sys_thread_t *tid = allocThreadBlock();
-#ifdef USE_PTHREADS
- pthread_attr_t attr;
-#endif
-
- if (tid == NULL) {
- return SYS_NOMEM;
- }
- *tidP = tid;
-
-#ifdef __linux__
- memset((char *)tid, 0, sizeof(sys_thread_t));
-#endif
- /* Install the backpointer to the Thread object */
-
-#ifdef __linux__
- tid->interrupted = tid->pending_interrupt = FALSE;
-#else
- tid->interrupted = FALSE;
-#endif
- tid->onproc = FALSE;
-
-#ifndef __linux__
- SYS_QUEUE_LOCK(sysThreadSelf());
- ActiveThreadCount++; /* Global thread count */
- tid->next = ThreadQueue; /* Chain all threads */
- ThreadQueue = tid;
- SYS_QUEUE_UNLOCK(sysThreadSelf());
-#endif
-
- tid->start_proc = start;
- tid->start_parm = arg;
-#ifdef __linux__
- tid->state = SUSPENDED;
-#endif
-
-#ifdef __linux__
- tid->primordial_thread = 0;
-
- /* Semaphore used to block thread until np_suspend() is called */
- err = sem_init(&tid->sem_suspended, 0, 0);
- sysAssert(err == 0);
- /* Thread attributes */
- pthread_attr_init(&attr);
-#ifdef _POSIX_THREAD_ATTR_STACKSIZE
- pthread_attr_setstacksize(&attr, stack_size);
-#endif
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (profiler_on) {
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
- }
- /* Create the thread. The thread will block waiting to be suspended */
- err = pthread_create(&tid->sys_thread, &attr, _start, (void *)tid);
- sysAssert(err == 0);
- if (err == 0) {
- err = sem_wait(&tid->sem_suspended);
- if (err == 0) {
- sem_destroy(&tid->sem_suspended);
- }
- }
- sysAssert(err == 0);
-
- SYS_QUEUE_LOCK(sysThreadSelf());
- ActiveThreadCount++; /* Global thread count */
- tid->next = ThreadQueue; /* Chain all threads */
- ThreadQueue = tid;
- SYS_QUEUE_UNLOCK(sysThreadSelf());
-#else
-#ifdef USE_PTHREADS
-
-#ifndef USE_MUTEX_HANDSHAKE
- /* Semaphore used to block thread until np_suspend() is called */
- err = sem_init(&tid->sem, 0, 0);
- sysAssert(err == 0);
- /* Thread attributes */
-#else
- /* Setup condition required to suspend the newly created thread. */
- pthread_mutex_init(&tid->ntcond.m, NULL);
- pthread_cond_init(&tid->ntcond.c, NULL);
- tid->ntcond.state = NEW_THREAD_MUST_REQUEST_SUSPEND;
- pthread_mutex_lock(&tid->ntcond.m);
-#endif /* USE_MUTEX_HANDSHAKE */
-
- /* Create the new thread. */
- pthread_attr_init(&attr);
-#ifdef _POSIX_THREAD_ATTR_STACKSIZE
- pthread_attr_setstacksize(&attr, stack_size);
-#endif
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (profiler_on)
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
- err = pthread_create(&tid->sys_thread, &attr, _start, (void *)tid);
-
-#ifndef USE_MUTEX_HANDSHAKE
- if (err == 0) {
- /* Suspend the thread */
- err = np_suspend(tid);
- if (err == SYS_OK) {
- /* Unblock the thread now that it has been suspended */
- err = sem_post(&tid->sem);
- sysAssert(err == 0);
- }
- }
-#else
- /* Wait for the newly created thread to block. */
- while (tid->ntcond.state != NEW_THREAD_REQUESTED_SUSPEND)
- pthread_cond_wait(&tid->ntcond.c, &tid->ntcond.m);
-
- /* So it blocked. Now suspend it and _then_ get it out of the block. */
- np_suspend(tid->sys_thread);
- tid->ntcond.state = NEW_THREAD_SUSPENDED;
- pthread_cond_signal(&tid->ntcond.c);
- pthread_mutex_unlock(&tid->ntcond.m);
-#endif /* USE_MUTEX_HANDSHAKE */
-
-#else
- /* Create the thread */
- err = thr_create(NULL, stack_size, _start, (void *)tid,
- THR_SUSPENDED|THR_DETACHED|
- (profiler_on ? THR_BOUND : 0),
- &tid->sys_thread);
-#endif /* USE_PTHREADS */
-#endif /* !linux */
-
- tid->state = SUSPENDED;
- sysAssert(err != EINVAL); /* Invalid argument: shouldn't happen */
- if (err == EAGAIN) {
- err = SYS_NORESOURCE; /* Will be treated as though SYS_NOMEM */
- } else if (err == ENOMEM) {
- err = SYS_NOMEM;
- } else {
- err = SYS_OK;
- }
-
- return err;
-}
-
-/*
- * Free a system thread block.
- * Remove from the thread queue.
- */
-int
-sysThreadFree()
-{
- sys_thread_t *tid = sysThreadSelf();
- /*
- * remove ourselves from the thread queue. This must be done after
- * the notify above since monitor operations aren't really safe if
- * your thread isn't on the thread queue. (This isn't true of
- * the sysMonitor* functions, only monitor*)
- */
- SYS_QUEUE_LOCK(tid);
- removeFromActiveQ(tid);
- SYS_QUEUE_UNLOCK(tid);
-
- /* For invocation API: later sysThreadSelf() calls will return 0 */
- thr_setspecific(tid_key, 0);
-
-#ifdef __linux__
- np_free_thread(tid);
-#endif
-
- freeThreadBlock(tid);
- return SYS_OK;
-}
-
-/*
- * Current thread yield control
- *
- * Green threads originally supported forcing another thread to yield...
- */
-void
-sysThreadYield()
-{
-#ifndef __linux__
- thr_yield();
-#endif
-}
-
-#ifdef USE_PTHREADS
-/*
- * For POSIX threads, we don't want to use real-time policies SCHED_FIFO or
- * SCHED_RR. That leaves SCHED_OTHER which is implementation defined. We
- * assume Solaris-pthreads like behavior for SCHED_OTHER, and if it doesn't
- * work on your platform, then maybe you want to do turn off thread
- * priorities by setting -DMOOT_PRIORITIES.
- */
-#ifndef MOOT_PRIORITIES
-#define USE_SCHED_OTHER
-#endif /* MOOT_PRIORITIES */
-#endif /* USE_PTHREADS */
-
-/*
- * Get the scheduling priority of a specified thread
- */
-int
-sysThreadGetPriority(sys_thread_t * tid, int *pri)
-{
-#ifdef USE_PTHREADS
-#ifdef USE_SCHED_OTHER
- struct sched_param param;
- int policy = SCHED_OTHER;
- param.sched_priority = *pri;
- return pthread_getschedparam(tid->sys_thread, &policy, ¶m);
-#else
- return 0;
-#endif /* USE_SCHED_OTHER */
-#else
- return thr_getprio(tid->sys_thread, pri);
-#endif /* USE_PTHREADS */
-}
-
-
-/*
- * Set the scheduling priority of a specified thread
- */
-int
-sysThreadSetPriority(sys_thread_t * tid, int pri)
-{
- int err;
-#ifdef USE_PTHREADS
-#ifdef USE_SCHED_OTHER
- struct sched_param param;
- param.sched_priority = pri;
- err = pthread_setschedparam(tid->sys_thread, SCHED_OTHER, ¶m);
-#else
- err = 0;
-#endif /* USE_SCHED_OTHER */
-#else
- err = thr_setprio(tid->sys_thread, pri);
-#endif /* USE_PTHREADS */
- sysAssert(err != ESRCH); /* No such thread: shouldn't happen */
- sysAssert(err != EINVAL); /* Invalid arguments: shouldn't happen */
- return SYS_OK;
-}
-
-/*
- * Suspend execution of the specified thread
- */
-int
-sysThreadSuspend(sys_thread_t * tid)
-{
- int err1 = 0;
- int err2 = 0;
- sys_thread_t *self = sysThreadSelf();
-
- if (tid == self) {
- self->state = SUSPENDED;
- } else {
-#ifndef __linux__
- mutexLock(&tid->mutex);
-#endif
- switch(tid->state) {
- case RUNNABLE:
- tid->state = SUSPENDED;
- break;
- case CONDVAR_WAIT:
- tid->state = SUSPENDED;
- tid->cpending_suspend = 1;
- break;
- case SUSPENDED:
- default:
- err1 = -1; /* Thread in inconsistent state */
- break;
- }
-#ifndef __linux__
- mutexUnlock(&tid->mutex);
-#endif
- }
- if (err1 == 0) {
- err2 = np_suspend(tid);
- }
-
- return ((err1 == 0 && err2 == 0) ? SYS_OK : SYS_ERR);
-}
-
-/*
- * Resume execution of the specified thread
- */
-int
-sysThreadResume(sys_thread_t * tid)
-{
- int err1 = 0;
- int err2 = 0;
-
-#ifndef __linux__
- mutexLock(&tid->mutex);
-#endif
- if (tid->cpending_suspend) {
- tid->cpending_suspend = 0;
- tid->state = CONDVAR_WAIT;
- } else {
- switch(tid->state) {
- case SUSPENDED:
- tid->state = RUNNABLE;
- break;
- case RUNNABLE:
- case CONDVAR_WAIT:
- default:
- err1 = -1; /* Thread in inconsistent state */
- break;
- }
- }
-#ifndef __linux__
- mutexUnlock(&tid->mutex);
-#endif
- if (err1 == 0) {
- err2 = np_continue(tid);
- }
-
- return ((err1 == 0 && err2 == 0) ? SYS_OK : SYS_ERR);
-}
-
-/*
- * Return the sys_thread_t * of the calling thread
- */
-sys_thread_t *
-sysThreadSelf()
-{
-#ifdef USE_PTHREADS
- return pthread_getspecific(tid_key);
-#else
- sys_thread_t * tid=NULL;
- int err = thr_getspecific(tid_key, (void *) &tid);
-
- if (err == 0) {
- return tid;
- }
-
- sysAssert(tid_key == -1 || err != 0);
-
- return NULL;
-#endif
-}
-
-/*
- * Enumerate over all threads, calling a function for each one. A
- * paranoid helper function would be prepared to deal with threads
- * that have not been created by Java.
- */
-
-int
-sysThreadEnumerateOver(int (*func)(sys_thread_t *, void *), void *arg)
-{
- sys_thread_t *tid;
- int err = SYS_OK;
- int i;
-
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
-
- tid = ThreadQueue;
- for (i = 0; i < ActiveThreadCount && tid != 0; i++) {
- if ((err = (*func)(tid, arg)) != SYS_OK) {
- break;
- }
- tid = tid->next;
- }
-
- return err;
-}
-
-void *
-sysThreadNativeID(sys_thread_t *tid)
-{
- return (void *) tid->sys_thread;
-}
-
-/*
- * Remove this thread from the list of Active threads.
- */
-static void
-removeFromActiveQ(sys_thread_t * t)
-{
- sys_thread_t *prev;
- sys_thread_t *tid;
-
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
-
- ActiveThreadCount--;
-
- prev = 0;
- tid = ThreadQueue;
- while (tid) {
- if (tid == t) {
- if (prev) {
- prev->next = tid->next;
- } else {
- ThreadQueue = tid->next;
- }
- tid->next = 0;
- break;
- }
- prev = tid;
- tid = tid->next;
- }
-}
-
-/*
- * The mechanics of actually signalling an exception (in the future,
- * and Alarm or Interrupt) depend upon what thread implementation you
- * are using.
- */
-void
-sysThreadPostException(sys_thread_t *tid, void *exc)
-{
- /* Thread.stop is deprecated */
- /* No longer wake up the thread if it is sleeping */
- /* thr_kill(tid->sys_thread, SIGUSR1); */
-}
-
-/*
- * Support for (Java-level) interrupts.
- */
-void
-sysThreadInterrupt(sys_thread_t *tid)
-{
-#ifdef __linux__
- tid->pending_interrupt = TRUE;
- pthread_cancel(tid->sys_thread);
-#else
- mutexLock(&tid->mutex);
- tid->interrupted = TRUE;
- mutexUnlock(&tid->mutex);
- thr_kill(tid->sys_thread, SIGUSR1);
-#endif
-}
-
-/* This doesn't need to aquire any locks */
-int
-sysThreadIsInterrupted(sys_thread_t *tid, int ClearInterrupted)
-{
- bool_t interrupted;
-
-#ifndef __linux__
- mutexLock(&tid->mutex);
-#endif
-#ifdef __linux__
- interrupted = tid->pending_interrupt || tid->interrupted;
-
- if (ClearInterrupted == 1 && tid->pending_interrupt) {
- sys_thread_t* self = sysThreadSelf();
-
- if (self == tid && pthread_getspecific(intrJmpbufkey) == NULL) {
- jmp_buf jmpbuf;
-
- /*
- * Register our intrHandler as a cleanup handler. If we get
- * interrupted (i.e. canceled), we longjmp out of this handler.
- */
- pthread_cleanup_push(intrHandler, NULL);
- if (setjmp(jmpbuf) == 0) {
- thr_setspecific(intrJmpbufkey, &jmpbuf);
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- while (1) { pthread_testcancel(); }
- }
- /* Remove intrHandler without calling it. */
- pthread_cleanup_pop(0);
- }
- }
-
- if (ClearInterrupted == 1 && interrupted) {
- /* we have do to this last, otherwise we really would cancel the
- thread */
- tid->interrupted = FALSE;
- }
-#else
- interrupted = tid->interrupted;
- if (ClearInterrupted == 1) {
- tid->interrupted = FALSE;
- mutexUnlock(&tid->mutex);
- if (interrupted) {
- sigset_t osigset;
- /*
- * we were interrupted so we may have a signal pending that
- * we need to clear. We can just temporarily unmask SIGUSR1
- * and the sigusr1Handler to catch and notice that the
- * interrupted flag is not set.
- */
-
- thr_setspecific(sigusr1Jmpbufkey, NULL); /* paranoid */
- thr_sigsetmask(SIG_UNBLOCK, &sigusr1Mask, &osigset);
- thr_sigsetmask(SIG_SETMASK, &osigset, NULL);
- }
- } else { /* Otherwise leave it alone */
- mutexUnlock(&tid->mutex);
- }
-#endif
- return interrupted;
-}
-
-
-
-/*
- * Stop all threads other than the current one. The stopped threads
- * may be restarted with sysThreadMulti(); the operation of this
- * routine is atomic; it either stops all java threads or it stops
- * none of them. Upon success (all threads stopped) this routine
- * returns SYS_OK, otherwise SYS_ERR.
- *
- * In general, sysThreadSingle() should take care of anything below
- * the HPI that needs to be done to safely run single-threaded.
- */
-int
-sysThreadSingle()
-{
- return np_single();
-}
-
-/*
- * Allow multi threaded execution to resume after a
- * sysThreadSingle() call.
- *
- * Note: When this routine is called the scheduler should already
- * have been locked by sysThreadSingle().
- */
-void
-sysThreadMulti()
-{
- np_multi();
-}
-
-#ifdef __linux__
-/*
- * We abuse thread cancellation to interrupt the threads, i.e when an
- * exception is posted against the thread, pthread_cancel(3) is sent to the
- * thread and the canceled thread executes the following cleanup handler
- */
-void
-intrHandler(void* arg)
-{
- jmp_buf* jmpbufp = pthread_getspecific(intrJmpbufkey);
- if (jmpbufp != NULL) {
- volatile sys_thread_t* self = sysThreadSelf();
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
- self->interrupted = TRUE;
- self->pending_interrupt = FALSE;
- thr_setspecific(intrJmpbufkey, NULL);
- longjmp(*jmpbufp, 1);
- } else {
-#ifdef PARANOID_DEBUG
- sysAssert(0);
-#endif
- }
-}
-
-#else
-/*
- * SIGUSR1 is used to interrupt the threads, i.e when an exception
- * is posted against the thread, SIGUSR1 is sent to the thread and the
- * thread gets the signal, executes the following handler
- */
-
-static void
-#ifdef SA_SIGINFO
-sigusr1Handler(int sig, siginfo_t *info, void *uc)
-#else
-sigusr1Handler(int sig)
-#endif
-{
- sys_thread_t *tid = sysThreadSelf();
-
- if (tid->interrupted) {
- sigjmp_buf *jmpbufp;
-#ifdef USE_PTHREADS
- jmpbufp = pthread_getspecific(sigusr1Jmpbufkey);
-#else
- thr_getspecific(sigusr1Jmpbufkey, (void **)&jmpbufp);
-#endif
- if (jmpbufp != NULL)
- siglongjmp(*jmpbufp, 1);
- }
-}
-#endif
-
-HPI_SysInfo *
-sysGetSysInfo()
-{
- static HPI_SysInfo info = {0, 0};
-
- if (info.name == NULL) {
- /*
- * we want the number of processors configured not the number online
- * since processors may be turned on and off dynamically.
- */
- int cpus = (int) sysconf(_SC_NPROCESSORS_CONF);
-
- info.isMP = (cpus < 0) ? 1 : (cpus > 1);
- info.name = "native threads";
- }
- return &info;
-}
-
-
-jlong
-sysThreadCPUTime()
-{
-#ifdef HAVE_GETHRVTIME
- return gethrvtime();
-#else
- return 0;
-#endif
-}
-
-int
-sysThreadGetStatus(sys_thread_t *tid, sys_mon_t **monitorPtr)
-{
- int status;
- switch (tid->state) {
- case RUNNABLE:
- if (tid->mon_enter) {
- status = SYS_THREAD_MONITOR_WAIT;
- } else {
- status = SYS_THREAD_RUNNABLE;
- }
- break;
- case SUSPENDED:
- if (tid->mon_enter)
- status = SYS_THREAD_SUSPENDED | SYS_THREAD_MONITOR_WAIT;
- else if (tid->cpending_suspend)
- status = SYS_THREAD_SUSPENDED | SYS_THREAD_CONDVAR_WAIT;
- else
- status = SYS_THREAD_SUSPENDED;
- break;
- case CONDVAR_WAIT:
- status = SYS_THREAD_CONDVAR_WAIT;
- break;
- default:
- return SYS_ERR;
- }
- if (monitorPtr) {
- if (status & SYS_THREAD_MONITOR_WAIT) {
- *monitorPtr = tid->mon_enter;
- } else if (status & SYS_THREAD_CONDVAR_WAIT) {
- *monitorPtr = tid->mon_wait;
- } else {
- *monitorPtr = NULL;
- }
- }
- return status;
-}
-
-int sysAdjustTimeSlice(int new)
-{
- return SYS_ERR;
-}
-
-void sysThreadProfSuspend(sys_thread_t *tid)
-{
- np_profiler_suspend(tid);
-}
-
-void sysThreadProfResume(sys_thread_t *tid)
-{
- np_profiler_continue(tid);
-}
-
-bool_t sysThreadIsRunning(sys_thread_t *tid)
-{
- return np_profiler_thread_is_running(tid);
-}
-
-void *
-sysThreadInterruptEvent()
-{
- return NULL;
-}
--- a/jdk/src/solaris/hpi/native_threads/src/threads_solaris.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,666 +0,0 @@
-/*
- * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of HPI that can not be expressed with POSIX threads.
- * Note that even if you are building with USE_PTHREADS, we have to
- * explicitly undef it here because pthread.h and thread.h can not be
- * included in the same file, and this file needs only thread.h.
- */
-#undef USE_PTHREADS
-
-#include "hpi_impl.h"
-#include "monitor_md.h"
-#include "threads_md.h"
-#include "np.h"
-
-#include <thread.h>
-#include <sys/lwp.h>
-#include <signal.h>
-#include <sys/signal.h>
-#include <sys/resource.h>
-#include <sys/procfs.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <sys/syscall.h>
-extern int syscall(int, ...);
-
-
-/*
- * Forward declarations.
- */
-static int procfd;
-static void stop_lwps();
-static void clear_onproc_flags();
-static void restart_lwps();
-static void MakeProcName(register char *procname, register pid_t pid);
-static void GC_msec_sleep(int n);
-
-
-/*
- * Make sure that we link against a verion of libthread that has at least
- * the bug fixes and the interface for getting the stack from threads that
- * aren't on LWPs. Otherwise we should exit with some informative message.
- */
-extern ulong_t __gettsp(thread_t);
-
-static const char * gettspMessage =
-"You must install a Solaris patch to run the native threads version of the\n"
-"Java runtime. The green threads version will work without this patch.\n"
-"Please check the native threads release notes for more information.\n"
-"\n"
-"If you are embedding the VM in a native application, please make sure that\n"
-"the native application is linked with libthread.so (-lthread).\n"
-"\n"
-"Exiting.\n";
-
-static void
-checkForCorrectLibthread()
-{
- if (&__gettsp == 0) {
- fprintf(stderr, gettspMessage);
- exit(1);
- }
-}
-#ifdef __GNUC__
-static void checkForCorrectLibthread() __attribute__((constructor));
-#else
-#pragma init(checkForCorrectLibthread)
-#endif
-
-#pragma weak __gettsp
-
-
-/*
- * Suspend said thread. Used to implement java.lang.Thread.suspend(),
- * which is deprecated.
- */
-int
-np_suspend(sys_thread_t *tid)
-{
- return thr_suspend(tid->sys_thread);
-}
-
-
-/*
- * Resume a suspended thread. Used to implement java.lang.Thread.resume(),
- * which is deprecated.
- */
-int
-np_continue(sys_thread_t *tid)
-{
- return thr_continue(tid->sys_thread);
-}
-
-/*
- * If there is any initialization is required by the non-POSIX parts.
- */
-void np_initialize_thread(sys_thread_t *tid)
-{
- return;
-}
-
-
-/*
- * Get the stack start address, and max stack size for the current thread.
- */
-int
-np_stackinfo(void **addr, long *size)
-{
- stack_t stkseg;
-
- if (thr_stksegment(&stkseg) == 0) {
- *addr = (void *)(stkseg.ss_sp);
- if (thr_main()) {
- struct rlimit r;
- getrlimit(RLIMIT_STACK, &r);
- *size = (long)r.rlim_cur;
- } else {
- *size = (long)(stkseg.ss_size);
- }
- return SYS_OK;
- } else {
- return SYS_ERR; /* thr_stksegment failed. */
- }
-}
-
-/*
- * On Solaris when doing CPU profiling, the threads are bound.
- */
-void
-np_profiler_init(sys_thread_t *tid)
-{
- tid->lwp_id = _lwp_self();
-}
-
-int
-np_profiler_suspend(sys_thread_t *tid)
-{
- return _lwp_suspend(tid->lwp_id);
-}
-
-int
-np_profiler_continue(sys_thread_t *tid)
-{
- return _lwp_continue(tid->lwp_id);
-}
-
-bool_t
-np_profiler_thread_is_running(sys_thread_t *tid)
-{
- unsigned long sum = 0;
- int i;
- prstatus_t lwpstatus;
- int lwpfd;
- int res;
-
- lwpfd = syscall(SYS_ioctl, procfd, PIOCOPENLWP, &(tid->lwp_id));
- sysAssert(lwpfd >= 0);
-
- retry:
- res = syscall(SYS_ioctl, lwpfd, PIOCSTATUS, &lwpstatus);
- sysAssert(res >= 0);
-
- if (!(lwpstatus.pr_flags & PR_STOPPED)) {
- GC_msec_sleep(1);
- goto retry;
- }
-
- close(lwpfd);
-
-#if defined(sparc)
- sum += lwpstatus.pr_reg[R_SP];
- sum += lwpstatus.pr_reg[R_PC];
-
- sum += lwpstatus.pr_reg[R_G1];
- sum += lwpstatus.pr_reg[R_G2];
- sum += lwpstatus.pr_reg[R_G3];
- sum += lwpstatus.pr_reg[R_G4];
-
- sum += lwpstatus.pr_reg[R_O0];
- sum += lwpstatus.pr_reg[R_O1];
- sum += lwpstatus.pr_reg[R_O2];
- sum += lwpstatus.pr_reg[R_O3];
- sum += lwpstatus.pr_reg[R_O4];
- sum += lwpstatus.pr_reg[R_O5];
-
- sum += lwpstatus.pr_reg[R_I0];
- sum += lwpstatus.pr_reg[R_I1];
- sum += lwpstatus.pr_reg[R_I2];
- sum += lwpstatus.pr_reg[R_I3];
- sum += lwpstatus.pr_reg[R_I4];
- sum += lwpstatus.pr_reg[R_I5];
- sum += lwpstatus.pr_reg[R_I6];
- sum += lwpstatus.pr_reg[R_I7];
-
- sum += lwpstatus.pr_reg[R_L0];
- sum += lwpstatus.pr_reg[R_L1];
- sum += lwpstatus.pr_reg[R_L2];
- sum += lwpstatus.pr_reg[R_L3];
- sum += lwpstatus.pr_reg[R_L4];
- sum += lwpstatus.pr_reg[R_L5];
- sum += lwpstatus.pr_reg[R_L6];
- sum += lwpstatus.pr_reg[R_L7];
-#elif defined(amd64)
- sum += lwpstatus.pr_reg[REG_RIP];
- sum += lwpstatus.pr_reg[REG_RSP];
-
- sum += lwpstatus.pr_reg[REG_RAX];
- sum += lwpstatus.pr_reg[REG_RCX];
- sum += lwpstatus.pr_reg[REG_RDX];
- sum += lwpstatus.pr_reg[REG_RBX];
- sum += lwpstatus.pr_reg[REG_RBP];
- sum += lwpstatus.pr_reg[REG_RSI];
- sum += lwpstatus.pr_reg[REG_RDI];
-
- sum += lwpstatus.pr_reg[REG_R8];
- sum += lwpstatus.pr_reg[REG_R9];
- sum += lwpstatus.pr_reg[REG_R10];
- sum += lwpstatus.pr_reg[REG_R11];
- sum += lwpstatus.pr_reg[REG_R12];
- sum += lwpstatus.pr_reg[REG_R13];
- sum += lwpstatus.pr_reg[REG_R14];
- sum += lwpstatus.pr_reg[REG_R15];
-#elif defined(i386)
- sum += lwpstatus.pr_reg[EIP];
- sum += lwpstatus.pr_reg[UESP];
-
- sum += lwpstatus.pr_reg[EAX];
- sum += lwpstatus.pr_reg[ECX];
- sum += lwpstatus.pr_reg[EDX];
- sum += lwpstatus.pr_reg[EBX];
- sum += lwpstatus.pr_reg[EBP];
- sum += lwpstatus.pr_reg[ESI];
- sum += lwpstatus.pr_reg[EDI];
-#endif
-
- if (tid->last_sum == sum) {
- return FALSE;
- }
- tid->last_sum = sum;
-
- return TRUE;
-}
-
-
-/*
- * If building for Solaris native threads, open up the /proc file
- * descriptor to be used when doing GC. The open is done at JVM start-up so
- * as to reserve this fd, to prevent GC stall due to exhausted fds. This fd
- * will never be closed, and will alwyas be present.
- */
-int
-np_initialize()
-{
- char procname[32];
- MakeProcName(procname, getpid());
- if ((procfd = open(procname, O_RDONLY, 0)) < 0) {
- VM_CALL(jio_fprintf)(stderr, "Cannot open %s for GC", procname);
- return SYS_ERR;
- }
- return SYS_OK;
-}
-
-static void
-MakeProcName(register char *procname, register pid_t pid)
-{
- register char * s;
-
- (void) strcpy(procname, "/proc/00000");
- s = procname + strlen(procname);
- while (pid) {
- *--s = pid%10 + '0';
- pid /= 10;
- }
-}
-
-/*
- * Suspend all other threads, and record their contexts (register
- * set or stack pointer) into the sys_thread structure, so that a
- * garbage collect can be run.
- */
-int
-np_single(void)
-{
- int ret;
-
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
-
- stop_lwps();
- ret = SYS_OK;
- return ret;
-}
-
-/*
- * Continue threads suspended earlier. But clear their context
- * recorded in sys_thread structure first.
- */
-void
-np_multi(void)
-{
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
- clear_onproc_flags();
- restart_lwps();
-}
-
-/* /proc solution to stop and restrt lwps */
-/* make sure gc is run as a bound thread */
-/* make sure signals are turned off for gc thread */
-/* what about new lwps getting created in the meantime? */
-
-#define MAX_LWPS 1024
-
-static prstatus_t Mystatus;
-static id_t lwpid_list_buf[MAX_LWPS];
-static id_t oldlwpid_list_buf[MAX_LWPS];
-static sys_thread_t *onproct_list_buf[MAX_LWPS];
-static id_t *lwpid_list = lwpid_list_buf;
-static id_t *oldlwpid_list = oldlwpid_list_buf;
-static sys_thread_t **onproct_list = onproct_list_buf;
-static int lwpid_list_len;
-static int oldlwpid_list_len;
-static int onproct_ix = 0;
-static int gcprio;
-static sigset_t gcmask;
-
-static void
-clear_onproc_flags()
-{
- int i;
-
- for (i = 0; i < onproct_ix; i++) {
- ((sys_thread_t *)(onproct_list[i]))->onproc = FALSE;
- }
- onproct_ix = 0;
-}
-
-
-/* Sleep for n milliseconds, n < 1000 */
-static void
-GC_msec_sleep(int n)
-{
- struct timespec ts;
-
- ts.tv_sec = 0;
- ts.tv_nsec = 1000000*n;
- if (syscall(SYS_nanosleep, &ts, 0) < 0) {
- VM_CALL(jio_fprintf)(stderr, "%d\n", errno);
- }
-}
-
-/*
- * Assumes stacks grow down from high to low memory. True on sparc and Intel.
- */
-#define VALID_SP(sp, bottom, top) \
- (((uintptr_t)(sp)) < ((uintptr_t)(bottom)) && ((uintptr_t)(sp)) > ((uintptr_t)(top)))
-
-static void
-record_lwp_regs(prstatus_t lwpstatus)
-{
- sys_thread_t *tid;
- int i;
-#if defined(sparc)
- register uintptr_t sp = lwpstatus.pr_reg[R_SP];
-#elif defined(amd64)
- register uintptr_t sp = lwpstatus.pr_reg[REG_RSP];
-#elif defined(i386)
- register uintptr_t sp = lwpstatus.pr_reg[UESP];
-#endif
-
- tid = ThreadQueue;
- for (i = 0; i < ActiveThreadCount && tid != 0; i++) {
- if (VALID_SP(sp, tid->stack_bottom, tid->stack_top)) {
- long *regs = tid->regs;
- tid->sp = sp;
- /*
- * The code below relies on N_TRACED_REGS being set
- * correctly for each platform. If you change the
- * number of registers being watched, you should update
- * the define for N_TRACED_REGS
- */
-#if defined(sparc)
- regs[0] = lwpstatus.pr_reg[R_G1];
- regs[1] = lwpstatus.pr_reg[R_G2];
- regs[2] = lwpstatus.pr_reg[R_G3];
- regs[3] = lwpstatus.pr_reg[R_G4];
-
- regs[4] = lwpstatus.pr_reg[R_O0];
- regs[5] = lwpstatus.pr_reg[R_O1];
- regs[6] = lwpstatus.pr_reg[R_O2];
- regs[7] = lwpstatus.pr_reg[R_O3];
- regs[8] = lwpstatus.pr_reg[R_O4];
- regs[9] = lwpstatus.pr_reg[R_O5];
- regs[10] = lwpstatus.pr_reg[R_O6];
- regs[11] = lwpstatus.pr_reg[R_O7];
-#elif defined(amd64)
- regs[0] = lwpstatus.pr_reg[REG_RAX];
- regs[1] = lwpstatus.pr_reg[REG_RCX];
- regs[2] = lwpstatus.pr_reg[REG_RDX];
- regs[3] = lwpstatus.pr_reg[REG_RBX];
- regs[4] = lwpstatus.pr_reg[REG_RBP];
- regs[5] = lwpstatus.pr_reg[REG_RSI];
- regs[6] = lwpstatus.pr_reg[REG_RDI];
- regs[7] = lwpstatus.pr_reg[REG_R8];
- regs[8] = lwpstatus.pr_reg[REG_R9];
- regs[9] = lwpstatus.pr_reg[REG_R10];
- regs[10]= lwpstatus.pr_reg[REG_R11];
- regs[11]= lwpstatus.pr_reg[REG_R12];
- regs[12]= lwpstatus.pr_reg[REG_R13];
- regs[13]= lwpstatus.pr_reg[REG_R14];
- regs[14]= lwpstatus.pr_reg[REG_R15];
-#elif defined(i386)
- regs[0] = lwpstatus.pr_reg[EAX];
- regs[1] = lwpstatus.pr_reg[ECX];
- regs[2] = lwpstatus.pr_reg[EDX];
- regs[3] = lwpstatus.pr_reg[EBX];
- regs[4] = lwpstatus.pr_reg[EBP];
- regs[5] = lwpstatus.pr_reg[ESI];
- regs[6] = lwpstatus.pr_reg[EDI];
-#endif
-
- if (tid->onproc != TRUE) {
- tid->onproc = TRUE;
- onproct_list[onproct_ix++] = tid;
- }
- break;
- }
- tid = tid->next;
- }
-}
-
-static void
-record_thread_regs()
-{
- sys_thread_t *tid;
- int i;
-
- tid = ThreadQueue;
- for (i = 0; i < ActiveThreadCount && tid != 0; i++) {
- if (tid->onproc != TRUE) {
- int i;
-
- if (tid->sys_thread != 0) {
- /* if thread has already been initialized */
- tid->sp = __gettsp(tid->sys_thread);
- } else {
- /*
- * thread is still in the process of being initalized.
- * So GC should not care about this thread. Just
- * set its sp to 0, and this will force GC to ignore it.
- */
- tid->sp = 0;
- }
-
- /*
- * Clear out the registers since they are no longer live
- * and we don't want to garbage collector to think they are.
- */
-
- for (i = 0; i < N_TRACED_REGS; i++)
- tid->regs[i] = 0;
- }
- tid = tid->next;
- }
-}
-
-static void
-wait_stopped_lwps(void)
-{
- int i, lwpfd;
- prstatus_t lwpstatus;
-
- for (i = 0; i < (int) Mystatus.pr_nlwp; i++) {
- /* if its not me */
- if (lwpid_list[i] != _lwp_self()) {
-
- /* open the lwp and check the status */
- if ((lwpfd = syscall(SYS_ioctl, procfd, PIOCOPENLWP,
- &lwpid_list[i])) < 0) {
-#ifdef MY_DEBUG
- VM_CALL(jio_fprintf)(stderr, "lwpid %d was not found in process\n",
- lwpid_list[i]);
-#endif
- continue;
- }
- memset(&lwpstatus, 0, sizeof(lwpstatus));
- while (1) {
- if (syscall(SYS_ioctl,lwpfd, PIOCSTATUS, &lwpstatus)<0) {
- sysAssert(0);
-#ifdef MY_DEBUG
- VM_CALL(jio_fprintf)(stderr, "PIOCSTATUS failed for lwp %d",
- lwpid_list[i]);
-#endif
- break;
- }
- if (lwpstatus.pr_flags & PR_STOPPED) {
- record_lwp_regs(lwpstatus);
- break;
- }
- GC_msec_sleep(1);
- }
-
- close (lwpfd);
- } /* end of if-me */
- } /* end of for */
-}
-
-static void
-suspend_lwps()
-{
- int i;
- /* pioopen all the lwps and stop them - except the one I am running on */
- for (i = 0; i < (int) Mystatus.pr_nlwp; i++) {
-
- /* open and stop the lwp if its not me */
- if (lwpid_list[i] != _lwp_self()) {
-
- /* PIOCSTOP doesn't work without a writable */
- /* descriptor. And that makes the process */
- /* undebuggable. */
- if (_lwp_suspend(lwpid_list[i]) < 0) {
- /* Could happen if the lwp exited */
- lwpid_list[i] = _lwp_self();
- continue;
- }
- }
- }
-}
-
-static void
-print_lwps()
-{
-#ifdef MY_DEBUG
- /* print all the lwps in the process */
- VM_CALL(jio_fprintf)(stdout, "lwpids ");
- for (i = 0; i < (int) Mystatus.pr_nlwp; i++) {
- if (i == 0) {
- VM_CALL(jio_fprintf)(stdout, "%d", lwpid_list[0]);
- } else if (i != Mystatus.pr_nlwp - 1) {
- VM_CALL(jio_fprintf)(stdout, ", %d", lwpid_list[i]);
- } else {
- VM_CALL(jio_fprintf)(stdout, " and %d", lwpid_list[i]);
- }
- }
-#endif
-}
-
-/* routine to iteratively stop all lwps */
-static void
-stop_lwps()
-{
- int i;
- sigset_t set;
- boolean_t changed;
-
- /* mask all signals */
- (void) sigfillset(&set);
- syscall(SYS_sigprocmask, SIG_SETMASK, &set, &gcmask);
-
- /* run at highest prio so I cannot be preempted */
- thr_getprio(thr_self(), &gcprio);
- thr_setprio(thr_self(), 2147483647); /* #define INT_MAX 2147483647 */
-
- oldlwpid_list_len = 0;
-
- while(1) {
- changed = B_FALSE;
-
- /* Get the # of lwps in the process */
- memset(&Mystatus, 0, sizeof(Mystatus));
- syscall(SYS_ioctl, procfd, PIOCSTATUS, &Mystatus);
-
-#ifdef MY_DEBUG
- VM_CALL(jio_fprintf)(stdout, "Number of lwps in the process is %d\n",
- Mystatus.pr_nlwp);
- VM_CALL(jio_fprintf)(stdout, "My lwp id is %d\n", _lwp_self());
-#endif
- lwpid_list_len = Mystatus.pr_nlwp;
- if (syscall(SYS_ioctl, procfd, PIOCLWPIDS, lwpid_list) == -1) {
-#ifdef MY_DEBUG
- VM_CALL(jio_fprintf)(stderr, "Can't read proc's lwpid list");
-#endif
- return;
- }
-
- print_lwps();
-
- /* suspend all the lwps */
- suspend_lwps();
-
- /* make sure all the lwps have actually stopped */
- wait_stopped_lwps();
-
- /* make sure the list has not changed while you were not looking
- else start all over again */
- if (lwpid_list_len != oldlwpid_list_len) changed = B_TRUE;
- else {
- for (i=0; i<lwpid_list_len; ++i) {
- if (lwpid_list[i] != oldlwpid_list[i]) {
- changed = B_TRUE; break;
- }
- }
- }
- if (!changed) break;
-
- {
- id_t *tmplwpid_list = oldlwpid_list;
- oldlwpid_list = lwpid_list; oldlwpid_list_len = lwpid_list_len;
- lwpid_list = 0; lwpid_list_len = 0;
- lwpid_list = tmplwpid_list;
- }
- }
-
- /* record regs for threads that were not on LWPs */
- record_thread_regs();
-
- return;
-}
-
-
-/* Restart all lwps in process. */
-static void
-restart_lwps()
-{
- int i;
-
- for (i = 0; i < Mystatus.pr_nlwp; i++) {
- if (lwpid_list[i] == _lwp_self()) continue;
- if (_lwp_continue(lwpid_list[i]) < 0) {
-#ifdef MY_DEBUG
- VM_CALL(jio_fprintf)(stderr, "Failed to restart lwp %d\n",lwpid_list[i]);
-#endif
- }
- }
-
- /* restore the old priority of the thread */
- thr_setprio(thr_self(), gcprio);
- /* restore the oldmask */
- syscall(SYS_sigprocmask, SIG_SETMASK, &gcmask, NULL);
-
- print_lwps();
-}
--- a/jdk/src/solaris/hpi/src/interrupt.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 1994, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Threads interrupt dispatch
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include "hpi_impl.h"
-
-#include "interrupt.h"
-
-/* handler_entry_t is used to keep track of the registered handlers. */
-typedef struct handler_entry {
- intr_handler_t handler;
- void *handlerArg;
-} handler_entry_t;
-
-static handler_entry_t handlerList[N_INTERRUPTS];
-
-/* Initialize the interrupt system */
-void
-intrInit()
-{
- memset(handlerList, 0, sizeof(handlerList));
- /*
- * Target-dependent initialization.
- */
- intrInitMD();
-}
-
-/* Add/Remove a handler for a particular interrupt */
-
-signal_handler_t
-intrRegister(int interrupt, intr_handler_t handler, void *handlerArg)
-{
- struct sigaction sigAct, sigActOld;
-
- intrLock();
-
- if (handler == (intr_handler_t)SYS_SIG_IGN ||
- handler == (intr_handler_t)SYS_SIG_DFL) {
- /* If we get IGN or DFL, register that as the process signal handler,
- * and clear the handlerList entry.
- */
- sigAct.sa_handler = (void (*)(int))handler;
- sigAct.sa_flags = 0;
- sigaction(interrupt, &sigAct, &sigActOld);
- handlerList[interrupt].handler = NULL;
- } else {
- /* Otherwise, we register intrDispatchMD as the common signal handler,
- * and set the real handler in handlerList[interrupt].handler.
- */
-#ifdef SA_SIGINFO
- sigAct.sa_handler = 0;
- sigAct.sa_sigaction = intrDispatchMD;
- sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
-#else
- sigAct.sa_handler = intrDispatchMD;
- sigAct.sa_flags = SA_RESTART;
-#endif
- sigfillset(&sigAct.sa_mask);
- sigaction(interrupt, &sigAct, &sigActOld);
- handlerList[interrupt].handler = handler;
- handlerList[interrupt].handlerArg = handlerArg;
- }
-
- intrUnlock();
-
- /* If SA_SIGINFO is set, sa_sigaction is valid, otherwise sa_handler is. */
-#ifdef SA_SIGINFO
- return (sigActOld.sa_flags & SA_SIGINFO) ?
- (signal_handler_t)sigActOld.sa_sigaction :
- (signal_handler_t)sigActOld.sa_handler;
-#else
- return (signal_handler_t)sigActOld.sa_handler;
-#endif
-}
-
-/*
- * intrDispatch -- Dispatch an interrupt.
- *
- * This routine is called from the low-level handlers
- * at interrupt time.
- */
-void
-intrDispatch(int interrupt, void *siginfo, void *context)
-{
- /*
- * Assumptions:
- * - Each interrupt only has one priority level associated with
- * it.
- * - Each handler will do enough work so that when it returns
- * the source of the interrupt is masked.
- */
- handler_entry_t *entry = &handlerList[interrupt];
- intr_handler_t handler = entry->handler;
-
- if (handler) {
- (*handler)(interrupt, siginfo, context, entry->handlerArg);
- return;
- }
-
- /* No handler for this interrupt, log the error */
- Log1(0, "spurious interrupt %d\n", interrupt);
- return;
-}
-
-static void userSignalHandler(int sig, void *info, void *uc, void *arg)
-{
- signal_handler_t handler = (signal_handler_t)arg;
- /* for now we don't change the disposition of the signal in this case */
- /* sysSignal(sig, SYS_SIG_DFL); */
- handler(sig, info, uc);
-}
-
-signal_handler_t sysSignal(int sig, signal_handler_t newHandler)
-{
- handler_entry_t *entry = &handlerList[sig];
- void *oldHandlerArg = entry->handlerArg;
- signal_handler_t oldHandler;
-
- if (intrInUse(sig)) {
- return SYS_SIG_ERR;
- }
-
-#ifdef __linux__
- oldHandler = intrRegister(sig, (intr_handler_t)userSignalHandler, (void *)newHandler);
-#else
- oldHandler = intrRegister(sig, userSignalHandler, (void *)newHandler);
-#endif
- /* If the old handler is intrDispatchMD, we get the real handler from
- * entry->handlerArg.
- */
- if (oldHandler == (signal_handler_t)intrDispatchMD) {
- oldHandler = (signal_handler_t)oldHandlerArg;
- }
-
- return oldHandler;
-}
-
-void sysRaise(int sig)
-{
- raise(sig);
-}
--- a/jdk/src/solaris/hpi/src/linker_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Machine Dependent implementation of the dynamic linking support
- * for java. This routine is Solaris specific.
- */
-
-#include "hpi_impl.h"
-
-#include <stdio.h>
-#include <dlfcn.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "path_md.h"
-#include "monitor_md.h"
-
-#ifndef NATIVE
-#include "iomgr.h"
-#include "threads_md.h"
-#endif
-
-/*
- * This lock protects the dl wrappers, assuring that two threads aren't
- * in libdl at the same time.
- */
-sys_mon_t _dl_lock;
-
-/*
- * Solaris green threads needs to lock around libdl.so.
- */
-#if defined(__solaris__) && !defined(NATIVE)
- #define NEED_DL_LOCK
-#endif
-
-/*
- * create a string for the JNI native function name by adding the
- * appropriate decorations.
- */
-int
-sysBuildFunName(char *name, int nameLen, int args_size, int encodingIndex)
-{
- /* On Solaris, there is only one encoding method. */
- if (encodingIndex == 0)
- return 1;
- return 0;
-}
-
-/*
- * create a string for the dynamic lib open call by adding the
- * appropriate pre and extensions to a filename and the path
- */
-void
-sysBuildLibName(char *holder, int holderlen, char *pname, char *fname)
-{
- const size_t pnamelen = pname ? strlen(pname) : 0;
-
- /* Quietly truncate on buffer overflow. Should be an error. */
- if (pnamelen + strlen(fname) + 10 > (size_t) holderlen) {
- *holder = '\0';
- return;
- }
-
- if (pnamelen == 0) {
- sprintf(holder, "lib%s.so", fname);
- } else {
- sprintf(holder, "%s/lib%s.so", pname, fname);
- }
-}
-
-
-#ifdef __linux__
- static int thr_main(void)
- {
- return -1;
- }
-#else
- #ifndef NATIVE
- extern int thr_main(void);
- #endif
-#endif
-
-void *
-sysLoadLibrary(const char *name, char *err_buf, int err_buflen)
-{
- void * result;
-
-#ifdef NEED_DL_LOCK
- sysMonitorEnter(sysThreadSelf(), &_dl_lock);
- result = dlopen(name, RTLD_NOW);
- sysMonitorExit(sysThreadSelf(), &_dl_lock);
-#else
- result = dlopen(name, RTLD_LAZY);
-#endif
- /*
- * This is a bit of bulletproofing to catch the commonly occurring
- * problem of people loading a library which depends on libthread into
- * the VM. thr_main() should always return -1 which means that libthread
- * isn't loaded.
- */
-#ifndef NATIVE
- if (thr_main() != -1) {
- VM_CALL(panic)("libthread loaded into green threads");
- }
-#endif
- if (result == NULL) {
- strncpy(err_buf, dlerror(), err_buflen-2);
- err_buf[err_buflen-1] = '\0';
- }
- return result;
-}
-
-void
-sysUnloadLibrary(void *handle)
-{
-#ifdef NEED_DL_LOCK
- sysMonitorEnter(sysThreadSelf(), &_dl_lock);
- dlclose(handle);
- sysMonitorExit(sysThreadSelf(), &_dl_lock);
-#else
- dlclose(handle);
-#endif
-}
-
-void *
-sysFindLibraryEntry(void *handle, const char *name)
-{
- void *sym;
-#ifdef NEED_DL_LOCK
- sysMonitorEnter(sysThreadSelf(), &_dl_lock);
- sym = dlsym(handle, name);
- sysMonitorExit(sysThreadSelf(), &_dl_lock);
-#else
- sym = dlsym(handle, name);
-#endif
- return sym;
-}
--- a/jdk/src/solaris/hpi/src/memory_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,439 +0,0 @@
-/*
- * Copyright (c) 1995, 2000, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of primitive memory allocation.
- *
- * The only thing machine dependent about this allocator is how it
- * initially finds all of the possible memory, and how it implements
- * mapChunk() and unmapChunk().
- *
- * This is all pretty simple stuff. It is not likely to be banged on
- * frequently enough to be a performance issue, unless the underlying
- * primitives are. Implementing things:
- *
- * HPI function Solaris "malloc" Win32
- * --------------------------------------------------------------------
- * sysMapMem() mmap() malloc() VirtualAlloc(...MEM_RESERVE...)
- * sysUnMapMem() munmap() free() VirtualFree(...MEM_RESERVE...)
- * sysCommitMem() no-op no-op VirtualAlloc(...MEM_COMMIT...)
- * sysDecommitMem() no-op no-op VirtualFree(...MEM_COMMIT...)
- *
- * Memory mapping is the default, but compiling with -DUSE_MALLOC gives
- * a system based on malloc().
- */
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h> /* For perror() */
-#include <string.h>
-#include <malloc.h>
-
-#include "hpi_impl.h"
-
-#ifndef USE_MALLOC
-
-#include <sys/mman.h>
-#include <fcntl.h>
-#ifdef __linux__
-#ifndef MAP_ANONYMOUS
-static int devZeroFD;
-#endif
-#else
-static int devZeroFD;
-#endif
-
-#endif /* !USE_MALLOC */
-
-#ifdef __linux__
-#ifndef MAP_FAILED
-#define MAP_FAILED ((caddr_t)-1)
-#endif
-static size_t memGrainSize; /* A page for Linux */
-#else
-static unsigned int memGrainSize; /* A page for Solaris */
-#endif
-
-/*
- * Mem size rounding is done at this level. The calling code asks
- * these routines for literally what it thinks it wants. The size is
- * rounded up to the first multiple of memGrainSize that contains
- * requestedSize bytes.
- */
-
-static long
-roundUpToGrain(long value)
-{
- return (value + memGrainSize - 1) & ~(memGrainSize - 1);
-}
-
-static long
-roundDownToGrain(long value)
-{
- return value & ~(memGrainSize - 1);
-}
-
-void
-InitializeMem(void)
-{
- static int init = 0;
-
- if (init) {
- return; /* Subsequent calls are no-ops */
- }
-
- /*
- * Set system-specific variables used by mem allocator
- */
- if (memGrainSize == 0) {
- memGrainSize = (int) sysconf(_SC_PAGESIZE);
- }
-
-#ifdef __linux__
-#if !defined(USE_MALLOC) && !defined(MAP_ANONYMOUS)
- devZeroFD = open("/dev/zero", O_RDWR);
- if (devZeroFD == -1) {
- perror("devzero");
- exit(1);
- }
-#endif /* !USE_MALLOC MAP_ANONYMOUS*/
-#else
-#ifndef USE_MALLOC
- devZeroFD = open("/dev/zero", O_RDWR);
- if (devZeroFD == -1) {
- perror("devzero");
- exit(1);
- }
-#endif /* !USE_MALLOC */
-#endif
-
- init = 1; /* We're initialized now */
-}
-
-
-#ifndef USE_MALLOC
-
-#define PROT_ALL (PROT_READ|PROT_WRITE|PROT_EXEC)
-
-#ifndef MAP_NORESERVE
-#define MAP_NORESERVE 0
-#endif
-
-/*
- * Map a chunk of memory. Return the address of the base if successful,
- * 0 otherwise. We do not care where the mapped memory is, and can't
- * even express a preference in the current HPI. If any platforms
- * require us to manage addresses of mapped chunks explicitly, that
- * must be done below the HPI.
- */
-static char *
-mapChunk(long length)
-{
- char *ret;
-
-#if defined(__linux__) && defined(MAP_ANONYMOUS)
- ret = (char *) mmap(0, length, PROT_ALL,
- MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS,
- -1, (off_t) 0);
-#else
- ret = (char *) mmap(0, length, PROT_ALL, MAP_NORESERVE|MAP_PRIVATE,
- devZeroFD, (off_t) 0);
-#endif
- return (ret == MAP_FAILED ? 0 : ret);
-}
-
-/*
- * Map a chunk of memory at a specific address and reserve swap space
- * for it. This is currently only used to remap space previously mapped
- * MAP_NORESERVE, reserving swap and getting native error handling. We
- * assume that all alignment and rounding has been done by the caller.
- * Return 1 if successful and 0 otherwise.
- */
-static char *
-mapChunkReserve(char *addr, long length)
-{
- char *ret;
-#if defined(__linux__) && defined(MAP_ANONYMOUS)
- ret = (char *) mmap(addr, length, PROT_ALL,
- MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
- -1, (off_t) 0);
-#else
- ret = (char *) mmap(addr, length, PROT_ALL, MAP_FIXED|MAP_PRIVATE,
- devZeroFD, (off_t) 0);
-#endif
- return (ret == MAP_FAILED ? 0 : ret);
-}
-
-/*
- * Map a chunk of memory at a specific address and reserve swap space
- * for it. This is currently only used to remap space previously mapped
- * MAP_RESERVE, unreserving swap and getting native error handling. We
- * assume that all alignment and rounding has been done by the caller.
- * Return 1 if successful and 0 otherwise.
- */
-static char *
-mapChunkNoreserve(char *addr, long length)
-{
- char *ret;
-
-#if defined(__linux__) && defined(MAP_ANONYMOUS)
- ret = (char *) mmap(addr, length, PROT_ALL,
- MAP_FIXED | MAP_PRIVATE |
- MAP_NORESERVE | MAP_ANONYMOUS,
- -1, (off_t) 0);
-#else
- ret = (char *) mmap(addr, length, PROT_ALL,
- MAP_FIXED|MAP_PRIVATE|MAP_NORESERVE,
- devZeroFD, (off_t) 0);
-#endif
- return (ret == MAP_FAILED ? 0 : ret);
-}
-
-/*
- * Unmap a chunk of memory. Return 1 if successful, 0 otherwise. We
- * currently don't do any alignment or rounding, assuming that we only
- * will unmap chunks that have previously been returned by mapChunk().
- */
-static int
-unmapChunk(void *addr, long length)
-{
- return (munmap(addr, length) == 0);
-}
-
-#endif /* !USE_MALLOC */
-
-
-/* HPI Functions: */
-
-/*
- * Map a range of virtual memory. Note that the size asked for here
- * is literally what the upper level has asked for. We need to do
- * any rounding, etc. here. If mapping fails return 0, otherwise
- * return the address of the base of the mapped memory.
- */
-void *
-sysMapMem(size_t requestedSize, size_t *mappedSize)
-{
- void *mappedAddr;
-
- *mappedSize = roundUpToGrain(requestedSize);
-#ifdef USE_MALLOC
- mappedAddr = (void *) sysMalloc(*mappedSize); /* Returns 0 on failure */
-#ifdef __linux__
- if (mappedAddr) {
- memset(mappedAddr, 0, *mappedSize);
- mappedAddr = (void *) roundUpToGrain(mappedAddr);
- }
-#endif
-#else
- mappedAddr = mapChunk(*mappedSize); /* Returns 0 on failure */
-#endif /* USE_MALLOC */
- if (mappedAddr) {
- Log3(2, "sysMapMem: 0x%x bytes at 0x%x (request: 0x%x bytes)\n",
- *mappedSize, mappedAddr, requestedSize);
- } else {
- Log1(2, "sysMapMem failed: (request: 0x%x bytes)\n", requestedSize);
- }
- return mappedAddr;
-}
-
-/*
- * Unmap a range of virtual memory. Note that the size asked for here
- * is literally what the upper level has asked for. We need to do any
- * rounding, etc. here. If unmapping fails return 0, otherwise return
- * the address of the base of the unmapped memory.
- */
-void *
-sysUnmapMem(void *requestedAddr, size_t requestedSize, size_t *unmappedSize)
-{
- void *unmappedAddr;
- int ret;
-
- *unmappedSize = roundUpToGrain(requestedSize);
-#ifdef USE_MALLOC
- sysFree(requestedAddr);
- ret = 1;
-#else
- ret = unmapChunk(requestedAddr, *unmappedSize);
-#endif /* USE_MALLOC */
- if (ret) {
- unmappedAddr = requestedAddr;
- Log4(2,
- "sysUnmapMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *unmappedSize, unmappedAddr, requestedSize, requestedAddr);
- } else {
- unmappedAddr = 0;
- Log2(2, "sysUnmapMem failed: (request: 0x%x bytes at 0x%x)\n",
- requestedSize, requestedAddr);
- }
- return unmappedAddr;
-}
-
-/*
- * Commit/decommit backing store to a range of virtual memory. This range
- * needs not be identical to a mapped range, but must be a subset of one.
- * On Solaris, we remap the range to reserve swap for the space on
- * commit. We don't strictly need to do this, as Solaris will demand
- * page pages that we've mapped when we want to access them. But by
- * reserving swap we get reasonable error handling for free where we'd
- * otherwise end up getting a SIGBUS on a random write when we run out
- * of swap. It also emphasizes the general need for shared code to
- * postpone committing to mapped memory for as long as is feasible.
- * When Java really needs space (the thread stacks excepted), it will
- * soon write over it (heap, markbits), so we don't really get much from
- * demand paging.
- *
- * We do not validate that commitment requests cover already-mapped
- * memory, although in principle we could. The size asked for here
- * is what the upper level has asked for. We need to do any platform-
- * dependent rounding here.
- *
- * When you commit, you commit to the entire page (or whatever quantum
- * your O/S requires) containing the pointer, and return the beginning of
- * that page. When you decommit, you decommit starting at the next page
- * *up* from that containing the pointer, except that decommitting from
- * a pointer to the beginning of the page operates on that page.
- */
-
-/*
- * Return the address of the base of the newly committed memory, or 0
- * if committing failed.
- */
-void *
-sysCommitMem(void *requestedAddr, size_t requestedSize, size_t *committedSize)
-{
- void *committedAddr;
- char *ret;
-
- *committedSize = roundUpToGrain(requestedSize);
- committedAddr = (void *) roundDownToGrain((long) requestedAddr);
-#ifdef USE_MALLOC
-#ifdef __linux__
- ret = committedAddr;
-#else
- ret = requestedAddr;
-#endif
-#else
- ret = mapChunkReserve(committedAddr, *committedSize);
-#endif
- if (ret) {
- committedAddr = ret;
- Log4(2,
- "sysCommitMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *committedSize, committedAddr, requestedSize, requestedAddr);
- } else {
- committedAddr = 0;
- Log2(2, "sysCommitMem failed: (request: 0x%x bytes at 0x%x)\n",
- requestedSize, requestedAddr);
- }
-
- return committedAddr;
-}
-
-/*
- * Return the address of the base of the newly decommitted memory, or 0
- * if decommitting failed.
- */
-void *
-sysDecommitMem(void *requestedAddr, size_t requestedSize,
- size_t *decommittedSize)
-{
- void *decommittedAddr;
- char *ret;
-
- *decommittedSize = roundDownToGrain(requestedSize);
- decommittedAddr = (void *) roundUpToGrain((long) requestedAddr);
-#ifdef USE_MALLOC
- ret = 0;
-#else
- ret = mapChunkNoreserve(decommittedAddr, *decommittedSize);
-#endif
- Log4(2,
- "sysDecommitMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *decommittedSize, decommittedAddr, requestedSize, requestedAddr);
-
- return ret;
-}
-
-/*
- * Allocate memory on an alignment boundary. Returns aligned
- * pointer to new memory. Use sysFreeBlock to free the block.
- *
- * sysAllocBlock() is similar to memalign(), except that it also
- * returns a pointer to the beginning of the block returned by the
- * OS, which must be used to deallocate the block. (On some OSes,
- * these two won't be the same.) sysAllocBlock() is also more
- * limited than memalign in that it can only be used to allocate
- * on particular alignments (PAGE_ALIGNMENT) and should be assumed
- * to round the sizes of allocated blocks up to multiples of the
- * alignment value (PAGE_ALIGNMENT*n bytes).
- */
-void *
-sysAllocBlock(size_t size, void** allocHead)
-{
- void* alignedPtr = memalign(PAGE_ALIGNMENT, size);
- *allocHead = alignedPtr;
- return alignedPtr;
-}
-
-/*
- * Wrapper to free block allocated by sysMemAlign.
- */
-void
-sysFreeBlock(void *allocHead)
-{
- free(allocHead);
-}
-
-void * sysMalloc(size_t s)
-{
- if (s == 0)
- return malloc(1);
- return malloc(s);
-}
-
-void * sysRealloc(void *p, size_t s)
-{
- return realloc(p, s);
-}
-
-void sysFree(void *p)
-{
- if (p != NULL)
- free(p);
-}
-
-void * sysCalloc(size_t s1, size_t s2)
-{
- if (s1 == 0 || s2 == 0)
- return calloc(1, 1);
- return calloc(s1, s2);
-}
-
-char * sysStrdup(const char * string)
-{
- return strdup(string);
-}
--- a/jdk/src/solaris/hpi/src/system_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
-/*
- * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "hpi_impl.h"
-
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h> /* timeval */
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-#include <netdb.h>
-#include <limits.h>
-#include <errno.h>
-
-#include <dlfcn.h>
-
-#include "jni_md.h"
-#include "mutex_md.h"
-
-#include "hpi_init.h"
-
-#include "interrupt.h"
-#include "threads_md.h"
-#include "monitor_md.h"
-#include "largefile.h"
-
-
-#define O_DELETE 0x10000
-
-int sysThreadBootstrap(sys_thread_t **tidP, sys_mon_t **lockP, int nb)
-{
- threadBootstrapMD(tidP, lockP, nb);
-
- intrInit();
-
-#ifndef NATIVE
- /* Initialize the special case for sbrk on Solaris (see synch.c) */
- InitializeSbrk();
- /* Initialize the async io */
- InitializeAsyncIO();
- InitializeMem();
- /* Initialize Clock and Idle threads */
- InitializeHelperThreads();
-#else /* if NATIVE */
- initializeContentionCountMutex();
- InitializeMem();
-#endif /* NATIVE */
-
- return SYS_OK;
-}
-
-int sysShutdown()
-{
- return SYS_OK;
-}
-
-long
-sysGetMilliTicks()
-{
- struct timeval tv;
-
- (void) gettimeofday(&tv, (void *) 0);
- return((tv.tv_sec * 1000) + (tv.tv_usec / 1000));
-}
-
-jlong
-sysTimeMillis()
-{
- struct timeval t;
- gettimeofday(&t, 0);
- return ((jlong)t.tv_sec) * 1000 + (jlong)(t.tv_usec/1000);
-}
-
-int
-sysGetLastErrorString(char *buf, int len)
-{
- if (errno == 0) {
- return 0;
- } else {
- const char *s = strerror(errno);
- int n = strlen(s);
- if (n >= len) n = len - 1;
- strncpy(buf, s, n);
- buf[n] = '\0';
- return n;
- }
-}
-
-/*
- * File system
- *
- * These are all the sys API which implement the straight POSIX
- * API. Those that do not are defined by thread-specific files
- * (i.e. io_md.c)
- */
-
-/*
- * Open a file. Unlink the file immediately after open returns
- * if the specified oflag has the O_DELETE flag set.
- */
-int sysOpen(const char *path, int oflag, int mode)
-{
- int fd;
- int delete = (oflag & O_DELETE);
- oflag = oflag & ~O_DELETE;
- fd = open64_w(path, oflag, mode);
- if (delete != 0) {
- unlink(path);
- }
- return fd;
-}
-
-char *sysNativePath(char *path)
-{
- return path;
-}
-
-int
-sysFileSizeFD(int fd, jlong *size)
-{
- struct stat64 buf64;
- int ret = fstat64(fd, &buf64);
- *size = buf64.st_size;
- return ret;
-}
-
-int
-sysFfileMode(int fd, int *mode)
-{
- struct stat64 buf64;
- int ret = fstat64(fd, &buf64);
- (*mode) = buf64.st_mode;
- return ret;
-}
-
-int
-sysFileType(const char *path)
-{
- int ret;
- struct stat buf;
-
- if ((ret = stat(path, &buf)) == 0) {
- mode_t mode = buf.st_mode & S_IFMT;
- if (mode == S_IFREG) return SYS_FILETYPE_REGULAR;
- if (mode == S_IFDIR) return SYS_FILETYPE_DIRECTORY;
- return SYS_FILETYPE_OTHER;
- }
- return ret;
-}
-
-/*
- * Wrapper functions for low-level I/O routines - use the 64 bit
- * version if available, else revert to the 32 bit versions.
- */
-
-off64_t
-lseek64_w(int fd, off64_t offset, int whence)
-{
- return lseek64(fd, offset, whence);
-}
-
-int
-ftruncate64_w(int fd, off64_t length)
-{
- return ftruncate64(fd, length);
-}
-
-int
-open64_w(const char *path, int oflag, int mode)
-{
- int fd = open64(path, oflag, mode);
- if (fd == -1) return -1;
-
- /* If the open succeeded, the file might still be a directory */
- {
- int st_mode;
- if (sysFfileMode(fd, &st_mode) != -1) {
- if ((st_mode & S_IFMT) == S_IFDIR) {
- errno = EISDIR;
- close(fd);
- return -1;
- }
- } else {
- close(fd);
- return -1;
- }
- }
-
- /*
- * 32-bit Solaris systems suffer from:
- *
- * - an historical default soft limit of 256 per-process file
- * descriptors that is too low for many Java programs.
- *
- * - a design flaw where file descriptors created using stdio
- * fopen must be less than 256, _even_ when the first limit above
- * has been raised. This can cause calls to fopen (but not calls to
- * open, for example) to fail mysteriously, perhaps in 3rd party
- * native code (although the JDK itself uses fopen). One can hardly
- * criticize them for using this most standard of all functions.
- *
- * We attempt to make everything work anyways by:
- *
- * - raising the soft limit on per-process file descriptors beyond
- * 256 (done by hotspot)
- *
- * - As of Solaris 10u4, we can request that Solaris raise the 256
- * stdio fopen limit by calling function enable_extended_FILE_stdio,
- * (also done by hotspot). We check for its availability.
- *
- * - If we are stuck on an old (pre 10u4) Solaris system, we can
- * workaround the bug by remapping non-stdio file descriptors below
- * 256 to ones beyond 256, which is done below.
- *
- * See:
- * 1085341: 32-bit stdio routines should support file descriptors >255
- * 6533291: Work around 32-bit Solaris stdio limit of 256 open files
- * 6431278: Netbeans crash on 32 bit Solaris: need to call
- * enable_extended_FILE_stdio() in VM initialisation
- * Giri Mandalika's blog
- * http://technopark02.blogspot.com/2005_05_01_archive.html
- */
-#if defined(__solaris__) && defined(_ILP32)
- {
- static int needToWorkAroundBug1085341 = -1;
- if (needToWorkAroundBug1085341) {
- if (needToWorkAroundBug1085341 == -1)
- needToWorkAroundBug1085341 =
- (dlsym(RTLD_DEFAULT, "enable_extended_FILE_stdio") == NULL);
- if (needToWorkAroundBug1085341 && fd < 256) {
- int newfd = fcntl(fd, F_DUPFD, 256);
- if (newfd != -1) {
- close(fd);
- fd = newfd;
- }
- }
- }
- }
-#endif /* 32-bit Solaris */
-
- /*
- * All file descriptors that are opened in the JVM and not
- * specifically destined for a subprocess should have the
- * close-on-exec flag set. If we don't set it, then careless 3rd
- * party native code might fork and exec without closing all
- * appropriate file descriptors (e.g. as we do in closeDescriptors in
- * UNIXProcess.c), and this in turn might:
- *
- * - cause end-of-file to fail to be detected on some file
- * descriptors, resulting in mysterious hangs, or
- *
- * - might cause an fopen in the subprocess to fail on a system
- * suffering from bug 1085341.
- *
- * (Yes, the default setting of the close-on-exec flag is a Unix
- * design flaw)
- *
- * See:
- * 1085341: 32-bit stdio routines should support file descriptors >255
- * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
- * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
- */
-#ifdef FD_CLOEXEC
- {
- int flags = fcntl(fd, F_GETFD);
- if (flags != -1)
- fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
- }
-#endif
- return fd;
-}
-
-void setFPMode(void)
-{
-#if defined(__amd64)
- asm(" pushq $0x1F80");
- /* ldmxcsr (%rsp) */
- asm(" .byte 0x0f,0xae,0x14,0x24");
- asm(" popq %rax");
-#elif defined(i386)
- asm(" pushl $575");
- asm(" fldcw (%esp)");
- asm(" popl %eax");
-#endif
-#if defined(__linux__) && defined(__mc68000__)
- asm(" fmovel #0x80,%fpcr");
-#endif
-}
--- a/jdk/src/windows/hpi/export/byteorder_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*-
- * Win32 dependent machine byte ordering (actually intel ordering)
- */
-
-#ifndef _JAVASOFT_WIN32_BYTEORDER_MD_H_
-#define _JAVASOFT_WIN32_BYTEORDER_MD_H_
-
-#ifdef x86
-#define ntohl(x) ((x << 24) | \
- ((x & 0x0000ff00) << 8) | \
- ((x & 0x00ff0000) >> 8) | \
- (((unsigned long)(x & 0xff000000)) >> 24))
-#define ntohs(x) (((x & 0xff) << 8) | ((x >> 8) & (0xff)))
-#define htonl(x) ntohl(x)
-#define htons(x) ntohs(x)
-#else /* x86 */
-#define ntohl(x) (x)
-#define ntohs(x) (x)
-#define htonl(x) (x)
-#define htons(x) (x)
-#endif /* x86 */
-
-#endif /* !_JAVASOFT_WIN32_BYTEORDER_MD_H_ */
--- a/jdk/src/windows/hpi/export/hpi_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_HPI_MD_H_
-#define _JAVASOFT_HPI_MD_H_
-
-#include "timeval_md.h"
-#include "io_md.h"
-#include "path_md.h"
-#include "byteorder_md.h"
-
-#define HPI_TIMEOUT_INFINITY ((jlong)(-1))
-
-#endif /* !_JAVASOFT_HPI_MD_H_ */
--- a/jdk/src/windows/hpi/export/io_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 system dependent low level io definitions
- */
-
-#ifndef _JAVASOFT_WIN32_IO_MD_H_
-#define _JAVASOFT_WIN32_IO_MD_H_
-
-#include <stdio.h>
-#include <io.h> /* For read(), lseek() etc. */
-#include <direct.h> /* For mkdir() */
-#include <windows.h>
-#include <winsock.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#include "jvm_md.h"
-
-#define R_OK 4
-#define W_OK 2
-#define X_OK 1
-#define F_OK 0
-
-#define MAXPATHLEN _MAX_PATH
-
-#define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO)
-#define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR)
-#define S_ISDIR(mode) (((mode) & _S_IFDIR) == _S_IFDIR)
-#define S_ISREG(mode) (((mode) & _S_IFREG) == _S_IFREG)
-
-#define LINE_SEPARATOR "\r\n"
-
-#endif /* !_JAVASOFT_WIN32_IO_MD_H_ */
--- a/jdk/src/windows/hpi/export/path_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*-
- * Win32 dependent search path definitions and API
- */
-
-#ifndef _JAVASOFT_WIN32_PATH_MD_H_
-#define _JAVASOFT_WIN32_PATH_MD_H_
-
-#define PATH_SEPARATOR ";"
-#define PATH_CURDIR "."
-
-#define DIR_SEPARATOR '/'
-#define LOCAL_DIR_SEPARATOR '\\'
-
-#endif /* !_JAVASOFT_WIN32_PATH_MD_H_ */
--- a/jdk/src/windows/hpi/export/timeval_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _JAVASOFT_WIN32_TIMEVAL_H_
-#define _JAVASOFT_WIN32_TIMEVAL_H_
-
-typedef struct {
- long tv_sec;
- long tv_usec;
-} timeval_t;
-
-/*
- * Operations on timevals.
- *
- * NB: timercmp does not work for >=, <= or ==.
- */
-#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
-#define timercmp(tvp, uvp, cmp) \
- ((tvp)->tv_sec cmp (uvp)->tv_sec || \
- (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
-#define timereq(tvp, uvp) \
- ((tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec == (uvp)->tv_usec)
-#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
-
-void timeradd(timeval_t*, timeval_t*);
-void timersub(timeval_t*, timeval_t*);
-
-#endif /* !_JAVASOFT_WIN32_TIMEVAL_H_ */
--- a/jdk/src/windows/hpi/include/monitor_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 implementation of Java monitors
- */
-
-#ifndef _JAVASOFT_WIN32_MONITOR_MD_H_
-#define _JAVASOFT_WIN32_MONITOR_MD_H_
-
-#include <windows.h>
-
-#include "threads_md.h"
-#include "mutex_md.h"
-
-#define SYS_MID_NULL ((sys_mon_t *) 0)
-
-typedef struct sys_mon {
- long atomic_count; /* Variable for atomic compare swap */
- HANDLE semaphore; /* Semaphore used for the contention */
- sys_thread_t *monitor_owner; /* Current owner of this monitor */
- long entry_count; /* Recursion depth */
- sys_thread_t *monitor_waiter; /* Monitor waiting queue head */
- long waiter_count; /* For debugging purpose */
-} sys_mon_t;
-
-#endif /* !_JAVASOFT_WIN32_MONITOR_MD_H_ */
--- a/jdk/src/windows/hpi/include/mutex_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 implementation of mutexes. Here we use critical sections as
- * our mutexes. We could have used mutexes, but mutexes are heavier
- * weight than critical sections. Mutexes and critical sections are
- * semantically identical, the only difference being that mutexes
- * can operate between processes (i.e. address spaces).
- *
- * It's worth noting that the Win32 functions supporting critical
- * sections do not provide any error information whatsoever (i.e.
- * all critical section routines return (void)).
- */
-
-#ifndef _JAVASOFT_WIN32_MUTEX_MD_H_
-#define _JAVASOFT_WIN32_MUTEX_MD_H_
-
-#include <windows.h>
-
-typedef CRITICAL_SECTION mutex_t;
-
-#define mutexInit(m) InitializeCriticalSection(m)
-#define mutexDestroy(m) DeleteCriticalSection(m)
-#define mutexLock(m) EnterCriticalSection(m)
-#define mutexUnlock(m) LeaveCriticalSection(m)
-
-#endif /* !_JAVASOFT_WIN32_MUTEX_MD_H_ */
--- a/jdk/src/windows/hpi/include/threads_md.h Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 1994, 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 implementation of Java threads
- */
-
-#ifndef _JAVASOFT_WIN32_THREADS_MD_H_
-#define _JAVASOFT_WIN32_THREADS_MD_H_
-
-#include <windows.h>
-
-#define N_TRACED_REGS 7
-
-#define SYS_THREAD_NULL ((sys_thread_t *) 0)
-
-/*
- * Machine dependent info in a sys_thread_t: Keep these values in
- * sync with the string array used by sysThreadDumpInfo() in threads_md.c!
- */
-typedef enum {
- FIRST_THREAD_STATE,
- RUNNABLE = FIRST_THREAD_STATE,
- SUSPENDED,
- MONITOR_WAIT,
- CONDVAR_WAIT,
- MONITOR_SUSPENDED,
- NUM_THREAD_STATES
-} thread_state_t;
-
-struct sys_mon;
-
-/*
- * Machine dependent thread data structure
- */
-typedef struct sys_thread {
- HANDLE handle; /* Win32 thread handle */
- unsigned long id; /* Win32 thread id */
- long regs[N_TRACED_REGS]; /* Registers */
- thread_state_t state; /* Current thread state */
- bool_t system_thread; /* TRUE if this is a system thread */
- bool_t interrupted; /* Shadow thread interruption */
- short suspend_flags;
- HANDLE interrupt_event; /* Event signaled on thread interrupt */
- struct sys_mon *wait_monitor; /* Monitor the thread is waiting for */
- struct sys_thread *next_waiter; /* Next thread in the waiting queue */
- struct sys_mon *enter_monitor; /* Monitor thread is waiting to enter */
- void (*start_proc)(void *); /* Thread start routine address */
- void *start_parm; /* Thread start routine parameter */
- struct sys_thread *next; /* Next thread in active thread queue */
- void *stack_ptr; /* Pointer into the stack segment */
- unsigned int last_sum;
- PNT_TIB nt_tib; /* Pointer to NT thread-local block */
-} sys_thread_t;
-
-#define MONITOR_WAIT_SUSPENDED 0x0001
-#define CONDVAR_WAIT_SUSPENDED 0x0002
-
-extern bool_t ThreadsInitialized;
-
-extern sys_mon_t *_sys_queue_lock;
-
-#define SYS_QUEUE_LOCK(self) sysMonitorEnter(self, _sys_queue_lock)
-#define SYS_QUEUE_LOCKED(self) sysMonitorEntered(self, _sys_queue_lock)
-#define SYS_QUEUE_UNLOCK(self) sysMonitorExit(self, _sys_queue_lock)
-#define SYS_QUEUE_NOTIFYALL(self) sysMonitorNotifyAll(self, _sys_queue_lock)
-#define SYS_QUEUE_WAIT(self) sysMonitorWait(self, _sys_queue_lock, \
- SYS_TIMEOUT_INFINITY)
-
-#endif /* !_JAVASOFT_WIN32_THREADS_MD_H_ */
--- a/jdk/src/windows/hpi/src/linker_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 1994, 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Maintains a list of currently loaded DLLs (Dynamic Link Libraries)
- * and their associated handles. Library names are case-insensitive.
- */
-
-#include <windows.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "hpi_impl.h"
-
-#include "path_md.h"
-
-/*
- * create a string for the JNI native function name by adding the
- * appropriate decorations.
- *
- * On Win32, "__stdcall" functions are exported differently, depending
- * on the compiler. In MSVC 4.0, they are decorated with a "_" in the
- * beginning, and @nnn in the end, where nnn is the number of bytes in
- * the arguments (in decimal). Borland C++ exports undecorated names.
- *
- * sysBuildFunName handles different encodings depending on the value
- * of encodingIndex. It returns 0 when handed an out-of-range
- * encodingIndex.
- */
-int
-sysBuildFunName(char *name, int nameMax, int args_size, int encodingIndex)
-{
- if (encodingIndex == 0) {
- /* For Microsoft MSVC 4.0 */
- char suffix[6]; /* This is enough since Java never has more than
- 256 words of arguments. */
- int nameLen;
- int i;
-
- sprintf(suffix, "@%d", args_size * 4);
-
- nameLen = strlen(name);
- if (nameLen >= nameMax - 7)
- return 1;
- for(i = nameLen; i > 0; i--)
- name[i] = name[i-1];
- name[0] = '_';
-
- sprintf(name + nameLen + 1, "%s", suffix);
- return 1;
- } else if (encodingIndex == 1)
- /* For Borland, etc. */
- return 1;
- else
- return 0;
-}
-
-/*
- * Build a machine dependent library name out of a path and file name.
- */
-void
-sysBuildLibName(char *holder, int holderlen, char *pname, char *fname)
-{
- const int pnamelen = pname ? strlen(pname) : 0;
- const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
-
- /* Quietly truncates on buffer overflow. Should be an error. */
- if (pnamelen + strlen(fname) + 10 > holderlen) {
- *holder = '\0';
- return;
- }
-
- if (pnamelen == 0) {
- sprintf(holder, "%s.dll", fname);
- } else if (c == ':' || c == '\\') {
- sprintf(holder, "%s%s.dll", pname, fname);
- } else {
- sprintf(holder, "%s\\%s.dll", pname, fname);
- }
-}
-
-void *
-sysLoadLibrary(const char * name, char *err_buf, int err_buflen)
-{
- void *result = LoadLibrary(name);
- if (result == NULL) {
- /* Error message is pretty lame, try to make a better guess. */
- long errcode = GetLastError();
- if (errcode == ERROR_MOD_NOT_FOUND) {
- strncpy(err_buf, "Can't find dependent libraries", err_buflen-2);
- err_buf[err_buflen-1] = '\0';
- } else {
- sysGetLastErrorString(err_buf, err_buflen);
- }
- }
- return result;
-}
-
-void sysUnloadLibrary(void *handle)
-{
- FreeLibrary(handle);
-}
-
-void * sysFindLibraryEntry(void *handle, const char *name)
-{
- return GetProcAddress(handle, name);
-}
--- a/jdk/src/windows/hpi/src/memory_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 1995, 2002, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Implementation of primitive memory allocation.
- *
- * The only thing machine dependent about this allocator is how it
- * initially finds all of the possible memory, and how it implements
- * mapChunk() and unmapChunk().
- *
- * This is all pretty simple stuff. It is not likely to be banged on
- * frequently enough to be a performance issue, unless the underlying
- * primitives are. Implementing things:
- *
- * HPI function Solaris "malloc" Win32
- * --------------------------------------------------------------------
- * sysMapMem() mmap() malloc() VirtualAlloc(...MEM_RESERVE...)
- * sysUnMapMem() munmap() free() VirtualFree(...MEM_RESERVE...)
- * sysCommitMem() no-op no-op VirtualAlloc(...MEM_COMMIT...)
- * sysDecommitMem() no-op no-op VirtualFree(...MEM_COMMIT...)
- *
- * Memory mapping is the default, but compiling with -DUSE_MALLOC gives
- * a system based on malloc().
- */
-
-#include <windows.h>
-#include <sys/types.h>
-
-#include "hpi_impl.h"
-
-static size_t
-roundUp(size_t n, size_t m)
-{
- return (n + m - 1) & ~(m - 1);
-}
-
-static size_t
-roundDown(size_t n, size_t m)
-{
- return n & ~(m - 1);
-}
-
-#define RESERVE_SIZE 65536 /* Memory is reserved in 64KB chunks */
-
-static size_t pageSize; /* Machine page size */
-
-void
-InitializeMem()
-{
- SYSTEM_INFO si;
-
- GetSystemInfo(&si);
- pageSize = si.dwPageSize;
-}
-
-/* HPI Functions: */
-
-/*
- * Map a range of virtual memory. Note that the size asked for here
- * is literally what the upper level has asked for. We need to do
- * any rounding, etc. here. If mapping fails return 0, otherwise
- * return the address of the base of the mapped memory.
- */
-void *
-sysMapMem(size_t requestedSize, size_t *mappedSize)
-{
- void *mappedAddr;
-
-#ifdef USE_MALLOC
- *mappedSize = roundUp(requestedSize, pageSize);
- mappedAddr = (void *)malloc(*mappedSize);
-#else
- *mappedSize = roundUp(requestedSize, RESERVE_SIZE);
- mappedAddr = VirtualAlloc(NULL, *mappedSize, MEM_RESERVE, PAGE_READWRITE);
-#endif
- if (mappedAddr != NULL) {
- Log3(2, "sysMapMem: 0x%x bytes at 0x%x (request: 0x%x bytes)\n",
- *mappedSize, mappedAddr, requestedSize);
- } else {
- Log1(2, "sysMapMem failed: (request: 0x%x bytes)\n", requestedSize);
- }
- return mappedAddr;
-}
-
-/*
- * Unmap a range of virtual memory. Note that the size asked for here
- * is literally what the upper level has asked for. We need to do any
- * rounding, etc. here. If unmapping fails return 0, otherwise return
- * the address of the base of the unmapped memory.
- */
-void *
-sysUnmapMem(void *requestedAddr, size_t requestedSize, size_t *unmappedSize)
-{
- void *unmappedAddr;
- int ret;
-
-#ifdef USE_MALLOC
- *unmappedSize = roundUp(requestedSize, pageSize);
- free(requestedAddr);
- ret = TRUE;
-#else
- *unmappedSize = roundUp(requestedSize, RESERVE_SIZE);
- ret = VirtualFree(requestedAddr, 0, MEM_RELEASE);
-#endif
- if (ret) {
- unmappedAddr = requestedAddr;
- Log4(2,
- "sysUnmapMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *unmappedSize, unmappedAddr, requestedSize, requestedAddr);
- } else {
- unmappedAddr = NULL;
- Log2(2, "sysUnmapMem failed: (request: 0x%x bytes at 0x%x)\n",
- requestedSize, requestedAddr);
- }
- return unmappedAddr;
-}
-
-/*
- * Commit/decommit backing store to a range of virtual memory. This range
- * needs not be identical to a mapped range, but must be a subset of one.
- * On Solaris, we remap the range to reserve swap for the space on
- * commit. We don't strictly need to do this, as Solaris will demand
- * page pages that we've mapped when we want to access them. But by
- * reserving swap we get reasonable error handling for free where we'd
- * otherwise end up getting a SIGBUS on a random write when we run out
- * of swap. It also emphasizes the general need for shared code to
- * postpone committing to mapped memory for as long as is feasible.
- * When Java really needs space (the thread stacks excepted), it will
- * soon write over it (heap, markbits), so we don't really get much from
- * demand paging.
- *
- * We do not validate that commitment requests cover already-mapped
- * memory, although in principle we could. The size asked for here
- * is what the upper level has asked for. We need to do any platform-
- * dependent rounding here.
- *
- * When you commit, you commit to the entire page (or whatever quantum
- * your O/S requires) containing the pointer, and return the beginning of
- * that page. When you decommit, you decommit starting at the next page
- * *up* from that containing the pointer, except that decommitting from
- * a pointer to the beginning of the page operates on that page.
- */
-
-/*
- * Return the address of the base of the newly committed memory, or 0
- * if committing failed.
- */
-void *
-sysCommitMem(void *requestedAddr, size_t requestedSize, size_t *committedSize)
-{
- void *committedAddr;
-
- *committedSize = roundUp(requestedSize, pageSize);
- committedAddr = VirtualAlloc(requestedAddr, *committedSize, MEM_COMMIT,
- PAGE_READWRITE);
- if (committedAddr != NULL) {
- Log4(2,
- "sysCommitMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *committedSize, committedAddr, requestedSize, requestedAddr);
- } else {
- Log2(2, "sysCommitMem failed: (request: 0x%x bytes at 0x%x)\n",
- requestedSize, requestedAddr);
- }
- return committedAddr;
-}
-
-/*
- * Return the address of the base of the newly decommitted memory, or 0
- * if decommitting failed.
- */
-void *
-sysDecommitMem(void *requestedAddr, size_t requestedSize,
- size_t *decommittedSize)
-{
- void *decommittedAddr;
-
- /*
- * We round the size down to a multiple of the page size and
- * round the address up. This ensures that we never decommit
- * more that we intend to.
- */
- *decommittedSize = roundDown(requestedSize, pageSize);
- decommittedAddr = (void *)roundUp((size_t)requestedAddr, pageSize);
-
- /*
- * If the rounded size is equal to zero we simply fail. Passing
- * 0 to VirtualFree seems to cause the entire region to be released,
- * which is definitely not what we want, since that probably means
- * that decommittedAddr is at the end of the current mapping which
- * may be the beginning of the next mapping.
- */
- if (*decommittedSize != 0 &&
- VirtualFree(decommittedAddr, *decommittedSize, MEM_DECOMMIT)) {
- Log4(2,
- "sysDecommitMem: 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *decommittedSize, decommittedAddr, requestedSize, requestedAddr);
- } else {
- Log4(2,
- "sysDecommitMem: failed 0x%x bytes at 0x%x (request: 0x%x bytes at 0x%x)\n",
- *decommittedSize, decommittedAddr, requestedSize, requestedAddr);
- decommittedAddr = NULL;
- }
- return decommittedAddr;
-}
-
-#define PAGED_HEAPS
-
-#ifdef PAGED_HEAPS
-
-/*
- * Allocate memory on an alignment boundary. Returns aligned
- * pointer to new memory. Use sysFreeBlock to free the block.
- *
- * sysAllocBlock() is similar to memalign(), except that it also
- * returns a pointer to the beginning of the block returned by the
- * OS, which must be used to deallocate the block. (On some OSes,
- * these two won't be the same.) sysAllocBlock() is also more
- * limited than memalign in that it can only be used to allocate
- * on particular alignments (PAGE_ALIGNMENT) and should be assumed
- * to round the sizes of allocated blocks up to multiples of the
- * alignment value (PAGE_ALIGNMENT*n bytes).
- *
- * Note that the use of VirtualAlloc on Win32 is closely tied in to
- * the decision for paged heap pages on Win32 to be 64K (that is,
- * PAGE_ALIGNMENT is 64K), a reasonable choice in any case.
- */
-void *
-sysAllocBlock(size_t size, void** allocHead)
-{
- void* alignedPtr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
- *allocHead = alignedPtr;
- return alignedPtr;
-}
-
-/*
- * Wrapper to free block allocated by sysMemAlign.
- */
-void
-sysFreeBlock(void *allocHead)
-{
- VirtualFree(allocHead, 0, MEM_RELEASE);
-}
-
-#endif /* PAGED_HEAPS */
-
-void * sysMalloc(size_t s)
-{
- if (s == 0)
- return malloc(1);
- return malloc(s);
-}
-
-void * sysRealloc(void *p, size_t s)
-{
- return realloc(p, s);
-}
-
-void sysFree(void *p)
-{
- if (p != NULL)
- free(p);
-}
-
-void * sysCalloc(size_t s1, size_t s2)
-{
- if (s1 == 0 || s2 == 0)
- return calloc(1, 1);
- return calloc(s1, s2);
-}
-
-char * sysStrdup(const char * string)
-{
- return strdup(string);
-}
--- a/jdk/src/windows/hpi/src/monitor_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,517 +0,0 @@
-/*
- * Copyright (c) 1994, 2002, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 implementation of Java monitors
- */
-
-#include <windows.h>
-
-#include "hpi_impl.h"
-
-#include "threads_md.h"
-#include "monitor_md.h"
-
-/*
- * Use this information to improve performance for single CPU machine.
- */
-static int systemIsMP;
-
-static mutex_t semaphore_init_mutex;
-static mutex_t *semaphore_init_mutex_p = NULL;
-/*
- * Create and initialize monitor. This can be called before threads have
- * been initialized.
- */
-int
-sysMonitorInit(sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- if (semaphore_init_mutex_p == NULL) {
- systemIsMP = sysGetSysInfo()->isMP;
- mutexInit(&semaphore_init_mutex);
- semaphore_init_mutex_p = &semaphore_init_mutex;
- }
-
- mid->atomic_count = -1; /* -1 for no thread, 0 means 1 thread */
- mid->semaphore = NULL; /* No semaphore until needed */
- mid->monitor_owner = SYS_THREAD_NULL;
- mid->entry_count = 0; /* Recursion count */
- mid->monitor_waiter = 0; /* First waiting thread */
- mid->waiter_count = 0; /* Count of waiting and wake-up thread */
-
- return SYS_OK;
-}
-
-/*
- * Free any system-dependent resources held by monitors. On Win32 this
- * means releasing the critical section (mutex) and condition variable
- * that are part of each monitor.
- */
-int
-sysMonitorDestroy(sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- CloseHandle(mid->semaphore);
-
- return SYS_OK;
-}
-
-static void initializeSemaphore(HANDLE *pSema)
-{
- mutexLock(semaphore_init_mutex_p);
- if (*pSema == NULL) {
- *pSema = CreateSemaphore(0,0,1,0);
- }
- mutexUnlock(semaphore_init_mutex_p);
-}
-
-/*
- * Take ownership of monitor. This can be called before threads have
- * been initialized, in which case we do nothing since locked monitors
- * are not yet needed.
-
- * The actual code is split into two functions, the assembler routine
- * handles the fast path, while the C routine handle the slow path,
- * including the lazy initialization of monitor semaphore.
- *
- * REMIND: It is EXTREMELY RISKY to change any of the code without
- * thorough understanding of the system, compiler and call convention.
- */
-
-static int __fastcall sysMonitorEnter2(sys_thread_t *self, sys_mon_t *mid)
-{
- if (mid->semaphore == NULL) {
- initializeSemaphore(&(mid->semaphore));
- if (mid->semaphore == NULL) {
- return SYS_NORESOURCE;
- }
- }
-
- self->enter_monitor = mid;
- if (profiler_on) {
- VM_CALL(monitorContendedEnter)(self, mid);
- }
- WaitForSingleObject(mid->semaphore, INFINITE);
- self->enter_monitor = NULL;
-
- mid->monitor_owner = self;
- mid->entry_count = 1;
-
- if (profiler_on) {
- VM_CALL(monitorContendedEntered)(self, mid);
- }
- return SYS_OK;
-}
-
-/*
- * The following assembler routine is highly compiler specific.
- * Because of the complexity, there is no debug error check.
- */
-
-#ifndef _WIN64
-int __cdecl
-sysMonitorEnter(sys_thread_t *self, sys_mon_t *mid)
-{
- __asm
- {
- mov edx, dword ptr [esp+8]; // load mid
- mov ecx, dword ptr [esp+4]; // load self
- mov eax, dword ptr [edx+8]; // load mid->monitor_owner
-
- cmp eax, ecx; // if ( self == mid->monitor_owner )
- je RECURSION; // goto RECURSION;
-
- mov eax, dword ptr [systemIsMP];
- test eax, eax;
- jne MPM;
-
- inc dword ptr [edx]; /* atomic increment mid->atomic_count */
- jne ACQUIRE_SEMAPHORE; /* if there is an owner already */
-
- mov dword ptr [edx+8], ecx; /* mid->monitor_owner = self */
- mov dword ptr [edx+12], 1; /* mid->entry_count = 1 */
- xor eax, eax; /* return SYS_OK */
- ret;
-
-MPM:
- lock inc dword ptr [edx]; /* atomic increment mid->atomic_count */
- jne ACQUIRE_SEMAPHORE; /* if there is an owner already */
-
- mov dword ptr [edx+8], ecx; /* mid->monitor_owner = self */
- mov dword ptr [edx+12], 1; /* mid->entry_count = 1 */
- xor eax, eax; /* return SYS_OK */
- ret;
-
-RECURSION:
- inc dword ptr [edx+12]; /* Increment mid->entry_count */
- xor eax, eax; /* return SYS_OK */
- ret;
-
-ACQUIRE_SEMAPHORE:
- /* The self is passed by ECX, mid is passed by EDX */
- jmp sysMonitorEnter2;
- }
-}
-#else
-int __cdecl
-sysMonitorEnter(sys_thread_t *self, sys_mon_t *mid)
-{
-return (SYS_NORESOURCE);
-}
-#endif
-
-/*
- * Return TRUE if this thread currently owns the monitor. This can be
- * called before threads have been initialized, in which case we always
- * return TRUE.
- */
-bool_t
-sysMonitorEntered(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
- sysAssert(self != 0);
- sysAssert(ThreadsInitialized);
-
- return (mid->monitor_owner == self);
-}
-
-/*
- * Release ownership of monitor. This can be called before threads have
- * been initialized, in which case we do nothing as locked monitors are
- * not yet needed.
- *
- * The actual code is split into two functions, the assembler routine
- * handles the fast path, while the C routine handle the slow path.
- *
- * REMIND: It is EXTREMELY RISKY to change any of the code without
- * thorough understanding of the system, compiler and call convention.
- */
-
-static int __fastcall
-sysMonitorExit2(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid->entry_count == 0);
- sysAssert(mid->atomic_count >= 0);
- sysAssert(mid->monitor_owner == 0);
-
- if (mid->semaphore == NULL) {
- initializeSemaphore(&(mid->semaphore));
- if (mid->semaphore == NULL) {
- return SYS_NORESOURCE;
- }
- }
-
- ReleaseSemaphore(mid->semaphore, 1, 0);
-
- if (profiler_on) {
- VM_CALL(monitorContendedExit)(self, mid);
- }
-
- return SYS_OK;
-}
-
-#ifndef _WIN64
-__declspec(naked) int __cdecl
-sysMonitorExit(sys_thread_t *self, sys_mon_t *mid)
-{
- __asm
- {
- mov edx, dword ptr [esp+8]; /* load mid */
- mov ecx, dword ptr [esp+4]; /* load self */
- mov eax, dword ptr [edx+8]; /* load mid->monitor_owner */
-
- cmp eax, ecx; /* if ( self != mid->monitor_owner ) */
- jne ERR_RET; /* goto ERROR_RET */
-
- dec dword ptr [edx+12]; /* dec mid->entry_count */
- jne OK_RET; /* entry_count != 0 */
-
- mov dword ptr [edx+8], 0; /* mid->monitor_owner = 0 */
-
- mov eax, dword ptr [systemIsMP];
- test eax, eax;
- jne MPM;
-
- dec dword ptr [edx]; /* atomic decrement mid->atomic_count */
- jge RELEASE_SEMAPHORE; /* if ( atomic_variable < 0 ) */
- xor eax, eax; /* return SYS_OK */
- ret;
-
-MPM:
- lock dec dword ptr [edx]; /* atomic decrement mid->atomic_count */
- jge RELEASE_SEMAPHORE; /* if ( atomic_variable < 0 ) */
-OK_RET:
- xor eax, eax;
- ret;
-
-ERR_RET:
- mov eax, 0FFFFFFFFH;
- ret;
-
-RELEASE_SEMAPHORE:
- jmp sysMonitorExit2; /* forwading call */
- }
-}
-#else
-int __cdecl
-sysMonitorExit(sys_thread_t *self, sys_mon_t *mid)
-{
-return (-1);
-}
-#endif
-
-/*
- * Notify single thread waiting on condition variable.
- */
-int
-sysMonitorNotify(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- if (mid->monitor_owner != self) {
- return SYS_ERR;
- }
-
- if (mid->monitor_waiter != SYS_THREAD_NULL)
- {
- sys_thread_t *thread = mid->monitor_waiter;
- mid->monitor_waiter = thread->next_waiter;
-
- thread->next_waiter = SYS_THREAD_NULL;
- thread->wait_monitor = SYS_MID_NULL;
-
- SetEvent(thread->interrupt_event);
- }
-
- return SYS_OK;
-}
-
-/*
- * Notify all threads waiting on condition variable.
- */
-int
-sysMonitorNotifyAll(sys_thread_t *self, sys_mon_t *mid)
-{
- sysAssert(mid != SYS_MID_NULL);
-
- if (mid->monitor_owner != self) {
- return SYS_ERR;
- }
-
- while (mid->monitor_waiter != SYS_THREAD_NULL)
- {
- sys_thread_t *thread = mid->monitor_waiter;
- mid->monitor_waiter = thread->next_waiter;
-
- thread->next_waiter = SYS_THREAD_NULL;
- thread->wait_monitor = SYS_MID_NULL;
-
- SetEvent(thread->interrupt_event);
- }
-
- return SYS_OK;
-}
-
-/*
- * Atomically drop mutex and wait for notification.
- */
-int
-sysMonitorWait(sys_thread_t *self, sys_mon_t *mid, jlong millis)
-{
- long entry_count;
- DWORD timeout;
-
- sysAssert(mid != SYS_MID_NULL);
-
- if (mid->monitor_owner != self) {
- return SYS_ERR;
- }
-
- if ( sysThreadIsInterrupted(self, 1) ) {
- return SYS_INTRPT;
- }
-
- entry_count = mid->entry_count;
- mid->entry_count = 1;
-
- self->wait_monitor = mid;
- self->next_waiter = 0;
-
- if (mid->monitor_waiter == 0) {
- mid->monitor_waiter = self;
- } else {
- sys_thread_t *thread = mid->monitor_waiter;
- while (thread->next_waiter != 0) {
- thread = thread->next_waiter;
- }
- thread->next_waiter = self;
- }
-
- if ( millis == SYS_TIMEOUT_INFINITY ||
- millis > (jlong)((unsigned int)0xffffffff) ) {
- timeout = INFINITE;
- } else {
- timeout = (long) millis;
- }
-
- mid->waiter_count++;
-
- sysMonitorExit(self, mid);
-
- self->state = CONDVAR_WAIT;
-
- WaitForSingleObject(self->interrupt_event, timeout);
-
- self->state = RUNNABLE;
-
- sysMonitorEnter(self, mid);
-
- mid->waiter_count--;
-
- mid->entry_count = entry_count;
- /* Reset event anyway, prevent racing the timeout */
- ResetEvent(self->interrupt_event);
-
- if (self->wait_monitor != SYS_MID_NULL) {
- sys_thread_t *head;
-
- sysAssert( self->wait_monitor == mid );
- sysAssert( mid->monitor_waiter != SYS_THREAD_NULL );
-
- head = mid->monitor_waiter;
-
- if (head == self) {
- mid->monitor_waiter = self->next_waiter;
- } else {
- while (head != SYS_THREAD_NULL) {
- if (head->next_waiter == self) {
- head->next_waiter = self->next_waiter;
- break;
- } else {
- head = head->next_waiter;
- }
- }
- }
-
- self->next_waiter = SYS_THREAD_NULL;
- self->wait_monitor = SYS_MID_NULL;
- }
-
- if ( sysThreadIsInterrupted(self, 1) ) {
- return SYS_INTRPT;
- }
-
- return SYS_OK;
-}
-
-static int
-dumpWaitingQueue(sys_thread_t *tid, sys_thread_t **waiters, int sz)
-{
- int n;
- for (n = 0; tid != 0; tid = tid->next_waiter, n++, sz--) {
- if (sz > 0) {
- waiters[n] = tid;
- }
- }
- return n;
-}
-
-typedef struct {
- sys_mon_t *mid;
- sys_thread_t **waiters;
- int sz;
- int nwaiters;
-} wait_info;
-
-static int
-findWaitersHelper(sys_thread_t *t, void *arg)
-{
- wait_info * winfo = (wait_info *) arg;
- if (t->enter_monitor == winfo->mid) {
- if (winfo->sz > 0) {
- winfo->waiters[winfo->nwaiters] = t;
- }
- winfo->sz--;
- winfo->nwaiters++;
- }
- return SYS_OK;
-}
-
-int
-sysMonitorGetInfo(sys_mon_t *mid, sys_mon_info *info)
-{
- wait_info winfo;
-
- sysAssert(mid != SYS_MID_NULL);
- info->owner = mid->monitor_owner;
- if (mid->monitor_owner) {
- info->entry_count = mid->entry_count;
- }
-
- winfo.mid = mid;
- winfo.nwaiters = 0;
- winfo.waiters = info->monitor_waiters;
- winfo.sz = info->sz_monitor_waiters;
- sysThreadEnumerateOver(findWaitersHelper, (void *) &winfo);
- info->n_monitor_waiters = winfo.nwaiters;
-
- info->n_condvar_waiters = dumpWaitingQueue(mid->monitor_waiter,
- info->condvar_waiters,
- info->sz_condvar_waiters);
-
- return SYS_OK;
-}
-
-/*
- * Return size of system-dependent monitor structure.
- */
-size_t
-sysMonitorSizeof(void)
-{
- return sizeof(struct sys_mon);
-}
-
-
-/*
- * Return true if there are any threads inside this monitor.
- */
-bool_t
-sysMonitorInUse(sys_mon_t *mid)
-{
- return (mid->atomic_count != -1
- || mid->waiter_count != 0
- || mid->monitor_owner != SYS_THREAD_NULL
- || mid->monitor_waiter != SYS_THREAD_NULL);
-}
-
-
-sys_thread_t *
-sysMonitorOwner(sys_mon_t *mon)
-{
- return mon->monitor_owner;
-}
--- a/jdk/src/windows/hpi/src/path_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Machine dependent path name and file name manipulation code
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#include <windows.h>
-#include <errno.h>
-
-#include "hpi_impl.h"
-
-#undef DEBUG_PATH /* Define this to debug path code */
-
-#define isfilesep(c) ((c) == '/' || (c) == '\\')
-#define islb(c) (IsDBCSLeadByte((BYTE)(c)))
-
-
-/* Convert a pathname to native format. On win32, this involves forcing all
- separators to be '\\' rather than '/' (both are legal inputs, but Win95
- sometimes rejects '/') and removing redundant separators. The input path is
- assumed to have been converted into the character encoding used by the local
- system. Because this might be a double-byte encoding, care is taken to
- treat double-byte lead characters correctly.
-
- This procedure modifies the given path in place, as the result is never
- longer than the original. There is no error return; this operation always
- succeeds. */
-
-char *
-sysNativePath(char *path)
-{
- char *src = path, *dst = path, *end = path;
- char *colon = NULL; /* If a drive specifier is found, this will
- point to the colon following the drive
- letter */
-
- /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
- sysAssert(!islb('/') && !islb('\\') && !islb(':'));
-
- /* Check for leading separators */
- while (isfilesep(*src)) src++;
- if (isalpha(*src) && !islb(*src) && src[1] == ':') {
- /* Remove leading separators if followed by drive specifier. This
- hack is necessary to support file URLs containing drive
- specifiers (e.g., "file://c:/path"). As a side effect,
- "/c:/path" can be used as an alternative to "c:/path". */
- *dst++ = *src++;
- colon = dst;
- *dst++ = ':'; src++;
- } else {
- src = path;
- if (isfilesep(src[0]) && isfilesep(src[1])) {
- /* UNC pathname: Retain first separator; leave src pointed at
- second separator so that further separators will be collapsed
- into the second separator. The result will be a pathname
- beginning with "\\\\" followed (most likely) by a host name. */
- src = dst = path + 1;
- path[0] = '\\'; /* Force first separator to '\\' */
- }
- }
-
- end = dst;
-
- /* Remove redundant separators from remainder of path, forcing all
- separators to be '\\' rather than '/'. Also, single byte space
- characters are removed from the end of the path because those
- are not legal ending characters on this operating system.
- */
- while (*src != '\0') {
- if (isfilesep(*src)) {
- *dst++ = '\\'; src++;
- while (isfilesep(*src)) src++;
- if (*src == '\0') { /* Check for trailing separator */
- end = dst;
- if (colon == dst - 2) break; /* "z:\\" */
- if (dst == path + 1) break; /* "\\" */
- if (dst == path + 2 && isfilesep(path[0])) {
- /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
- beginning of a UNC pathname. Even though it is not, by
- itself, a valid UNC pathname, we leave it as is in order
- to be consistent with the path canonicalizer as well
- as the win32 APIs, which treat this case as an invalid
- UNC pathname rather than as an alias for the root
- directory of the current drive. */
- break;
- }
- end = --dst; /* Path does not denote a root directory, so
- remove trailing separator */
- break;
- }
- end = dst;
- } else {
- if (islb(*src)) { /* Copy a double-byte character */
- *dst++ = *src++;
- if (*src) {
- *dst++ = *src++;
- }
- end = dst;
- } else { /* Copy a single-byte character */
- char c = *src++;
- *dst++ = c;
- /* Space is not a legal ending character */
- if (c != ' ')
- end = dst;
- }
- }
- }
-
- *end = '\0';
-
- /* For "z:", add "." to work around a bug in the C runtime library */
- if (colon == dst - 1) {
- path[2] = '.';
- path[3] = '\0';
- }
-
-#ifdef DEBUG_PATH
- jio_fprintf(stderr, "sysNativePath: %s\n", path);
-#endif DEBUG_PATH
- return path;
-}
--- a/jdk/src/windows/hpi/src/socket_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,537 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <windef.h>
-#include <winsock.h>
-
-#include "hpi_impl.h"
-
-#include "mutex_md.h"
-
-struct sockaddr;
-
-#define FN_RECV 0
-#define FN_SEND 1
-#define FN_LISTEN 2
-#define FN_BIND 3
-#define FN_ACCEPT 4
-#define FN_RECVFROM 5
-#define FN_SENDTO 6
-#define FN_SELECT 7
-#define FN_CONNECT 8
-#define FN_CLOSESOCKET 9
-#define FN_SHUTDOWN 10
-#define FN_GETHOSTNAME 11
-#define FN_GETHOSTBYADDR 12
-#define FN_GETHOSTBYNAME 13
-#define FN_HTONS 14
-#define FN_HTONL 15
-#define FN_NTOHS 16
-#define FN_NTOHL 17
-#define FN_GETSOCKOPT 18
-#define FN_SETSOCKOPT 19
-#define FN_GETPROTOBYNAME 20
-#define FN_GETSOCKNAME 21
-#define FN_SOCKET 22
-#define FN_WSASENDDISCONNECT 23
-#define FN_SOCKETAVAILABLE 24
-
-static int (PASCAL FAR *sockfnptrs[])() =
- {NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- };
-
-static bool_t sockfnptrs_initialized = FALSE;
-static mutex_t sockFnTableMutex;
-
-/* is Winsock2 loaded? better to be explicit than to rely on sockfnptrs */
-static bool_t winsock2Available = FALSE;
-
-/* Winsock2 options at the IPPROTO_IP level
- We need the following translation in order to deal with the multiple
- definitions for IPPROTO_IP level options in different winsock versions.
-
-in winsock.h vs. ws2tcpip.h
-#define IP_OPTIONS 1 1
-#define IP_MULTICAST_IF 2 9
-#define IP_MULTICAST_TTL 3 10
-#define IP_MULTICAST_LOOP 4 11
-#define IP_ADD_MEMBERSHIP 5 12
-#define IP_DROP_MEMBERSHIP 6 13
-#define IP_TTL 7 4
-#define IP_TOS 8 3
-#define IP_DONTFRAGMENT 9 14
-*/
-static int IPPROTO_OPTIONS[] = {-1, 1, 9, 10, 11, 12, 13, 4, 3, 14};
-
-/* IMPORTANT: whenever possible, we want to use Winsock2 (ws2_32.dll)
- * instead of Winsock (wsock32.dll). Other than the fact that it is
- * newer, less buggy and faster than Winsock, Winsock2 lets us to work
- * around the following problem:
- *
- * Generally speaking, it is important to shutdown a socket before
- * closing it, since failing to do so can sometimes result in a TCP
- * RST (abortive close) which is disturbing to the peer of the
- * connection.
- *
- * The Winsock way to shutdown a socket is the Berkeley call
- * shutdown(). We do not want to call it on Win95, since it
- * sporadically leads to an OS crash in IFS_MGR.VXD. Complete hull
- * breach. Blue screen. Ugly.
- *
- * So, in initSockTable we look for Winsock 2, and if we find it we
- * assign wsassendisconnectfn function pointer. When we close, we
- * first check to see if it's bound, and if it is, we call it. Winsock
- * 2 will always be there on NT, and we recommend that win95 user
- * install it.
- *
- * - br 10/11/97
- */
-
-static void
-initSockFnTable() {
- int (PASCAL FAR* WSAStartupPtr)(WORD, LPWSADATA);
- WSADATA wsadata;
- OSVERSIONINFO info;
-
- mutexInit(&sockFnTableMutex);
- mutexLock(&sockFnTableMutex);
- if (sockfnptrs_initialized == FALSE) {
- HANDLE hWinsock;
-
- /* try to load Winsock2, and if that fails, load Winsock */
- hWinsock = LoadLibrary("ws2_32.dll");
- if (hWinsock == NULL) {
- hWinsock = LoadLibrary("wsock32.dll");
- winsock2Available = FALSE;
- } else {
- winsock2Available = TRUE;
- }
-
- if (hWinsock == NULL) {
- VM_CALL(jio_fprintf)(stderr, "Could not load Winsock 1 or 2 (error: %d)\n",
- GetLastError());
- }
-
- /* If we loaded a DLL, then we might as well initialize it. */
- WSAStartupPtr = (int (PASCAL FAR *)(WORD, LPWSADATA))
- GetProcAddress(hWinsock, "WSAStartup");
- if (WSAStartupPtr(MAKEWORD(1,1), &wsadata) != 0) {
- VM_CALL(jio_fprintf)(stderr, "Could not initialize Winsock\n");
- }
-
- sockfnptrs[FN_RECV]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "recv");
- sockfnptrs[FN_SEND]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "send");
- sockfnptrs[FN_LISTEN]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "listen");
- sockfnptrs[FN_BIND]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "bind");
- sockfnptrs[FN_ACCEPT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "accept");
- sockfnptrs[FN_RECVFROM]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "recvfrom");
- sockfnptrs[FN_SENDTO]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "sendto");
- sockfnptrs[FN_SELECT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "select");
- sockfnptrs[FN_CONNECT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "connect");
- sockfnptrs[FN_CLOSESOCKET]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "closesocket");
- /* we don't use this */
- sockfnptrs[FN_SHUTDOWN]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "shutdown");
- sockfnptrs[FN_GETHOSTNAME]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "gethostname");
- sockfnptrs[FN_GETHOSTBYADDR]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "gethostbyaddr");
- sockfnptrs[FN_GETHOSTBYNAME]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "gethostbyname");
- sockfnptrs[FN_HTONS]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "htons");
- sockfnptrs[FN_HTONL]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "htonl");
- sockfnptrs[FN_NTOHS]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "ntohs");
- sockfnptrs[FN_NTOHL]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "ntohl");
- sockfnptrs[FN_GETSOCKOPT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "getsockopt");
- sockfnptrs[FN_SETSOCKOPT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "setsockopt");
- sockfnptrs[FN_GETPROTOBYNAME]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "getprotobyname");
- sockfnptrs[FN_GETSOCKNAME]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "getsockname");
-
- sockfnptrs[FN_SOCKET]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock, "socket");
- /* in winsock 1, this will simply be 0 */
- sockfnptrs[FN_WSASENDDISCONNECT]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock,
- "WSASendDisconnect");
- sockfnptrs[FN_SOCKETAVAILABLE]
- = (int (PASCAL FAR *)())GetProcAddress(hWinsock,
- "ioctlsocket");
- }
-
- sysAssert(sockfnptrs[FN_RECV] != NULL);
- sysAssert(sockfnptrs[FN_SEND] != NULL);
- sysAssert(sockfnptrs[FN_LISTEN] != NULL);
- sysAssert(sockfnptrs[FN_BIND] != NULL);
- sysAssert(sockfnptrs[FN_ACCEPT] != NULL);
- sysAssert(sockfnptrs[FN_RECVFROM] != NULL);
- sysAssert(sockfnptrs[FN_SENDTO] != NULL);
- sysAssert(sockfnptrs[FN_SELECT] != NULL);
- sysAssert(sockfnptrs[FN_CONNECT] != NULL);
- sysAssert(sockfnptrs[FN_CLOSESOCKET] != NULL);
- sysAssert(sockfnptrs[FN_SHUTDOWN] != NULL);
- sysAssert(sockfnptrs[FN_GETHOSTNAME] != NULL);
- sysAssert(sockfnptrs[FN_GETHOSTBYADDR] != NULL);
- sysAssert(sockfnptrs[FN_GETHOSTBYNAME] != NULL);
- sysAssert(sockfnptrs[FN_HTONS] != NULL);
- sysAssert(sockfnptrs[FN_HTONL] != NULL);
- sysAssert(sockfnptrs[FN_NTOHS] != NULL);
- sysAssert(sockfnptrs[FN_NTOHL] != NULL);
- sysAssert(sockfnptrs[FN_GETSOCKOPT] != NULL);
- sysAssert(sockfnptrs[FN_SETSOCKOPT] != NULL);
- sysAssert(sockfnptrs[FN_GETPROTOBYNAME] != NULL);
- sysAssert(sockfnptrs[FN_GETSOCKNAME] != NULL);
- sysAssert(sockfnptrs[FN_SOCKET] != NULL);
-
- if (winsock2Available) {
- sysAssert(sockfnptrs[FN_WSASENDDISCONNECT] != NULL);
- }
-
- sysAssert(sockfnptrs[FN_SOCKETAVAILABLE] != NULL);
-
- sockfnptrs_initialized = TRUE;
- mutexUnlock(&sockFnTableMutex);
-}
-
-/*
- * If we get a nonnull function pointer it might still be the case
- * that some other thread is in the process of initializing the socket
- * function pointer table, but our pointer should still be good.
- */
-int
-sysListen(int fd, int count) {
- int (PASCAL FAR *listenfn)();
- if ((listenfn = sockfnptrs[FN_LISTEN]) == NULL) {
- initSockFnTable();
- listenfn = sockfnptrs[FN_LISTEN];
- }
- sysAssert(sockfnptrs_initialized == TRUE && listenfn != NULL);
- return (*listenfn)(fd, (long)count);
-}
-
-int
-sysConnect(int fd, struct sockaddr *name, int namelen) {
- int (PASCAL FAR *connectfn)();
- if ((connectfn = sockfnptrs[FN_CONNECT]) == NULL) {
- initSockFnTable();
- connectfn = sockfnptrs[FN_CONNECT];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(connectfn != NULL);
- return (*connectfn)(fd, name, namelen);
-}
-
-int
-sysBind(int fd, struct sockaddr *name, int namelen) {
- int (PASCAL FAR *bindfn)();
- if ((bindfn = sockfnptrs[FN_BIND]) == NULL) {
- initSockFnTable();
- bindfn = sockfnptrs[FN_BIND];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(bindfn != NULL);
- return (*bindfn)(fd, name, namelen);
-}
-
-int
-sysAccept(int fd, struct sockaddr *name, int *namelen) {
- int (PASCAL FAR *acceptfn)();
- if ((acceptfn = sockfnptrs[FN_ACCEPT]) == NULL) {
- initSockFnTable();
- acceptfn = sockfnptrs[FN_ACCEPT];
- }
- sysAssert(sockfnptrs_initialized == TRUE && acceptfn != NULL);
- return (*acceptfn)(fd, name, namelen);
-}
-
-int
-sysRecvFrom(int fd, char *buf, int nBytes,
- int flags, struct sockaddr *from, int *fromlen) {
- int (PASCAL FAR *recvfromfn)();
- if ((recvfromfn = sockfnptrs[FN_RECVFROM]) == NULL) {
- initSockFnTable();
- recvfromfn = sockfnptrs[FN_RECVFROM];
- }
- sysAssert(sockfnptrs_initialized == TRUE && recvfromfn != NULL);
- return (*recvfromfn)(fd, buf, nBytes, flags, from, fromlen);
-}
-
-int
-sysSendTo(int fd, char *buf, int len,
- int flags, struct sockaddr *to, int tolen) {
- int (PASCAL FAR *sendtofn)();
- if ((sendtofn = sockfnptrs[FN_SENDTO]) == NULL) {
- initSockFnTable();
- sendtofn = sockfnptrs[FN_SENDTO];
- }
- sysAssert(sockfnptrs_initialized == TRUE && sendtofn != NULL);
- return (*sendtofn)(fd, buf, len, flags, to, tolen);
-}
-
-int
-sysRecv(int fd, char *buf, int nBytes, int flags) {
- int (PASCAL FAR *recvfn)();
- if ((recvfn = sockfnptrs[FN_RECV]) == NULL) {
- initSockFnTable();
- recvfn = sockfnptrs[FN_RECV];
- }
- sysAssert(sockfnptrs_initialized == TRUE && recvfn != NULL);
- return (*recvfn)(fd, buf, nBytes, flags);
-}
-
-int
-sysSend(int fd, char *buf, int nBytes, int flags) {
- int (PASCAL FAR *sendfn)();
- if ((sendfn = sockfnptrs[FN_SEND]) == NULL) {
- initSockFnTable();
- sendfn = sockfnptrs[FN_SEND];
- }
- sysAssert(sockfnptrs_initialized == TRUE && sendfn != NULL);
- return (*sendfn)(fd, buf, nBytes, flags);
-}
-
-
-int
-sysGetHostName(char *hostname, int namelen) {
- int (PASCAL FAR *fn)();
- if ((fn = sockfnptrs[FN_GETHOSTNAME]) == NULL) {
- initSockFnTable();
- fn = sockfnptrs[FN_GETHOSTNAME];
- }
- sysAssert(sockfnptrs_initialized == TRUE && fn != NULL);
- return (*fn)(hostname, namelen);
-}
-
-struct hostent *
-sysGetHostByAddr(const char *hostname, int len, int type) {
- struct hostent * (PASCAL FAR *fn)();
- if ((fn = (struct hostent * (PASCAL FAR *)()) sockfnptrs[FN_GETHOSTBYADDR]) == NULL) {
- initSockFnTable();
- fn = (struct hostent * (PASCAL FAR *)()) sockfnptrs[FN_GETHOSTBYADDR];
- }
- sysAssert(sockfnptrs_initialized == TRUE && fn != NULL);
- return (*fn)(hostname, len, type);
-}
-
-struct hostent *
-sysGetHostByName(char *hostname) {
- struct hostent * (PASCAL FAR *fn)();
- if ((fn = (struct hostent * (PASCAL FAR *)()) sockfnptrs[FN_GETHOSTBYNAME]) == NULL) {
- initSockFnTable();
- fn = (struct hostent * (PASCAL FAR *)()) sockfnptrs[FN_GETHOSTBYNAME];
- }
- sysAssert(sockfnptrs_initialized == TRUE && fn != NULL);
- return (*fn)(hostname);
-}
-
-int
-sysSocket(int domain, int type, int protocol) {
- int sock;
- int (PASCAL FAR *socketfn)();
- if ((socketfn = sockfnptrs[FN_SOCKET]) == NULL) {
- initSockFnTable();
- socketfn = sockfnptrs[FN_SOCKET];
- }
- sysAssert(sockfnptrs_initialized == TRUE && socketfn != NULL);
- sock = (*socketfn)(domain, type, protocol);
- if (sock != INVALID_SOCKET) {
- SetHandleInformation((HANDLE)(uintptr_t)sock, HANDLE_FLAG_INHERIT, FALSE);
- }
- return sock;
-}
-
-int sysSocketShutdown(int fd, int how) {
- if (fd > 0) {
- int (PASCAL FAR *shutdownfn)();
- if ((shutdownfn = sockfnptrs[FN_SHUTDOWN]) == NULL) {
- initSockFnTable();
- shutdownfn = sockfnptrs[FN_SHUTDOWN];
- }
- /* At this point we are guaranteed the sockfnptrs are initialized */
- sysAssert(sockfnptrs_initialized == TRUE && shutdownfn != NULL);
- (void) (*shutdownfn)(fd, how);
- }
-return TRUE;
-}
-
-/*
- * This function is carefully designed to work around a bug in Windows
- * 95's networking winsock. Please see the beginning of this file for
- * a complete description of the problem.
- */
-int sysSocketClose(int fd) {
-
- if (fd > 0) {
- int (PASCAL FAR *closesocketfn)();
- int (PASCAL FAR *wsasenddisconnectfn)();
- int dynamic_ref = -1;
-
- if ((closesocketfn = sockfnptrs[FN_CLOSESOCKET]) == NULL) {
- initSockFnTable();
- }
- /* At this point we are guaranteed the sockfnptrs are initialized */
- sysAssert(sockfnptrs_initialized == TRUE);
-
- closesocketfn = sockfnptrs[FN_CLOSESOCKET];
- sysAssert(closesocketfn != NULL);
-
- if (winsock2Available) {
- struct linger l;
- int len = sizeof(l);
-
- if (sysGetSockOpt(fd, SOL_SOCKET, SO_LINGER, (char *)&l, &len) == 0) {
- if (l.l_onoff == 0) {
- wsasenddisconnectfn = sockfnptrs[FN_WSASENDDISCONNECT];
- (*wsasenddisconnectfn)(fd, NULL);
- }
- }
- }
- (void) (*closesocketfn)(fd);
- }
- return TRUE;
-}
-
-/*
- * Poll the fd for reading for timeout ms. Returns 1 if something's
- * ready, 0 if it timed out, -1 on error, -2 if interrupted (although
- * interruption isn't implemented yet). Timeout in milliseconds. */
-int
-sysTimeout(int fd, long timeout) {
- int res;
- fd_set tbl;
- struct timeval t;
- int (PASCAL FAR *selectfn)();
-
- t.tv_sec = timeout / 1000;
- t.tv_usec = (timeout % 1000) * 1000;
- FD_ZERO(&tbl);
- FD_SET(fd, &tbl);
-
- if ((selectfn = sockfnptrs[FN_SELECT]) == NULL) {
- initSockFnTable();
- selectfn = sockfnptrs[FN_SELECT];
- }
- sysAssert(sockfnptrs_initialized == TRUE && selectfn != NULL);
- res = (*selectfn)(fd + 1, &tbl, 0, 0, &t);
- return res;
-}
-
-long
-sysSocketAvailable(int fd, jint *pbytes)
-{
- int (PASCAL FAR *socketfn)();
- if ((socketfn = sockfnptrs[FN_SOCKETAVAILABLE]) == NULL) {
- initSockFnTable();
- socketfn = sockfnptrs[FN_SOCKETAVAILABLE];
- }
- sysAssert(sockfnptrs_initialized == TRUE && socketfn != NULL);
- return (*socketfn)(fd, FIONREAD, pbytes);
-}
-
-int
-sysGetSockName(int fd, struct sockaddr *name, int *namelen) {
- int (PASCAL FAR *getsocknamefn)();
- if ((getsocknamefn = sockfnptrs[FN_GETSOCKNAME]) == NULL) {
- initSockFnTable();
- getsocknamefn = sockfnptrs[FN_GETSOCKNAME];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(getsocknamefn != NULL);
- return (*getsocknamefn)(fd, name, namelen);
-}
-
-int
-sysGetSockOpt(int fd, int level, int optname, char *optval, int *optlen ) {
- int (PASCAL FAR *getsockoptfn)();
- if ((getsockoptfn = sockfnptrs[FN_GETSOCKOPT]) == NULL) {
- initSockFnTable();
- getsockoptfn = sockfnptrs[FN_GETSOCKOPT];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(getsockoptfn != NULL);
-
- /* We need the following translation in order to deal with the multiple
- definitions for IPPROTO_IP level options in different winsock versions
- */
- if (winsock2Available && level == IPPROTO_IP &&
- optname >= IP_OPTIONS && optname <= IP_DONTFRAGMENT) {
- optname = IPPROTO_OPTIONS[optname];
- }
- return (*getsockoptfn)(fd, level, optname, optval, optlen);
-}
-
-int
-sysSetSockOpt(int fd, int level, int optname, const char *optval, int optlen ) {
- int (PASCAL FAR *setsockoptfn)();
- if ((setsockoptfn = sockfnptrs[FN_SETSOCKOPT]) == NULL) {
- initSockFnTable();
- setsockoptfn = sockfnptrs[FN_SETSOCKOPT];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(setsockoptfn != NULL);
-
- /* We need the following translation in order to deal with the multiple
- definitions for IPPROTO_IP level options in different winsock versions
- */
- if (winsock2Available && level == IPPROTO_IP &&
- optname >= IP_OPTIONS && optname <= IP_DONTFRAGMENT) {
- optname = IPPROTO_OPTIONS[optname];
- }
-
- return (*setsockoptfn)(fd, level, optname, optval, optlen);
-}
-
-struct protoent *
-sysGetProtoByName(char *name) {
- struct protoent * (PASCAL FAR *getprotobynamefn)();
- if ((getprotobynamefn = (struct protoent * (PASCAL FAR *)()) sockfnptrs[FN_GETPROTOBYNAME]) == NULL) {
- initSockFnTable();
- getprotobynamefn = (struct protoent * (PASCAL FAR *)()) sockfnptrs[FN_GETPROTOBYNAME];
- }
- sysAssert(sockfnptrs_initialized == TRUE);
- sysAssert(getprotobynamefn != NULL);
- return (*getprotobynamefn)(name);
-}
--- a/jdk/src/windows/hpi/src/sys_api_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
-/*
- * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <io.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <limits.h>
-
-#include "hpi_impl.h"
-
-#include "path_md.h"
-
-static int MAX_INPUT_EVENTS = 2000;
-
-int
-sysOpen(const char *path, int oflag, int mode)
-{
- char pathbuf[MAX_PATH];
-
- if (strlen(path) > MAX_PATH - 1) {
- errno = ENAMETOOLONG;
- return -1;
- }
- return open(sysNativePath(strcpy(pathbuf, path)),
- oflag | O_BINARY | O_NOINHERIT, mode);
-}
-
-
-static int
-nonSeekAvailable(int, long *);
-static int
-stdinAvailable(int, long *);
-
-int
-sysAvailable(int fd, jlong *pbytes) {
- jlong cur, end;
- struct _stati64 stbuf64;
-
- if (_fstati64(fd, &stbuf64) >= 0) {
- int mode = stbuf64.st_mode;
- if (S_ISCHR(mode) || S_ISFIFO(mode)) {
- int ret;
- long lpbytes;
- if (fd == 0) {
- ret = stdinAvailable(fd, &lpbytes);
- } else {
- ret = nonSeekAvailable(fd, &lpbytes);
- }
- (*pbytes) = (jlong)(lpbytes);
- return ret;
- }
- if ((cur = _lseeki64(fd, 0L, SEEK_CUR)) == -1) {
- return FALSE;
- } else if ((end = _lseeki64(fd, 0L, SEEK_END)) == -1) {
- return FALSE;
- } else if (_lseeki64(fd, cur, SEEK_SET) == -1) {
- return FALSE;
- }
- *pbytes = end - cur;
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static int
-nonSeekAvailable(int fd, long *pbytes) {
- /* This is used for available on non-seekable devices
- * (like both named and anonymous pipes, such as pipes
- * connected to an exec'd process).
- * Standard Input is a special case.
- *
- */
- HANDLE han;
-
- if ((han = (HANDLE) _get_osfhandle(fd)) == (HANDLE)(-1)) {
- return FALSE;
- }
-
- if (! PeekNamedPipe(han, NULL, 0, NULL, pbytes, NULL)) {
- /* PeekNamedPipe fails when at EOF. In that case we
- * simply make *pbytes = 0 which is consistent with the
- * behavior we get on Solaris when an fd is at EOF.
- * The only alternative is to raise an Exception,
- * which isn't really warranted.
- */
- if (GetLastError() != ERROR_BROKEN_PIPE) {
- return FALSE;
- }
- *pbytes = 0;
- }
- return TRUE;
-}
-
-static int
-stdinAvailable(int fd, long *pbytes) {
- HANDLE han;
- DWORD numEventsRead = 0; /* Number of events read from buffer */
- DWORD numEvents = 0; /* Number of events in buffer */
- DWORD i = 0; /* Loop index */
- DWORD curLength = 0; /* Position marker */
- DWORD actualLength = 0; /* Number of bytes readable */
- BOOL error = FALSE; /* Error holder */
- INPUT_RECORD *lpBuffer; /* Pointer to records of input events */
-
- if ((han = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
- return FALSE;
- }
-
- /* Construct an array of input records in the console buffer */
- error = GetNumberOfConsoleInputEvents(han, &numEvents);
- if (error == 0) {
- return nonSeekAvailable(fd, pbytes);
- }
-
- /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
- if (numEvents > MAX_INPUT_EVENTS) {
- numEvents = MAX_INPUT_EVENTS;
- }
-
- lpBuffer = sysMalloc(numEvents * sizeof(INPUT_RECORD));
- if (lpBuffer == NULL) {
- return FALSE;
- }
-
- error = PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
- if (error == 0) {
- sysFree(lpBuffer);
- return FALSE;
- }
-
- /* Examine input records for the number of bytes available */
- for(i=0; i<numEvents; i++) {
- if (lpBuffer[i].EventType == KEY_EVENT) {
- KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
- &(lpBuffer[i].Event);
- if (keyRecord->bKeyDown == TRUE) {
- CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
- curLength++;
- if (*keyPressed == '\r')
- actualLength = curLength;
- }
- }
- }
- if(lpBuffer != NULL)
- sysFree(lpBuffer);
- *pbytes = (long) actualLength;
- return TRUE;
-}
-
-/*
- * This is documented to succeed on read-only files, but Win32's
- * FlushFileBuffers functions fails with "access denied" in such a
- * case. So we only signal an error if the error is *not* "access
- * denied".
- */
-
-int
-sysSync(int fd) {
- /*
- * From the documentation:
- *
- * On Windows NT, the function FlushFileBuffers fails if hFile
- * is a handle to console output. That is because console
- * output is not buffered. The function returns FALSE, and
- * GetLastError returns ERROR_INVALID_HANDLE.
- *
- * On the other hand, on Win95, it returns without error. I cannot
- * assume that 0, 1, and 2 are console, because if someone closes
- * System.out and then opens a file, they might get file descriptor
- * 1. An error on *that* version of 1 should be reported, whereas
- * an error on System.out (which was the original 1) should be
- * ignored. So I use isatty() to ensure that such an error was due
- * to this bogosity, and if it was, I ignore the error.
- */
-
- HANDLE handle = (HANDLE)_get_osfhandle(fd);
-
- if (!FlushFileBuffers(handle)) {
- if (GetLastError() != ERROR_ACCESS_DENIED) { /* from winerror.h */
- return -1;
- }
- }
- return 0;
-}
-
-
-int
-sysSetLength(int fd, jlong length) {
- HANDLE h = (HANDLE)_get_osfhandle(fd);
- long high = (long)(length >> 32);
- DWORD ret;
-
- if (h == (HANDLE)(-1)) return -1;
- ret = SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
- if (ret == 0xFFFFFFFF && GetLastError() != NO_ERROR) {
- return -1;
- }
- if (SetEndOfFile(h) == FALSE) return -1;
- return 0;
-}
-
-int
-sysFileSizeFD(int fd, jlong *size)
-{
- struct _stati64 buf64;
-
- if(_fstati64(fd, &buf64) < 0) {
- return -1;
- }
- (*size) = buf64.st_size;
-
- if (*size & 0xFFFFFFFF00000000) {
- /*
- * On Win98 accessing a non-local file we have observed a
- * bogus file size of 0x100000000. So if upper 32 bits
- * are non-zero we re-calculate the size using lseek. This
- * should work for any file size, but it might have a
- * performance impact relative to fstati64. Note: Hotspot
- * doesn't have this problem because it uses stat rather
- * than fstat or fstati64.
- */
-
- jlong curpos;
- jlong endpos;
- jlong newpos;
-
- curpos = _lseeki64(fd, 0, SEEK_CUR);
- if (curpos < 0) {
- return -1;
- }
- endpos = _lseeki64(fd, 0, SEEK_END);
- if (endpos < 0) {
- return -1;
- }
- newpos = _lseeki64(fd, curpos, SEEK_SET);
- if (newpos != curpos) {
- return -1;
- }
- (*size) = endpos;
-
- }
- return 0;
-}
-
-int
-sysFfileMode(int fd, int *mode)
-{
- int ret;
- struct _stati64 buf64;
- ret = _fstati64(fd, &buf64);
- (*mode) = buf64.st_mode;
- return ret;
-}
-
-int
-sysFileType(const char *path)
-{
- int ret;
- struct _stati64 buf;
-
- if ((ret = _stati64(path, &buf)) == 0) {
- int mode = buf.st_mode & S_IFMT;
- if (mode == S_IFREG) return SYS_FILETYPE_REGULAR;
- if (mode == S_IFDIR) return SYS_FILETYPE_DIRECTORY;
- return SYS_FILETYPE_OTHER;
- }
- return ret;
-}
-
-size_t sysRead(int fd, void *buf, unsigned int nBytes)
-{
- return read(fd, buf, nBytes);
-}
-
-size_t sysWrite(int fd, const void *buf, unsigned int nBytes)
-{
- return write(fd, buf, nBytes);
-}
-
-int sysClose(int fd)
-{
- return close(fd);
-}
-
-jlong sysSeek(int fd, jlong offset, int whence)
-{
- return _lseeki64(fd, offset, whence);
-}
--- a/jdk/src/windows/hpi/src/system_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 1994, 2002, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <windows.h>
-#include <float.h> /* For constants for _control87() */
-#include <signal.h>
-#include <time.h> /* For _tzset() and _ftime() */
-#include <errno.h>
-
-#include "hpi_impl.h"
-
-#include "jni_md.h"
-#include "monitor_md.h"
-
-
-static int pending_signals[NSIG];
-static HANDLE sigEvent;
-static CRITICAL_SECTION userSigMon;
-
-
-void sysSignalNotify(int sig)
-{
- sys_thread_t *self = sysThreadSelf();
- EnterCriticalSection(&userSigMon);
- pending_signals[sig]++;
- LeaveCriticalSection(&userSigMon);
- SetEvent(sigEvent);
-}
-
-static int lookupSignal()
-{
- int i;
- EnterCriticalSection(&userSigMon);
- for (i = 0; i < NSIG; i++) {
- if (pending_signals[i]) {
- pending_signals[i]--;
- LeaveCriticalSection(&userSigMon);
- return i;
- }
- }
- LeaveCriticalSection(&userSigMon);
- return -1;
-}
-
-int sysSignalWait()
-{
- int sig;
- while ((sig = lookupSignal()) == -1) {
- WaitForSingleObject(sigEvent, INFINITE);
- }
- return sig;
-}
-
-signal_handler_t sysSignal(int sig, signal_handler_t newHandler)
-{
- return (signal_handler_t)signal(sig, (void (*)(int))newHandler);
-}
-
-void sysRaise(int sig)
-{
- raise(sig);
-}
-
-int sysThreadBootstrap(sys_thread_t **tidP, sys_mon_t **lockP, int nb)
-{
- extern void InitializeMem(void);
-
- threadBootstrapMD(tidP, lockP, nb);
-
- sigEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- InitializeCriticalSection(&userSigMon);
- memset(pending_signals, 0, sizeof(pending_signals));
-
- /*
- * Change default for std. streams stdout, stderr,
- * stdin to be O_BINARY not O_TEXT. The `\r` characters
- * corrupt binary files.
- */
-
- _setmode(0, O_BINARY);
- _setmode(1, O_BINARY);
- _setmode(2, O_BINARY);
-
- /*
- * Set floating point processor to no floating point exceptions.
- * See bug 4027374. Should be the same values VC++ would set them
- * to, but by doing this here we ensure other dll's don't override.
- */
- _control87(_MCW_EM | _RC_NEAR | _PC_53, _MCW_EM | _MCW_RC | _MCW_PC);
-
- InitializeMem();
-
- return SYS_OK;
-}
-
-long
-sysGetMilliTicks(void)
-{
- return(GetTickCount());
-}
-
-#define FT2INT64(ft) \
- ((jlong)(ft).dwHighDateTime << 32 | (jlong)(ft).dwLowDateTime)
-
-jlong
-sysTimeMillis(void)
-{
- static jlong fileTime_1_1_70 = 0;
- SYSTEMTIME st0;
- FILETIME ft0;
-
- if (fileTime_1_1_70 == 0) {
- /* Initialize fileTime_1_1_70 -- the Win32 file time of midnight
- * 1/1/70.
- */
-
- memset(&st0, 0, sizeof(st0));
- st0.wYear = 1970;
- st0.wMonth = 1;
- st0.wDay = 1;
- SystemTimeToFileTime(&st0, &ft0);
- fileTime_1_1_70 = FT2INT64(ft0);
- }
-
- GetSystemTime(&st0);
- SystemTimeToFileTime(&st0, &ft0);
-
- return (FT2INT64(ft0) - fileTime_1_1_70) / 10000;
-}
-
-void *
-sysAllocateMem(long size)
-{
- return malloc(size);
-}
-
-int sysShutdown()
-{
- return SYS_OK;
-}
-
-unsigned
-sleep(unsigned seconds)
-{
- Sleep(seconds * 1000);
- return 0;
-}
-
-int
-sysGetLastErrorString(char *buf, int len)
-{
- long errval;
-
- if ((errval = GetLastError()) != 0) {
- /* DOS error */
- int n = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, errval,
- 0, buf, len, NULL);
- if (n > 3) {
- /* Drop final '.', CR, LF */
- if (buf[n - 1] == '\n') n--;
- if (buf[n - 1] == '\r') n--;
- if (buf[n - 1] == '.') n--;
- buf[n] = '\0';
- }
- return n;
- }
-
- if (errno != 0) {
- /* C runtime error that has no corresponding DOS error code */
- const char *s = strerror(errno);
- int n = strlen(s);
- if (n >= len) n = len - 1;
- strncpy(buf, s, n);
- buf[n] = '\0';
- return n;
- }
-
- return 0;
-}
--- a/jdk/src/windows/hpi/src/threads_md.c Tue Jan 04 17:05:38 2011 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,831 +0,0 @@
-/*
- * Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Win32 implementation of Java threads
- */
-
-#include "hpi_impl.h"
-
-#include <windows.h>
-#include <process.h> /* for _beginthreadex(), _endthreadex() */
-#include <stdlib.h>
-
-#include "threads_md.h"
-#include "monitor_md.h"
-
-
-/*
- * Queue of active Java threads
- */
-static sys_thread_t *ThreadQueue;
-sys_mon_t *_sys_queue_lock;
-
-static int ActiveThreadCount = 0; /* All threads */
-
-/*
- * Set to TRUE once threads have been bootstrapped
- */
-bool_t ThreadsInitialized = FALSE;
-
-/*
- * Are we running under Window NT
- */
-static bool_t windowsNT = FALSE;
-
-/*
- * Thread local storage index used for looking up sys_thread_t struct
- * (tid) associated with the current thread.
- */
-#define TLS_INVALID_INDEX 0xffffffffUL
-static unsigned long tls_index = TLS_INVALID_INDEX;
-
-static void RecordNTTIB(sys_thread_t *tid)
-{
-#ifndef _WIN64
- PNT_TIB nt_tib;
- __asm {
- mov eax, dword ptr fs:[18h];
- mov nt_tib, eax;
- }
- tid->nt_tib = nt_tib;
-#else
- tid->nt_tib = 0;
-#endif
-}
-
-/*
- * Add thread to queue of active threads.
- */
-static void
-queueInsert(sys_thread_t *tid)
-{
- if (ThreadsInitialized)
- SYS_QUEUE_LOCK(sysThreadSelf());
- ActiveThreadCount++;
- tid->next = ThreadQueue;
- ThreadQueue = tid;
- if (ThreadsInitialized)
- SYS_QUEUE_UNLOCK(sysThreadSelf());
- else
- ThreadsInitialized = TRUE;
-}
-
-/*
- * Remove thread from queue of active threads.
- */
-static void
-removefromActiveQ(sys_thread_t *tid)
-{
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
- --ActiveThreadCount;
-
- if (ThreadQueue == tid) {
- ThreadQueue = tid->next;
- } else {
- sys_thread_t *p;
- for (p = ThreadQueue; p->next != 0; p = p->next) {
- if (p->next == tid) {
- p->next = tid->next;
- break;
- }
- }
- }
-}
-
-/*
- * Allocate and initialize the sys_thread_t structure for an arbitary
- * native thread.
- */
-int
-sysThreadAlloc(sys_thread_t **tidP)
-{
- HANDLE hnd = GetCurrentProcess();
- sys_thread_t *tid = allocThreadBlock();
- if (tid == NULL) {
- return SYS_NOMEM;
- }
-
- tid->state = RUNNABLE;
- tid->interrupted = FALSE;
- tid->interrupt_event = CreateEvent(NULL, TRUE, FALSE, NULL);
- tid->id = GetCurrentThreadId();
- DuplicateHandle(hnd, GetCurrentThread(), hnd, &tid->handle, 0, FALSE,
- DUPLICATE_SAME_ACCESS);
-
- RecordNTTIB(tid);
- /* For the Invocation API:
- We update the thread-specific storage before locking the
- queue because sysMonitorEnter will access sysThreadSelf.
- */
- TlsSetValue(tls_index, tid);
-
- queueInsert(tid);
- tid->stack_ptr = &tid;
- *tidP = tid;
- return SYS_OK;
-}
-
-/*
- * Bootstrap the Java thread system by making the current thread the
- * "primordial" thread.
- */
-int threadBootstrapMD(sys_thread_t **tidP, sys_mon_t **lockP, int nb)
-{
- OSVERSIONINFO windowsVersion;
- HANDLE hnd = GetCurrentProcess();
-
- nReservedBytes = (nb + 7) & (~7);
- /*
- * Allocate TLS index for thread-specific data.
- */
- tls_index = TlsAlloc();
- if (tls_index == TLS_INVALID_INDEX) {
- VM_CALL(jio_fprintf)(stderr, "TlsAlloc failed (errcode = %x)\n",
- GetLastError());
- return SYS_NOMEM;
- }
-
- /* OS properties */
- windowsVersion.dwOSVersionInfoSize = sizeof(windowsVersion);
- GetVersionEx(&windowsVersion);
- windowsNT = windowsVersion.dwPlatformId == VER_PLATFORM_WIN32_NT;
-
- /* Initialize the queue lock monitor */
- _sys_queue_lock = (sys_mon_t *)sysMalloc(sysMonitorSizeof());
- if (_sys_queue_lock == NULL) {
- return SYS_ERR;
- }
- VM_CALL(monitorRegister)(_sys_queue_lock, "Thread queue lock");
- *lockP = _sys_queue_lock;
-
- return sysThreadAlloc(tidP);
-}
-
-/*
- * Return current stack pointer of specified thread.
- */
-void *
-sysThreadStackPointer(sys_thread_t *tid)
-{
-#ifndef _WIN64
- CONTEXT context;
- WORD __current_SS;
-
- /* REMIND: Need to fix this for Win95 */
- context.ContextFlags = CONTEXT_CONTROL;
- if (!GetThreadContext(tid->handle, &context)) {
- VM_CALL(jio_fprintf)(stderr, "GetThreadContext failed (errcode = %x)\n",
- GetLastError());
- return 0;
- }
-
- /* With the NT TIB stuff that Hong came up with, I don't think we
- * need any of the complicated VirtualQuery calls anymore. If
- * context.Esp is within the stack limit and base, we return
- * context.Esp, otherwise, we can simply return nt_tib->StackLimit.
- * To minimize code changes, though, I'm keeping the code the way
- * it was.
- */
- if (tid->nt_tib == NULL) {
- /* thread hasn't started yet. */
- return 0;
- }
-
- __asm {
- mov ax, ss;
- mov __current_SS, ax;
- }
-
- if (context.SegSs == __current_SS &&
- context.Esp >= (uintptr_t)(tid->nt_tib->StackLimit) &&
- context.Esp < (uintptr_t)(tid->nt_tib->StackBase)) {
- MEMORY_BASIC_INFORMATION mbi;
-
- VirtualQuery((PBYTE) context.Esp, &mbi, sizeof(mbi));
-
- if (!(mbi.Protect & PAGE_GUARD)) {
- return (void *) context.Esp;
- } else {
- SYSTEM_INFO si;
- char *Esp = (char*) context.Esp;
- DWORD dwPageSize;
-
- GetSystemInfo(&si);
- dwPageSize = si.dwPageSize;
- Esp -= (((DWORD) Esp) % dwPageSize);
- do {
- Esp += dwPageSize;
- VirtualQuery((PBYTE) Esp, &mbi, sizeof(mbi));
- } while (mbi.Protect & PAGE_GUARD);
- return Esp;
- }
- } else {
- /* segment selectors don't match - thread is in some weird context */
- MEMORY_BASIC_INFORMATION mbi;
- PBYTE pbStackHwm, pbStackBase;
- SYSTEM_INFO si;
- DWORD dwPageSize;
- stackp_t stack_ptr = tid->stack_ptr;
-
- if (stack_ptr == 0) {
- return 0;
- }
- GetSystemInfo(&si);
- dwPageSize = si.dwPageSize;
- VirtualQuery((PBYTE)stack_ptr - 1, &mbi, sizeof(mbi));
- pbStackBase = (PBYTE)mbi.AllocationBase;
- /* step backwards till beginning of segment, non-RW page, or guard
- page (guard pages only on WinNT) */
- do {
- pbStackHwm = (PBYTE)mbi.BaseAddress;
- if (pbStackHwm <= pbStackBase) {
- break;
- }
- VirtualQuery(pbStackHwm - dwPageSize, &mbi, sizeof(mbi));
- }
- while ((mbi.Protect & PAGE_READWRITE) &&
- !(mbi.Protect & PAGE_GUARD));
- /* the best we can do for now is the first page of stack
- storage - it should be a stack high-water mark, anyway */
- return (void *)pbStackHwm;
- }
-#else
- return 0;
-#endif
-}
-
-/*
- * Get the end of stack (if you step beyond (above or below depending
- * on your architecture) you can die. We refer to the logical top of
- * stack.
- *
- * NOTE! There are restrictions about when you can call this method. If
- * you did a sysThreadAlloc, then you can call this method as soon as
- * sysThreadAlloc returns. If you called sysThreadCreate(start_function),
- * then you must call sysThreadStackTop only inside start_function and not
- * as soon as sysThreadCreate returns.
- */
-void *
-sysThreadStackTop(sys_thread_t *tid)
-{
- return 0; /* FIXME: Unimplemented. */
-}
-
-long *
-sysThreadRegs(sys_thread_t *tid, int *nregs)
-{
- *nregs = N_TRACED_REGS;
- return tid->regs;
-}
-
-/*
- * Thread start routine for new Java threads
- */
-static unsigned __stdcall
-_start(sys_thread_t *tid)
-{
- /* Should thread suspend itself at this point? */
-
- tid->state = RUNNABLE;
- RecordNTTIB(tid);
- TlsSetValue(tls_index, tid);
- tid->stack_ptr = &tid;
- tid->start_proc(tid->start_parm);
- sysThreadFree();
- _endthreadex(0);
- /* not reached */
- return 0;
-}
-
-/*
- * Create a new Java thread. The thread is initially suspended.
- */
-int
-sysThreadCreate(sys_thread_t **tidP, long stack_size,
- void (*proc)(void *), void *arg)
-{
- sys_thread_t *tid = allocThreadBlock();
- if (tid == NULL) {
- return SYS_NOMEM;
- }
- tid->state = SUSPENDED;
- tid->start_proc = proc;
- tid->start_parm = arg;
-
- tid->interrupt_event = CreateEvent(NULL, TRUE, FALSE, NULL);
-
- /*
- * Start the new thread.
- */
- tid->handle = (HANDLE)_beginthreadex(NULL, stack_size, _start, tid,
- CREATE_SUSPENDED, &tid->id);
- if (tid->handle == 0) {
- return SYS_NORESOURCE; /* Will be treated as though SYS_NOMEM */
- }
-
- queueInsert(tid);
- *tidP = tid;
- return SYS_OK;
-}
-
-/*
- * Free a system thread block.
- * Remove from the thread queue.
- */
-int
-sysThreadFree()
-{
- sys_thread_t *tid = sysThreadSelf();
-
- /*
- * remove ourselves from the thread queue. This must be done after
- * the notify above since monitor operations aren't really safe if
- * your thread isn't on the thread queue. (This isn't true of
- * the sysMonitor* functions, only monitor*)
- */
- SYS_QUEUE_LOCK(tid);
- removefromActiveQ(tid);
- SYS_QUEUE_UNLOCK(tid);
-
- /* For invocation API: later sysThreadSelf() calls will return 0 */
- TlsSetValue(tls_index, 0);
-
- /*
- * Close the thread and interrupt event handles, and free the
- * sys_thread_t structure.
- */
- CloseHandle(tid->handle);
- CloseHandle(tid->interrupt_event);
- freeThreadBlock(tid);
- return SYS_OK;
-}
-
-/*
- * Yield control to another thread.
- */
-void
-sysThreadYield(void)
-{
- Sleep(0);
-}
-
-/*
- * Suspend execution of the specified thread.
- */
-int
-sysThreadSuspend(sys_thread_t *tid)
-{
- /* REMIND: Fix for Win95 */
- /* Set state first so state is reflected before this thread */
- /* returns. Fix suggested by ARB of SAS */
- thread_state_t oldstate = tid->state;
- sys_thread_t *self = sysThreadSelf();
-
- if (tid == self) {
- self->state = SUSPENDED;
- } else {
- switch(tid->state) {
- case RUNNABLE:
- tid->state = SUSPENDED;
- break;
- case MONITOR_WAIT:
- tid->state = SUSPENDED;
- tid->suspend_flags |= MONITOR_WAIT_SUSPENDED;
- break;
- case CONDVAR_WAIT:
- tid->state = SUSPENDED;
- tid->suspend_flags |= CONDVAR_WAIT_SUSPENDED;
- break;
- case SUSPENDED:
- case MONITOR_SUSPENDED:
- default:
- return SYS_ERR;
- }
- }
- if (SuspendThread(tid->handle) == 0xffffffffUL) {
- tid->state = oldstate;
- tid->suspend_flags = 0;
- return SYS_ERR;
- }
- return SYS_OK;
-}
-
-/*
- * Continue execution of the specified thread.
- */
-int
-sysThreadResume(sys_thread_t *tid)
-{
- unsigned long n;
-
- if (tid->suspend_flags & MONITOR_WAIT_SUSPENDED) {
- tid->suspend_flags = 0;
- tid->state = MONITOR_WAIT;
- } else if (tid->suspend_flags & CONDVAR_WAIT_SUSPENDED) {
- tid->suspend_flags = 0;
- tid->state = CONDVAR_WAIT;
- } else {
- switch(tid->state) {
- case SUSPENDED:
- tid->state = RUNNABLE;
- break;
- case MONITOR_SUSPENDED:
- tid->state = MONITOR_WAIT;
- break;
- case RUNNABLE:
- case MONITOR_WAIT:
- case CONDVAR_WAIT:
- default:
- return SYS_ERR;
- break;
- }
- }
-
- /* Decrement thread's suspend count until no longer suspended */
- while ((n = ResumeThread(tid->handle)) > 1) {
- if (n == 0xffffffffUL) {
- return SYS_ERR;
- }
- }
- return SYS_OK;
-}
-
-/*
- * Return priority of specified thread.
- */
-int
-sysThreadGetPriority(sys_thread_t *tid, int *pp)
-{
- switch (GetThreadPriority(tid->handle)) {
- case THREAD_PRIORITY_IDLE:
- *pp = 0; break;
- case THREAD_PRIORITY_LOWEST:
- *pp = 2; break;
- case THREAD_PRIORITY_BELOW_NORMAL:
- *pp = 4; break;
- case THREAD_PRIORITY_NORMAL:
- *pp = 5; break;
- case THREAD_PRIORITY_ABOVE_NORMAL:
- *pp = 6; break;
- case THREAD_PRIORITY_HIGHEST:
- *pp = 8; break;
- case THREAD_PRIORITY_TIME_CRITICAL:
- *pp = 10; break;
- case THREAD_PRIORITY_ERROR_RETURN:
- return SYS_ERR;
- }
- return SYS_OK;
-}
-
-/*
- * Set priority of specified thread.
- */
-int
-sysThreadSetPriority(sys_thread_t *tid, int p)
-{
- int priority;
-
- switch (p) {
- case 0:
- priority = THREAD_PRIORITY_IDLE;
- break;
- case 1: case 2:
- priority = THREAD_PRIORITY_LOWEST;
- break;
- case 3: case 4:
- priority = THREAD_PRIORITY_BELOW_NORMAL;
- break;
- case 5:
- priority = THREAD_PRIORITY_NORMAL;
- break;
- case 6: case 7:
- priority = THREAD_PRIORITY_ABOVE_NORMAL;
- break;
- case 8: case 9:
- priority = THREAD_PRIORITY_HIGHEST;
- break;
- case 10:
- priority = THREAD_PRIORITY_TIME_CRITICAL;
- break;
- default:
- return SYS_ERR;
- }
- return SetThreadPriority(tid->handle, priority) ? SYS_OK : SYS_ERR;
-}
-
-/*
- * Return the thread information block of the calling thread.
- */
-sys_thread_t *
-sysThreadSelf(void)
-{
- return tls_index == 0xffffffffUL ? 0 : TlsGetValue(tls_index);
-}
-
-/*
- * Enumerate over all threads in active queue calling a function for
- * each one. Expects the caller to lock _queue_lock
- */
-int
-sysThreadEnumerateOver(int (*func)(sys_thread_t *, void *), void *arg)
-{
- sys_thread_t *tid;
- int ret = SYS_OK;
- sys_thread_t *self = sysThreadSelf();
-
- sysAssert(SYS_QUEUE_LOCKED(sysThreadSelf()));
-
- for (tid = ThreadQueue; tid != 0; tid = tid->next) {
- if ((ret = (*func)(tid, arg)) != SYS_OK) {
- break;
- }
- }
- return ret;
-}
-
-/*
- * Helper function for sysThreadSingle()
- */
-static int
-threadSingleHelper(sys_thread_t *tid, void *self)
-{
- if (tid == self) {
- return SYS_OK;
- }
- if (SuspendThread(tid->handle) == 0xffffffffUL) {
- return SYS_ERR;
- }
- {
- CONTEXT context;
- DWORD *esp = (DWORD *)tid->regs;
-
- context.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
- if (!GetThreadContext(tid->handle, &context)) {
- VM_CALL(jio_fprintf)
- (stderr, "GetThreadContext failed (errcode = %x)\n",
- GetLastError());
- return SYS_ERR;
- }
-#ifdef _M_AMD64
- *esp++ = context.Rax;
- *esp++ = context.Rbx;
- *esp++ = context.Rcx;
- *esp++ = context.Rdx;
- *esp++ = context.Rsi;
- *esp++ = context.Rdi;
- *esp = context.Rbp;
-#else
- *esp++ = context.Eax;
- *esp++ = context.Ebx;
- *esp++ = context.Ecx;
- *esp++ = context.Edx;
- *esp++ = context.Esi;
- *esp++ = context.Edi;
- *esp = context.Ebp;
-#endif
- }
- return SYS_OK;
-}
-
-/*
- * Puts each thread in the active thread queue to sleep except for the
- * calling thread. The threads must be later woken up with a corresponding
- * call to 'sysThreadMulti'. Returns SYS_OK on success, or SYS_ERR if any
- * of the threads could not be suspended.
- */
-int
-sysThreadSingle(void)
-{
- return sysThreadEnumerateOver(threadSingleHelper, sysThreadSelf());
-}
-
-/*
- * Helper function for sysThreadMulti(): Only ResumeThread once, unlike
- * sysThreadResume(), which will repeatedly call ResumeThread until the
- * thread is really resumed. That is, Thread.resume will unwind any
- * number of Thread.suspend invocations, but sysThreadMulti() calls must
- * be strictly matched with sysThreadSingle() calls. Doing this keeps
- * the garbage collector, which uses thread suspension to stop threads
- * while it operates, from waking up threads that were already suspended
- * when GC was invoked.
- */
-static int
-threadMultiHelper(sys_thread_t *tid, void *self)
-{
- if (tid == self || ResumeThread(tid->handle) != 0xffffffffUL) {
- return SYS_OK;
- } else {
- return SYS_ERR;
- }
-}
-
-/*
- * Wakes up each thread in active thread queue except for the calling
- * thread. The mechanism uses thread suspension, and will not wake a
- * thread that was already suspended. Must be matched 1-1 with calls
- * to sysThreadSingle(). Returns SYS_ERR if not all threads could be
- * woken up.
- */
-void
-sysThreadMulti(void)
-{
- sysThreadEnumerateOver(threadMultiHelper, sysThreadSelf());
-}
-
-/*
- * Dump system-specific information about threads.
- */
-void *
-sysThreadNativeID(sys_thread_t *tid)
-{
- return (void *)(uintptr_t)tid->id;
-}
-
-int
-sysThreadCheckStack(void)
-{
- return 1;
-}
-
-/*
- * The mechanics of actually signalling an exception (in the future,
- * and Alarm or Interrupt) depend upon what thread implementation you
- * are using.
- */
-void
-sysThreadPostException(sys_thread_t *tid, void *exc)
-{
- /* Interrupt the thread if it's waiting; REMIND: race??? */
- SetEvent(tid->interrupt_event);
-}
-
-/*
- * Support for (Java-level) interrupts.
- */
-void
-sysThreadInterrupt(sys_thread_t *tid)
-{
- if (tid->interrupted == FALSE) {
- tid->interrupted = TRUE;
- SetEvent(tid->interrupt_event);
- }
-}
-
-int
-sysThreadIsInterrupted(sys_thread_t *tid, int ClearInterrupted)
-{
- bool_t interrupted = tid->interrupted;
- if (interrupted && ClearInterrupted) {
- tid->interrupted = FALSE;
- ResetEvent(tid->interrupt_event);
- }
- return interrupted;
-}
-
-HPI_SysInfo *
-sysGetSysInfo()
-{
- static HPI_SysInfo info = {0, 0};
-
- if (info.name == NULL) {
- SYSTEM_INFO sysinfo;
- GetSystemInfo(&sysinfo);
- info.isMP = sysinfo.dwNumberOfProcessors > 1;
- info.name = "native threads";
- }
- return &info;
-}
-
-#define FT2INT64(ft) \
- ((jlong)(ft).dwHighDateTime << 32 | (jlong)(ft).dwLowDateTime)
-
-jlong
-sysThreadCPUTime()
-{
- if (windowsNT) {
- FILETIME CreationTime;
- FILETIME ExitTime;
- FILETIME KernelTime;
- FILETIME UserTime;
-
- GetThreadTimes(GetCurrentThread(),
- &CreationTime, &ExitTime, &KernelTime, &UserTime);
- return FT2INT64(UserTime) * 100;
- } else {
- return (jlong)sysGetMilliTicks() * 1000000;
- }
-}
-
-int
-sysThreadGetStatus(sys_thread_t *tid, sys_mon_t **monitorPtr)
-{
- int status;
- switch (tid->state) {
- case RUNNABLE:
- if (tid->enter_monitor)
- status = SYS_THREAD_MONITOR_WAIT;
- else
- status = SYS_THREAD_RUNNABLE;
- break;
- case SUSPENDED:
- if (tid->enter_monitor)
- status = SYS_THREAD_SUSPENDED | SYS_THREAD_MONITOR_WAIT;
- else if (tid->suspend_flags & CONDVAR_WAIT_SUSPENDED)
- status = SYS_THREAD_SUSPENDED | SYS_THREAD_CONDVAR_WAIT;
- else
- status = SYS_THREAD_SUSPENDED;
- break;
- case MONITOR_SUSPENDED:
- status = SYS_THREAD_SUSPENDED | SYS_THREAD_MONITOR_WAIT;
- break;
- case CONDVAR_WAIT:
- status = SYS_THREAD_CONDVAR_WAIT;
- break;
- case MONITOR_WAIT:
- /*
- * this flag should never be in used on win32 since the
- * state is actually signalled by setting self->enter_monitor
- * to point at the monitor the thread is waiting to enter
- */
- sysAssert(FALSE);
- default:
- return SYS_ERR;
- }
- if (monitorPtr) {
- if (status & SYS_THREAD_MONITOR_WAIT) {
- *monitorPtr = tid->enter_monitor;
- } else if (status & SYS_THREAD_CONDVAR_WAIT) {
- *monitorPtr = tid->wait_monitor;
- } else {
- *monitorPtr = NULL;
- }
- }
- return status;
-}
-
-int sysAdjustTimeSlice(int i)
-{
- return JNI_ERR;
-}
-
-void sysThreadProfSuspend(sys_thread_t *tid)
-{
- SuspendThread(tid->handle);
-}
-
-void sysThreadProfResume(sys_thread_t *tid)
-{
- ResumeThread(tid->handle);
-}
-
-bool_t sysThreadIsRunning(sys_thread_t *tid)
-{
-#ifndef _M_AMD64
- unsigned int sum = 0;
- unsigned int *p;
- CONTEXT context;
-
- context.ContextFlags = CONTEXT_FULL;
- GetThreadContext(tid->handle, &context);
- p = &context.SegGs;
- while (p <= &context.SegSs) {
- sum += *p;
- p++;
- }
-
- if (sum == tid->last_sum) {
- return FALSE;
- }
- tid->last_sum = sum;
-#endif
- return TRUE;
-}
-
-void *
-sysThreadInterruptEvent()
-{
- return sysThreadSelf()->interrupt_event;
-}