You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/03/01 16:43:11 UTC

svn commit: r382065 [6/10] - in /incubator/harmony/enhanced/classlib/trunk: modules/security/make/ modules/security/make/native/linux/ modules/security/make/native/windows/ native-src/ native-src/linux.IA32/ native-src/linux.IA32/archive/ native-src/li...

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/nio/socket.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/nio/socket.h?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/nio/socket.h (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/nio/socket.h Wed Mar  1 07:42:53 2006
@@ -0,0 +1,54 @@
+/* Copyright 2004, 2005 The Apache Software Foundation or its licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if !defined(socket_h)
+#define socket_h
+#define BROKEN_MULTICAST_IF 1
+#define BROKEN_MULTICAST_TTL 2
+#define BROKEN_TCP_NODELAY 4
+/* signals that when SO_LINGER is enabled and shutdown() is called, a subsequent call to closesocket() will unnecessarily hang */
+#define BROKEN_SO_LINGER_SHUTDOWN 8
+
+jobject getByteSocketOption (JNIEnv * env, hysocket_t hysocketP, int option);
+void setIPV6McastInterface (JNIEnv * env, hysocket_t hysocketP,
+          jobject optVal);
+void setByteSocketOption (JNIEnv * env, hysocket_t hysocketP, int option,
+        jobject optVal);
+jobject getIPV6McastInterface (JNIEnv * env, hysocket_t hysocketP);
+void setSendBufferSize (JNIEnv * env, hysocket_t hysocketP, jobject optVal);
+jobject getReceiveBufferSize (JNIEnv * env, hysocket_t hysocketP);
+jobject getMcastInterface (JNIEnv * env, hysocket_t hysocketP);
+void mcastAddMembership (JNIEnv * env, hysocket_t hysocketP, jobject optVal,
+       BOOLEAN ignoreIF);
+void setIntegerSocketOption (JNIEnv * env, hysocket_t hysocketP, int level,
+           int option, jobject optVal);
+jobject getSendBufferSize (JNIEnv * env, hysocket_t hysocketP);
+void mcastDropMembership (JNIEnv * env, hysocket_t hysocketP, jobject optVal,
+        BOOLEAN ignoreIF);
+void setReuseAddrAndReusePort (JNIEnv * env, hysocket_t hysocketP,
+             jobject optVal);
+void setBoolSocketOption (JNIEnv * env, hysocket_t hysocketP, int level,
+        int option, jobject optVal);
+void setMcastInterface (JNIEnv * env, hysocket_t hysocketP, jobject optVal);
+jobject getIntegerValue (JNIEnv * env, hysocket_t hysocketP, int level,
+       int option);
+void setLingerOption (JNIEnv * env, hysocket_t hysocketP, jobject optVal);
+jobject getBooleanValue (JNIEnv * env, hysocket_t hysocketP, int level,
+       int option);
+jobject getLingerOption (JNIEnv * env, hysocket_t hysocketP);
+void setReceiveBufferSize (JNIEnv * env, hysocket_t hysocketP,
+         jobject optVal);
+#endif /* socket_h */
+

Propchange: incubator/harmony/enhanced/classlib/trunk/native-src/shared/pool/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Mar  1 07:42:53 2006
@@ -0,0 +1 @@
+*.obj

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/pool/pool_cap.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/pool/pool_cap.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/pool/pool_cap.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/pool/pool_cap.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,107 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * @ingroup Pool
+ * @brief Pool-capacity functions
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hypool.h"
+
+#define ROUND_TO(granularity, number) ( (((number) % (granularity)) ? ((number) + (granularity) - ((number) % (granularity))) : (number)))
+
+#define MIN_GRANULARITY		sizeof(UDATA)
+
+#define MALLOC_ALIGNMENT sizeof(UDATA)
+
+/* read this if a port library call becomes available that gives out the OS page size */
+#if 0
+#define OS_PAGE_SIZE		(EsGetAddressSpacePageSize())
+#else
+
+#define OS_PAGE_SIZE		4096
+#endif
+
+/**
+ * Ensures that the pool is large enough for newCapacity elements.
+ * This has the side effect of setting the POOL_NEVER_FREE_PUDDLES flag.
+ * Without this, the pool could shrink back down to its original size.
+ * Note that this does not take into account the number of elements already
+ * used in the pool.
+ *
+ * @param[in] aPool The pool
+ * @param[in] newCapacity The desired new-size of the pool
+ *
+ * @return 0 on success
+ * @return -1 on failure
+ * 
+ */
+UDATA VMCALL
+pool_ensureCapacity (HyPool * aPool, UDATA newCapacity)
+{
+  UDATA numElements = pool_capacity (aPool);
+
+  /* find the last pool and mark each pool as POOL_NEVER_FREE_PUDDLES */
+  for (;;)
+    {
+      aPool->flags |= POOL_NEVER_FREE_PUDDLES;
+      if (aPool->nextPool == NULL)
+        break;
+      aPool = aPool->nextPool;
+    }
+
+  if (newCapacity > numElements)
+    {
+      UDATA newSize = newCapacity - numElements;
+      if (newSize < aPool->numberOfElements)
+        {
+          newSize = aPool->numberOfElements;
+        }
+
+      aPool->nextPool =
+        pool_new (aPool->elementSize, newSize, aPool->alignment, aPool->flags,
+                  aPool->memAlloc, aPool->memFree, aPool->userData);
+      if (aPool->nextPool == NULL)
+        return -1;
+    }
+
+  return 0;
+}
+
+/**
+ * Returns the total capacity of a pool
+ *
+ * @param[in] aPool The pool
+ *
+ * @return 0 on error
+ * @return numElements in aPool otherwise
+ *
+ */
+UDATA VMCALL
+pool_capacity (HyPool * aPool)
+{
+  UDATA numElements = 0;
+  while (aPool)
+    {
+      numElements += aPool->numberOfElements;
+      aPool = aPool->nextPool;
+    }
+  return numElements;
+}

Propchange: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Mar  1 07:42:53 2006
@@ -0,0 +1 @@
+*.obj

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyerror.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyerror.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyerror.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyerror.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,324 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file 
+ * @ingroup Port
+ * @brief Error Handling
+ *
+ * If an OS system call fails the error code reported by the OS needs to be saved for future reference.
+ * The OS error code as well as the corresponding portable error code are stored in the per thread
+ * buffers @ref hyportptb.h via a call the @ref hyerror_set_last_error or @ref hyerror_set_last_error_with_message.
+ * These functions are meant for private use by the port library, to set the error related to a system call failure.
+ * They are in the port library table as people overriding port library functions may need to set the error
+ * message accordingly.
+ *
+ * The majority of applications are not interested in the human readable error message corresponding to
+ * the error.  As a result the error message is not stored at time of the reported error, but can be looked
+ * up at a later time.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "portpriv.h"
+#include "portnls.h"
+#include "hyportptb.h"
+
+static const char *
+swapMessageBuffer (PortlibPTBuffers_t ptBuffers, const char *message)
+{
+  char *tempBuffer = ptBuffers->reportedMessageBuffer;
+  U_32 tempBufferSize = ptBuffers->reportedMessageBufferSize;
+
+  if (message == NULL)
+    {
+      return "";
+    }
+
+  /* Can't swap unknown message buffer */
+  if (message != ptBuffers->errorMessageBuffer)
+    {
+      return message;
+    }
+
+  /* Save reported information */
+  ptBuffers->reportedErrorCode = ptBuffers->portableErrorCode;
+  ptBuffers->reportedMessageBuffer = ptBuffers->errorMessageBuffer;
+  ptBuffers->reportedMessageBufferSize = ptBuffers->errorMessageBufferSize;
+
+  if (tempBufferSize > 0)
+    {
+      tempBuffer[0] = '\0';
+    }
+
+  /* Clear pending fields ready for next error */
+  ptBuffers->portableErrorCode = 0;
+  ptBuffers->errorMessageBuffer = tempBuffer;
+  ptBuffers->errorMessageBufferSize = tempBufferSize;
+
+  return ptBuffers->reportedMessageBuffer;
+}
+
+/**
+ * PortLibrary startup.
+ *
+ * This function is called during startup of the portLibrary.  Any resources that are required for
+ * the error handling operations may be created here.  All resources created here should be destroyed
+ * in @ref hyerror_shutdown.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return 0 on success, negative error code on failure.  Error code values returned are
+ * \arg HYPORT_ERROR_STARTUP_ERROR
+ *
+ * @note Most implementations will simply return success.
+ */
+I_32 VMCALL
+hyerror_startup (struct HyPortLibrary * portLibrary)
+{
+  return 0;
+}
+
+/**
+ * PortLibrary shutdown.
+ *
+ * This function is called during shutdown of the portLibrary.  Any resources that were created by @ref hyerror_startup
+ * should be destroyed here.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @note Most implementations will be empty.
+ */
+void VMCALL
+hyerror_shutdown (struct HyPortLibrary *portLibrary)
+{
+}
+
+/**
+ *  @brief Error Handling
+ *
+ * Return the error message as reported by the OS for the last saved error.
+ * If no error has been saved then an empty message is returned.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return The error message for the last OS failure, empty message on failure.
+ */
+const char *VMCALL
+hyerror_last_error_message (struct HyPortLibrary *portLibrary)
+{
+  PortlibPTBuffers_t ptBuffers;
+
+  /* Was an error saved ? */
+  ptBuffers = hyport_tls_peek (portLibrary);
+  if (NULL == ptBuffers)
+    {
+      return "";
+    }
+
+  /* New error ? */
+  if (ptBuffers->portableErrorCode != 0)
+    {
+      const char *message = NULL;
+
+      /* Customized message stored ? */
+      if (ptBuffers->errorMessageBufferSize > 0)
+        {
+          if ('\0' != ptBuffers->errorMessageBuffer[0])
+            {
+              message = ptBuffers->errorMessageBuffer;
+            }
+        }
+
+      /* Call a helper to get the last message from the OS.  */
+      if (message == NULL)
+        {
+          message = errorMessage (portLibrary, ptBuffers->platformErrorCode);
+        }
+
+      /* Avoid overwrite by internal portlib errors */
+      return swapMessageBuffer (ptBuffers, message);
+    }
+
+  /* Previous message stored ? */
+  if (ptBuffers->reportedMessageBufferSize > 0)
+    {
+      if ('\0' != ptBuffers->reportedMessageBuffer[0])
+        {
+          return ptBuffers->reportedMessageBuffer;
+        }
+    }
+
+  /* No error.  */
+  return "";
+}
+
+/**
+ * @brief Error Handling
+ *
+ * Look up the reason for the last stored failure.  If no error code has been
+ * stored then failure is returned.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return The negative portable error code on success, 0 on failure.
+ *
+ * @note Does not clear the reason for the last failure.
+ */
+I_32 VMCALL
+hyerror_last_error_number (struct HyPortLibrary * portLibrary)
+{
+  PortlibPTBuffers_t ptBuffers;
+
+  /* get the buffers, return failure if not present */
+  ptBuffers = hyport_tls_peek (portLibrary);
+  if (NULL == ptBuffers)
+    {
+      return 0;
+    }
+
+  /* New error ? */
+  if (ptBuffers->portableErrorCode != 0)
+    {
+      return ptBuffers->portableErrorCode;
+    }
+  else
+    {
+      return ptBuffers->reportedErrorCode;
+    }
+}
+
+/**
+ * @brief Error Handling
+ *
+ * Save the platform specific error code and the portable error code for future reference.  Once stored an 
+ * application may obtain the error message describing the last stored error by calling hyerror_last_error_message.  
+ * Likewise the last portable error code can be obtained by calling hyerror_last_error_number. 
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] platformCode The error code reported by the OS
+ * @param[in] portableCode The corresponding portable error code as determined by the caller
+ *
+ * @return portable error code
+ *
+ * @note There is no way to access the last platform specific error code.
+ *
+ * @note If per thread buffers @see hyportptb.h are not available the error code is not stored.
+ * This event would only occur if the per thread buffers could not be allocated, which is highly unlikely.  In this 
+ * case an application will receive a generic message/errorCode when querying for the last stored values.
+ */
+I_32 VMCALL
+hyerror_set_last_error (struct HyPortLibrary * portLibrary, I_32 platformCode,
+                        I_32 portableCode)
+{
+  PortlibPTBuffers_t ptBuffers;
+
+  /* get the buffers, allocate if necessary.
+   * Silently return if not present, what else would the caller do anyway? 
+   */
+  ptBuffers = hyport_tls_get (portLibrary);
+  if (NULL == ptBuffers)
+    {
+      return portableCode;
+    }
+
+  /* Save the last error */
+  ptBuffers->platformErrorCode = platformCode;
+  ptBuffers->portableErrorCode = portableCode;
+
+  /* Overwrite any customized messages stored */
+  if (ptBuffers->errorMessageBufferSize > 0)
+    {
+      ptBuffers->errorMessageBuffer[0] = '\0';
+    }
+
+  return portableCode;
+}
+
+/**
+ * @brief Error Handling
+ *
+ * Save the platform specific error code and the portable error code for future reference.  Once stored an 
+ * application may obtain the error message describing the last stored error by calling hyerror_last_error_message.  
+ * Likewise the last portable error code can be obtained by calling hyerror_last_error_number. 
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] portableCode The corresponding portable error code as determined by the caller
+ * @param[in] errorMessage The customized error message to be stored
+ *
+ * @return portable error code
+ *
+ * @note There is no way to access the last platform specific error code.
+ *
+ * @note If per thread buffers @see hyportptb.h are not available the error code is not stored.
+ * This event would only occur if the per thread buffers could not be allocated, which is highly unlikely.  In this 
+ * case an application will receive a generic message/errorCode when querying for the last stored values.
+ */
+I_32 VMCALL
+hyerror_set_last_error_with_message (struct HyPortLibrary * portLibrary,
+                                     I_32 portableCode,
+                                     const char *errorMessage)
+{
+  PortlibPTBuffers_t ptBuffers;
+  U_32 requiredSize;
+
+  /* get the buffers, allocate if necessary.
+   * Silently return if not present, what else would the caller do anyway? 
+   */
+  ptBuffers = hyport_tls_get (portLibrary);
+  if (NULL == ptBuffers)
+    {
+      return portableCode;
+    }
+
+  /* Save the last error */
+  ptBuffers->platformErrorCode = -1;
+  ptBuffers->portableErrorCode = portableCode;
+
+  /* Store the message, allocate a bigger buffer if required.  Keep the old buffer around
+   * just in case memory can not be allocated
+   */
+  requiredSize = strlen (errorMessage) + 1;
+  requiredSize =
+    requiredSize <
+    HYERROR_DEFAULT_BUFFER_SIZE ? HYERROR_DEFAULT_BUFFER_SIZE : requiredSize;
+  if (requiredSize > ptBuffers->errorMessageBufferSize)
+    {
+      char *newBuffer =
+        portLibrary->mem_allocate_memory (portLibrary, requiredSize);
+      if (NULL != newBuffer)
+        {
+          if (ptBuffers->errorMessageBuffer != NULL)
+            {
+              portLibrary->mem_free_memory (portLibrary,
+                                            ptBuffers->errorMessageBuffer);
+            }
+          ptBuffers->errorMessageBuffer = newBuffer;
+          ptBuffers->errorMessageBufferSize = requiredSize;
+        }
+    }
+
+  /* Save the message */
+  if (ptBuffers->errorMessageBufferSize > 0)
+    {
+      portLibrary->str_printf (portLibrary, ptBuffers->errorMessageBuffer,
+                               ptBuffers->errorMessageBufferSize,
+                               errorMessage);
+      ptBuffers->errorMessageBuffer[ptBuffers->errorMessageBufferSize - 1] =
+        '\0';
+    }
+
+  return portableCode;
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyexit.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyexit.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyexit.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyexit.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,96 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * @ingroup Port
+ * @brief Process shutdown.
+ */
+#include <stdlib.h>
+
+#include "hyport.h"
+
+extern void VMCALL hysig_chain_at_shutdown_and_exit (struct HyPortLibrary
+                                                     *portLibrary);
+
+/**
+ * Block until the portlibary has been exited and return the error code.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return exit code.
+ * @note Most implementations will be empty.
+ */
+I_32 VMCALL
+hyexit_get_exit_code (struct HyPortLibrary *portLibrary)
+{
+  return 0;
+}
+
+/**
+ * Terminate a process.
+ *
+ * Perform any shutdown which is absolutely necessary before terminating the process,
+ * and terminate the process.  Unblock any callers to @ref hyexit_get_exit_code
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] exitCode The exit code to be used to terminate the process.
+ */
+void VMCALL
+hyexit_shutdown_and_exit (struct HyPortLibrary *portLibrary, I_32 exitCode)
+{
+
+#if !defined(WIN32)
+  hysig_chain_at_shutdown_and_exit (portLibrary);
+#endif
+
+
+  exit ((int) exitCode);
+}
+
+/**
+ * PortLibrary shutdown.
+ *
+ * This function is called during shutdown of the portLibrary.  Any resources that were created by @ref hyexit_startup
+ * should be destroyed here.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @note Most implementations will be empty.
+ */
+void VMCALL
+hyexit_shutdown (struct HyPortLibrary *portLibrary)
+{
+}
+
+/**
+ * PortLibrary startup.
+ *
+ * This function is called during startup of the portLibrary.  Any resources that are required for
+ * the exit operations may be created here.  All resources created here should be destroyed
+ * in @ref hyexit_shutdown.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return 0 on success, negative error code on failure.  Error code values returned are
+ * \arg HYPORT_ERROR_STARTUP_EXIT
+ *
+ * @note Most implementations will simply return success.
+ */
+I_32 VMCALL
+hyexit_startup (struct HyPortLibrary *portLibrary)
+{
+  return 0;
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,158 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @ingroup Port
+ * @file
+ * Provides platform-neutral signal handling functions.  
+ * The @ref hygp_register_handler function is partially dependent on internal VM structures, and must be called with NULL as a third (userData) parameter.
+ * <br><br>
+ */
+
+#include "hyport.h"
+#include "hycomp.h"
+#include "gp.h"
+
+/**
+ * Kicks off the new thread by calling the function provided in protected_fn fn.
+ *
+ * All threads spawned by the vm start here and all OS signals that will be handled
+ * by fn must be registered to the OS here. 
+ * Upon receiving a signal from the OS, fn is responsible for calling the function 
+ * specified in @ref hygp_register_handler if it is determined that a shutdown is required.
+ * 
+ * @param[in] portLibrary The port library
+ * @param[in] fn the function that will be used to kick off the thread
+ * @param[in] arg arguments to protected_fn fn
+ *
+ * @return the return value of the function provided in fn
+ * 
+ * @note it is a good idea to save the portLibrary in case a registered exception handler 
+ * cannot be found
+ */
+UDATA VMCALL
+hygp_protect (struct HyPortLibrary * portLibrary, protected_fn fn, void *arg)
+{
+  /* sorry!  No way to protect it generically.  Just run it. */
+  return fn (arg);
+}
+
+/**
+ * Sets the function that is responsible for preserving/outputting the state of the vm and
+ * initiating a graceful shutdown resulting from a gp.
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] fn function responsible for preserving/outputting the state of the vm and 
+ * initiating a graceful shutdown resulting from a gp.
+ * @param[in] aUserData The HyJavaVM or NULL for non-HY consumers.
+ *
+ * @note vmGPHandler in gphandle.c is currently the only function used for handling gps. 
+ * @note  fn is not called by the OS but by the gp handler function specified in the call
+ * to @ref hygp_protect gp module
+ * @note above occurs after the OS has passed a signal along to us and it is determined 
+ * that a shutdown is required.
+ */
+void VMCALL
+hygp_register_handler (struct HyPortLibrary *portLibrary, handler_fn fn,
+                       void *aUserData)
+{
+}
+
+/**
+ * Provides the name and value, specified by category/index of the gp information in info. 
+ * Returns the kind of information found at category/index specified, or undefined 
+ * if the category/index are invalid.  The number of items in the category specified must 
+ * equal the count @ref hygp_info_count returns for that category. 
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] info struct containing all available signal information. Normally includes 
+ * register values, name of module where crash occured and its base address.
+ * @param[in] category the category of signal information that you are querying. 
+ * @param[in] index the index of the item in the specified category. The number of items 
+ * for each category are defined in the sourceTemplate.
+ * @param[out] name the name of the item at the specified index.  
+ * @param[out] value the value of the item at the specified index
+ *
+ * @return the kind of info at the specified index. For example, this allows the caller to 
+ * determine whether the item placed in **value corresponds to a 32/64-bit integer or a pointer to a string. 
+ *
+ * @note The program counter and module name also have negative indexes as defined by 
+ * HYGP_CONTROL_PC and HYGP_MODULE_NAME respectively.
+ * @note Above allows the handler function registered in @ref hygp_register_handler to 
+ * distinguish (and use) them from the other gp items.
+ * @note The caller is responsible for allocating and freeing any buffers used by **name, **value.
+ */
+U_32 VMCALL
+hygp_info (struct HyPortLibrary *portLibrary, void *info, U_32 category,
+           I_32 index, const char **name, void **value)
+{
+  /* default implementation can't do anything */
+  return 0;
+}
+
+/**
+ * Returns the number of items that exist in the category specified, or zero if the category is undefined.
+ *
+ * @param[in] portLibrary The port library
+ * @param[in] info struct containing all available signal information. Normally includes register values, 
+ * name of module where crash occured and its base address. 
+ * @param[in] category the category in which we want to find the number of items that exist.
+ *
+ * @note Return value must agree with the number of items that @ref hygp_info makes available for the 
+ * category specified. 
+*/
+U_32 VMCALL
+hygp_info_count (struct HyPortLibrary * portLibrary, void *info,
+                 U_32 category)
+{
+  /* default implementation can't do anything */
+  return 0;
+}
+
+/**
+ * PortLibrary shutdown.
+ *
+ * This function is called during shutdown of the portLibrary.  
+ * Any resources that were created by @ref hygp_startup
+ * should be destroyed here.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @note Most implementations will be empty.
+ */
+void VMCALL
+hygp_shutdown (struct HyPortLibrary *portLibrary)
+{
+}
+
+/**
+ * PortLibrary startup.
+ *
+ * This function is called during startup of the portLibrary.  Any resources that are required for
+ * the shared library operation may be created here.  All resources created here should be destroyed
+ * in @ref hygp_shutdown.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return 0 on success, negative error code on failure.  Error code values returned are
+ * \arg HYPORT_ERROR_STARTUP_GP
+ *
+ * @note Most implementations will simply return success.
+ */
+I_32 VMCALL
+hygp_startup (struct HyPortLibrary *portLibrary)
+{
+  return 0;
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.h?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.h (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hygp.h Wed Mar  1 07:42:53 2006
@@ -0,0 +1,29 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if !defined(hygp_h)
+#define hygp_h
+void VMCALL hygp_register_handler (struct HyPortLibrary *portLibrary,
+                                   handler_fn fn, void *aUserData);
+I_32 VMCALL hygp_startup (struct HyPortLibrary *portLibrary);
+void VMCALL hygp_shutdown (struct HyPortLibrary *portLibrary);
+UDATA VMCALL hygp_protect (struct HyPortLibrary *portLibrary, protected_fn fn,
+                           void *arg);
+U_32 VMCALL hygp_info_count (struct HyPortLibrary *portLibrary, void *info,
+                             U_32 category);
+U_32 VMCALL hygp_info (struct HyPortLibrary *portLibrary, void *info,
+                       U_32 category, I_32 index, const char **name,
+                       void **value);
+#endif /* hygp_h */

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hynlshelpers.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hynlshelpers.h?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hynlshelpers.h (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hynlshelpers.h Wed Mar  1 07:42:53 2006
@@ -0,0 +1,20 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if !defined(hynlshelpers_h)
+#define hynlshelpers_h
+void nls_determine_locale (struct HyPortLibrary *portLibrary);
+#endif /* hynlshelpers_h */
+

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyportcontrol.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyportcontrol.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyportcontrol.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hyportcontrol.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,71 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+#include "hyport.h"
+#include "portpriv.h"
+
+#define _UTE_STATIC_
+#include "ut_hyprt.h"
+
+I_32 VMCALL
+hyport_control (struct HyPortLibrary * portLibrary, char *key, UDATA value)
+{
+  /* return value of 0 is success */
+  if (!strcmp (HYPORT_CTLDATA_SIG_FLAGS, key))
+    {
+      portLibrary->portGlobals->control.sig_flags = value;
+      return 0;
+    }
+
+  if (!strcmp (HYPORT_CTLDATA_SHMEM_GROUP_PERM, key))
+    {
+      portLibrary->portGlobals->control.shmem_group_perm = value;
+      return 0;
+    }
+
+  if (!strcmp (HYPORT_CTLDATA_TRACE_START, key) && value)
+    {
+      UtInterface *utIntf = (UtInterface *) value;
+      utIntf->module->TraceInit (NULL, &UT_MODULE_INFO);
+      Trc_PRT_PortInitStages_Event1 ();
+      return 0;
+    }
+  if (!strcmp (HYPORT_CTLDATA_TRACE_STOP, key) && value)
+    {
+      UtInterface *utIntf = (UtInterface *) value;
+      utIntf->module->TraceTerm (NULL, &UT_MODULE_INFO);
+      return 0;
+    }
+
+#if defined(WIN32)
+  if (!strcmp ("SIG_INTERNAL_HANDLER", key))
+    {
+      /* used by optimized code to implement fast signal handling on Windows */
+      extern int structuredExceptionHandler (struct HyPortLibrary
+                                             *portLibrary,
+                                             hysig_handler_fn handler,
+                                             void *handler_arg, U_32 flags,
+                                             EXCEPTION_POINTERS *
+                                             exceptionInfo);
+      *(int (**)
+        (struct HyPortLibrary *, hysig_handler_fn, void *, U_32,
+         EXCEPTION_POINTERS *)) value = structuredExceptionHandler;
+      return 0;
+    }
+#endif
+
+  return 1;
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystrftime.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystrftime.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystrftime.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystrftime.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,364 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * @ingroup Port
+ * @brief Time formatting utilities.
+ */
+
+#include <string.h>
+#include "hycomp.h"
+#include "hyport.h"
+
+typedef struct HyTimeInfo
+{
+  U_32 second;
+  U_32 minute;
+  U_32 hour;
+  U_32 day;
+  U_32 month;
+  U_32 year;
+} HyTimeInfo;
+
+static void gettimestruct (I_64 millis, struct HyTimeInfo *tm);
+
+/**
+ * Returns the current time in as a formatted string.  Formatted according to the 'format' parameter.
+ *
+ * @param[in] portLibrary  The port library.
+ * @param[in,out] buf A pointer to a character buffer where the resulting time string will be stored.
+ * @param[in] bufLen The length of the 'buf' character buffer.
+ * @param[in] format The format string, ordinary characters placed in the format string are copied.
+ * to buf without conversion.  Conversion specifiers are introduced by a '%' character, and are replaced in buf as follows:.
+ * <ul>
+ * <li>%b The abbreviated month name in english
+ * <li>%d The  day  of the month as a decimal number (range 0 to 31).
+ * <li>%H The hour as a decimal number using a 24-hour  clock (range 00 to 23).
+ * <li>%m The month as a decimal number (range 01 to 12).
+ * <li>%M The minute as a decimal number.
+ * <li>%S The second as a decimal number.
+ * <li>%Y The year as a decimal number including the century.
+ * <li>%% A literal '%' character.
+ * <li>all other '%' specifiers will be ignored
+ * </ul>
+ *
+ * @return The number of characters placed in the array buf, not including NULL terminator.
+ * If the value equals 'bufLen', it means that the array was too small.
+ */
+U_32 VMCALL
+hystrftime (struct HyPortLibrary *portLibrary, char *buf, U_32 bufLen,
+            const char *format)
+{
+  I_64 millis;
+  U_32 index = 0;
+  HyTimeInfo tm;
+  static const char abbMonthName[12][4] =
+    { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT",
+    "NOV", "DEC"
+  };
+
+  if (buf == NULL || bufLen < 1)
+    {
+      return 0;
+    }
+
+  millis = portLibrary->time_current_time_millis (portLibrary);
+
+  gettimestruct (millis, &tm);
+
+  /* format the date/time information according to the format string */
+  while (*format && index < bufLen - 1)
+    {
+      switch (*format)
+        {
+        case '%':
+          format++;
+          switch (*format)
+            {
+            case '\0':
+              /* end of the format string */
+              break;
+            case '%':
+              /* literal '%' */
+              buf[index] = '%';
+              index++;
+              format++;
+              break;
+            case 'Y':
+              if (index + 4 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%04u", tm.year);
+              format++;
+              break;
+            case 'm':
+              if (index + 2 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%02u", tm.month);
+              format++;
+              break;
+            case 'b':
+              if (index + strlen (abbMonthName[tm.month - 1]) >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%s",
+                                         abbMonthName[tm.month - 1]);
+              format++;
+              break;
+            case 'd':
+              if (index + 2 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%02u", tm.day);
+              format++;
+              break;
+            case 'H':
+              if (index + 2 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%02u", tm.hour);
+              format++;
+              break;
+            case 'M':
+              if (index + 2 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%02u", tm.minute);
+              format++;
+              break;
+            case 'S':
+              if (index + 2 >= bufLen - 1)
+                {
+                  return bufLen;
+                }
+              index +=
+                portLibrary->str_printf (portLibrary, buf + index,
+                                         bufLen - index, "%02u", tm.second);
+              format++;
+              break;
+            default:
+              /* ignore unsupported format specifiers */
+              format++;
+              break;
+            }
+          break;
+        default:
+          buf[index] = *format++;
+          index++;
+          break;
+        }
+    }
+
+  buf[index] = 0;
+
+  return index;
+}
+
+static void
+gettimestruct (I_64 millis, struct HyTimeInfo *tm)
+{
+#define HYSFT_NUM_MONTHS         (12)
+#define HYSFT_NUM_SECS_IN_MINUTE (60)
+#define HYSFT_NUM_SECS_IN_HOUR   (60*HYSFT_NUM_SECS_IN_MINUTE)
+#define HYSFT_NUM_SECS_IN_DAY    (24*(I_32)HYSFT_NUM_SECS_IN_HOUR)
+#define HYSFT_NUM_SECS_IN_YEAR   (365*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_LEAP_YEAR (366*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_JAN (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_FEB (28*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_MAR (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_APR (30*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_MAY (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_JUN (30*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_JUL (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_AUG (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_SEP (30*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_OCT (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_NOV (30*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_DEC (31*HYSFT_NUM_SECS_IN_DAY)
+#define HYSFT_NUM_SECS_IN_LEAP_FEB (29*HYSFT_NUM_SECS_IN_DAY)
+
+  I_64 timeLeft;
+  I_32 i;
+  I_32 *secondsInMonth;
+  I_32 normalSecondsInMonth[12] = {
+    HYSFT_NUM_SECS_IN_JAN,
+    HYSFT_NUM_SECS_IN_FEB,
+    HYSFT_NUM_SECS_IN_MAR,
+    HYSFT_NUM_SECS_IN_APR,
+    HYSFT_NUM_SECS_IN_MAY,
+    HYSFT_NUM_SECS_IN_JUN,
+    HYSFT_NUM_SECS_IN_JUL,
+    HYSFT_NUM_SECS_IN_AUG,
+    HYSFT_NUM_SECS_IN_SEP,
+    HYSFT_NUM_SECS_IN_OCT,
+    HYSFT_NUM_SECS_IN_NOV,
+    HYSFT_NUM_SECS_IN_DEC
+  };
+  I_32 leapYearSecondsInMonth[12] = {
+    HYSFT_NUM_SECS_IN_JAN,
+    HYSFT_NUM_SECS_IN_LEAP_FEB,
+    HYSFT_NUM_SECS_IN_MAR,
+    HYSFT_NUM_SECS_IN_APR,
+    HYSFT_NUM_SECS_IN_MAY,
+    HYSFT_NUM_SECS_IN_JUN,
+    HYSFT_NUM_SECS_IN_JUL,
+    HYSFT_NUM_SECS_IN_AUG,
+    HYSFT_NUM_SECS_IN_SEP,
+    HYSFT_NUM_SECS_IN_OCT,
+    HYSFT_NUM_SECS_IN_NOV,
+    HYSFT_NUM_SECS_IN_DEC
+  };
+  BOOLEAN leapYear = FALSE;
+
+  if (!tm)
+    return;
+
+  memset (tm, 0, sizeof (struct HyTimeInfo));
+
+  tm->year = 1970;
+
+  /* -- obtain the current time in seconds */
+  timeLeft = millis / 1000;
+  /* -- determine the year */
+  while (timeLeft)
+    {
+      I_64 numSecondsInAYear = HYSFT_NUM_SECS_IN_YEAR;
+      leapYear = FALSE;
+      if (tm->year % 4 == 0)
+        {
+          /* potential leap year */
+          if ((tm->year % 100 != 0) || (tm->year % 400 == 0))
+            {
+              /* we have leap year! */
+              leapYear = TRUE;
+              numSecondsInAYear = HYSFT_NUM_SECS_IN_LEAP_YEAR;
+            }
+        }
+      if (timeLeft < numSecondsInAYear)
+        {
+          /* under a year's time left */
+          break;
+        }
+      /* increment the year and take the appropriate number 
+         of seconds off the timeLeft */
+      tm->year++;
+      timeLeft -= numSecondsInAYear;
+    }
+  /* -- determine the month */
+  if (leapYear)
+    {
+      secondsInMonth = leapYearSecondsInMonth;
+    }
+  else
+    {
+      secondsInMonth = normalSecondsInMonth;
+    }
+  for (i = 0; i < HYSFT_NUM_MONTHS; i++)
+    {
+      if (timeLeft >= secondsInMonth[i])
+        {
+          timeLeft -= secondsInMonth[i];
+        }
+      else
+        {
+          break;
+        }
+    }
+  tm->month = i + 1;
+  /* -- determine the day of the month */
+  tm->day = 1;
+  while (timeLeft)
+    {
+      if (timeLeft >= HYSFT_NUM_SECS_IN_DAY)
+        {
+          timeLeft -= HYSFT_NUM_SECS_IN_DAY;
+        }
+      else
+        {
+          break;
+        }
+      tm->day++;
+    }
+  /* -- determine the hour of the day */
+  tm->hour = 0;
+  while (timeLeft)
+    {
+      if (timeLeft >= HYSFT_NUM_SECS_IN_HOUR)
+        {
+          timeLeft -= HYSFT_NUM_SECS_IN_HOUR;
+        }
+      else
+        {
+          break;
+        }
+      tm->hour++;
+    }
+  /* -- determine the minute of the hour */
+  tm->minute = 0;
+  while (timeLeft)
+    {
+      if (timeLeft >= HYSFT_NUM_SECS_IN_MINUTE)
+        {
+          timeLeft -= HYSFT_NUM_SECS_IN_MINUTE;
+        }
+      else
+        {
+          break;
+        }
+      tm->minute++;
+    }
+  /* -- and the rest is seconds */
+  tm->second = (U_32) timeLeft;
+
+#undef HYSFT_NUM_MONTHS
+#undef HYSFT_NUM_SECS_IN_MINUTE
+#undef HYSFT_NUM_SECS_IN_HOUR
+#undef HYSFT_NUM_SECS_IN_DAY
+#undef HYSFT_NUM_SECS_IN_YEAR
+#undef HYSFT_NUM_SECS_IN_LEAP_YEAR
+#undef HYSFT_NUM_SECS_IN_JAN
+#undef HYSFT_NUM_SECS_IN_FEB
+#undef HYSFT_NUM_SECS_IN_MAR
+#undef HYSFT_NUM_SECS_IN_APR
+#undef HYSFT_NUM_SECS_IN_MAY
+#undef HYSFT_NUM_SECS_IN_JUN
+#undef HYSFT_NUM_SECS_IN_JUL
+#undef HYSFT_NUM_SECS_IN_AUG
+#undef HYSFT_NUM_SECS_IN_SEP
+#undef HYSFT_NUM_SECS_IN_OCT
+#undef HYSFT_NUM_SECS_IN_NOV
+#undef HYSFT_NUM_SECS_IN_DEC
+#undef HYSFT_NUM_SECS_IN_LEAP_FEB
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystsl.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystsl.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystsl.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hystsl.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,238 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * @ingroup Port
+ * @brief Static shared library
+ */
+#include <string.h>
+#include <stdlib.h>
+#include "hyport.h"
+
+#if defined(HYVM_STATIC_LINKAGE)
+#include "hystatic.h"
+extern HyPrimitiveTable HyLinkedNatives;
+void *
+upLookupName (char *name, HyPrimitiveTableSlot * table)
+{
+  void *result;
+  while (!((table->name == (char *) 0) && (table->funcOrTable == (void *) 0)))
+    {
+      if (table->name == (char *) 0)
+        {
+          result =
+            upLookupName (name,
+                          (HyPrimitiveTableSlot *) (table->funcOrTable));
+          if (result != (void *) 0 /*HyDefaultFailPrimitive */ )
+            return result;
+        }
+      else
+        {
+          if (strcmp (name, table->name) == 0)
+            return table->funcOrTable;
+        }
+      table++;
+    }
+  return (void *) 0 /*HyDefaultFailPrimitive */ ;
+}
+
+/**
+ * Close a static library.
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] descriptor Static library handle to close.
+ *
+ * @return 0 on success, any other value on failure.
+ */
+UDATA VMCALL
+hysl_up_close_shared_library (struct HyPortLibrary *portLibrary,
+                              UDATA descriptor)
+{
+  return 0;
+}
+
+/** 
+ * Opens a static library .
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] name path Null-terminated string containing the static library.
+ * @param[out] descriptor Pointer to memory which is filled in with static-library handle on success.
+ * @param[in] decorate Boolean value indicates whether name should be decorated if it contains path information and cannot be found.
+ *
+ * @return 0 on success, any other value on failure.
+ *
+ * @note contents of descriptor are undefined on failure.
+ */
+UDATA VMCALL
+hysl_up_open_shared_library (struct HyPortLibrary * portLibrary, char *name,
+                             UDATA * descriptor, BOOLEAN decorate)
+{
+  void *result;
+  if (result = upLookupName (name, &HyLinkedNatives[0]))
+    {
+      *descriptor = (UDATA) result;
+      return 0;
+    }
+  else
+    {
+      return portLibrary->error_set_last_error_with_message (portLibrary,
+                                                             HYPORT_SL_NOT_FOUND,
+                                                             "Not statically linked");
+    }
+}
+
+/**
+ * Search for a function named 'name' taking argCount in the static library 'descriptor'.
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] descriptor Static library to search.
+ * @param[in] name Function to look up.
+ * @param[out] func Pointer to the function.
+ * @param[in] argSignature Argument signature.
+ *
+ * @return 0 on success, any other value on failure.
+ *
+ * @note contents of func are undefined on failure.
+ */
+UDATA VMCALL
+hysl_up_lookup_name (struct HyPortLibrary * portLibrary, UDATA descriptor,
+                     char *name, UDATA * func, const char *argSignature)
+{
+  void *result;
+  if (result = upLookupName (name, (HyPrimitiveTableSlot *) descriptor))
+    {
+      *func = (UDATA) result;
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+typedef struct
+{
+  UDATA descriptor;
+  UDATA tag;
+} hysplit_sl_handle;
+#define HYFLAG_SL_LINKED 0
+#define HYFLAG_SL_LOADED 1
+/* support BOTH types of libraries */
+/** 
+ * Opens a static/shared library .
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] name path Null-terminated string containing the library.
+ * @param[out] descriptor Pointer to memory which is filled in with library handle on success.
+ * @param[in] decorate Boolean value indicates whether name should be decorated if it contains path information and cannot be found.
+ *
+ * @return 0 on success, any other value on failure.
+ *
+ * @note contents of descriptor are undefined on failure.
+ */
+UDATA VMCALL
+hysl_split_open_shared_library (struct HyPortLibrary *portLibrary, char *name,
+                                UDATA * descriptor, BOOLEAN decorate)
+{
+  UDATA result;
+  UDATA tag;
+  tag = HYFLAG_SL_LINKED;
+  result =
+    hysl_up_open_shared_library (portLibrary, name, descriptor, decorate);
+  if (result == HYPORT_SL_NOT_FOUND)
+    {
+      result =
+        hysl_open_shared_library (portLibrary, name, descriptor, decorate);
+      tag = HYFLAG_SL_LOADED;
+    }
+  if (result == 0)
+    {
+      hysplit_sl_handle *handle;
+      handle =
+        portLibrary->mem_allocate_memory (portLibrary,
+                                          sizeof (hysplit_sl_handle));
+      if (handle == NULL)
+        {
+          if (tag == HYFLAG_SL_LOADED)
+            {
+              hysl_close_shared_library (portLibrary, *descriptor);
+            }
+          return portLibrary->error_set_last_error_with_message (portLibrary,
+                                                                 HYPORT_SL_INVALID,
+                                                                 "Out of memory");
+        }
+      handle->descriptor = *descriptor;
+      handle->tag = tag;
+      *descriptor = (UDATA) handle;
+    }
+  return result;
+}
+
+/**
+ * Close a static or shared library.
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] descriptor Library handle to close.
+ *
+ * @return 0 on success, any other value on failure.
+ */
+UDATA VMCALL
+hysl_split_close_shared_library (struct HyPortLibrary * portLibrary,
+                                 UDATA descriptor)
+{
+  hysplit_sl_handle *handle = (hysplit_sl_handle *) descriptor;
+  UDATA result;
+  if (handle->tag == HYFLAG_SL_LOADED)
+    {
+      result = hysl_close_shared_library (portLibrary, handle->descriptor);
+    }
+  else
+    {
+      result = hysl_up_close_shared_library (portLibrary, handle->descriptor);
+    }
+  portLibrary->mem_free_memory (portLibrary, handle);
+  return result;
+}
+
+/**
+ * Search for a function named 'name' taking argCount in the static/shared library 'descriptor'.
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] descriptor Library to search.
+ * @param[in] name Function to look up.
+ * @param[out] func Pointer to the function.
+ * @param[in] argSignature Argument signature.
+ *
+ * @return 0 on success, any other value on failure.
+ *
+ * @note contents of func are undefined on failure.
+ */
+UDATA VMCALL
+hysl_split_lookup_name (struct HyPortLibrary * portLibrary, UDATA descriptor,
+                        char *name, UDATA * func, const char *argSignature)
+{
+  hysplit_sl_handle *handle = (hysplit_sl_handle *) descriptor;
+  if (handle->tag == HYFLAG_SL_LOADED)
+    {
+      return hysl_lookup_name (portLibrary, handle->descriptor, name, func,
+                               argSignature);
+    }
+  else
+    {
+      return hysl_up_lookup_name (portLibrary, handle->descriptor, name, func,
+                                  argSignature);
+    }
+}
+#endif

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hytlshelpers.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hytlshelpers.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hytlshelpers.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/hytlshelpers.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,210 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * @ingroup Port
+ * @brief Per Thread Buffer Support
+ *
+ * Per thread buffers are used to store information that is not sharable among the threads.  
+ * For example when an OS system call fails the error code associated with that error is
+ * relevant to the thread that called the OS function; it has no meaning to any other thread.
+ *
+ * This file contains the functions supported by the port library for creating, accessing and
+ * destroying per thread buffers.@see hyportptb.h for details on the per thread buffer structure.
+ *
+ * Only the function @hyport_tls_free is available via the port library function table.  The rest of
+ * the functions are helpers for the port library only.
+ */
+#include <string.h>
+#include "hyport.h"
+#include "portpriv.h"
+#include "hythread.h"
+#include "hyportptb.h"
+
+/**
+ * @internal
+ * @brief Per Thread Buffer Support
+ *
+ * Get a per thread buffer.
+ *
+ * @param[in] portLibrary The port library.
+ *
+ * @return The per thread buffer on success, NULL on failure.
+ */
+void *VMCALL
+hyport_tls_get (struct HyPortLibrary *portLibrary)
+{
+  PortlibPTBuffers_t ptBuffers;
+
+  ptBuffers =
+    hythread_tls_get (hythread_self (), portLibrary->portGlobals->tls_key);
+  if (NULL == ptBuffers)
+    {
+      MUTEX_ENTER (portLibrary->portGlobals->tls_mutex);
+
+      ptBuffers =
+        portLibrary->mem_allocate_memory (portLibrary,
+                                          sizeof (PortlibPTBuffers_struct));
+      if (NULL != ptBuffers)
+        {
+          if (0 ==
+              hythread_tls_set (hythread_self (),
+                                portLibrary->portGlobals->tls_key, ptBuffers))
+            {
+              memset (ptBuffers, 0, sizeof (PortlibPTBuffers_struct));
+              ptBuffers->next = portLibrary->portGlobals->buffer_list;
+              if (portLibrary->portGlobals->buffer_list)
+                {
+                  ((PortlibPTBuffers_t) portLibrary->portGlobals->
+                   buffer_list)->previous = ptBuffers;
+                }
+              portLibrary->portGlobals->buffer_list = ptBuffers;
+            }
+          else
+            {
+              portLibrary->mem_free_memory (portLibrary, ptBuffers);
+              ptBuffers = NULL;
+            }
+        }
+
+      MUTEX_EXIT (portLibrary->portGlobals->tls_mutex);
+    }
+  return ptBuffers;
+}
+
+/**
+ * @brief Per Thread Buffer Support
+ * 
+ * Free the per thread buffers.
+ *
+ * @param[in] portLibrary The port library.
+ */
+void VMCALL
+hyport_tls_free (struct HyPortLibrary *portLibrary)
+{
+  PortlibPTBuffers_t ptBuffers;
+
+  MUTEX_ENTER (portLibrary->portGlobals->tls_mutex);
+  ptBuffers =
+    hythread_tls_get (hythread_self (), portLibrary->portGlobals->tls_key);
+  if (ptBuffers)
+    {
+      hythread_tls_set (hythread_self (), portLibrary->portGlobals->tls_key,
+                        NULL);
+
+      /* Unlink */
+      if (ptBuffers->next)
+        {
+          ptBuffers->next->previous = ptBuffers->previous;
+        }
+      if (portLibrary->portGlobals->buffer_list == ptBuffers)
+        {
+          portLibrary->portGlobals->buffer_list = ptBuffers->next;
+        }
+      else
+        {
+          if (ptBuffers->previous)
+            {
+              ptBuffers->previous->next = ptBuffers->next;
+            }
+        }
+
+      hyport_free_ptBuffer (portLibrary, ptBuffers);
+    }
+  MUTEX_EXIT (portLibrary->portGlobals->tls_mutex);
+}
+
+/**
+ * @internal
+ * @brief PortLibrary startup.
+ * 
+ * This function is called during startup of the portLibrary.  Any resources that are required for
+ * the portl library thread local storage operations may be created here.  All resources created here should be destroyed
+ * in @ref hyport_tls_shutdown.
+ *
+ * @param[in] portLibrary The port library
+ *
+ * @return 0 on success, negative error code on failure.  Error code values returned are
+ * \arg HYPORT_ERROR_STARTUP_TLS
+ * \arg HYPORT_ERROR_STARTUP_TLS_ALLOC
+ * \arg HYPORT_ERROR_STARTUP_TLS_MUTEX
+ */
+I_32 VMCALL
+hyport_tls_startup (struct HyPortLibrary *portLibrary)
+{
+  if (hythread_tls_alloc (&portLibrary->portGlobals->tls_key))
+    {
+      return HYPORT_ERROR_STARTUP_TLS_ALLOC;
+    }
+
+  if (!MUTEX_INIT (portLibrary->portGlobals->tls_mutex))
+    {
+      return HYPORT_ERROR_STARTUP_TLS_MUTEX;
+    }
+
+  return 0;
+}
+
+/**
+ * @internal
+ * @brief PortLibrary shutdown.
+ *
+ * This function is called during shutdown of the portLibrary.  Any resources that were created by 
+ * @ref hyport_tls_startup should be destroyed here.
+ *
+ * @param[in] HyPortLibrary The port library
+ */
+void VMCALL
+hyport_tls_shutdown (struct HyPortLibrary *portLibrary)
+{
+  PortlibPTBuffers_t ptBuffers, next;
+
+  /* Free all remaining buffer sets */
+  MUTEX_ENTER (portLibrary->portGlobals->tls_mutex);
+  ptBuffers = portLibrary->portGlobals->buffer_list;
+  while (NULL != ptBuffers)
+    {
+      next = ptBuffers->next;
+      hyport_free_ptBuffer (portLibrary, ptBuffers);
+      ptBuffers = next;
+    }
+  portLibrary->portGlobals->buffer_list = NULL;
+  MUTEX_EXIT (portLibrary->portGlobals->tls_mutex);
+
+  /* Now dispose of the tls_key and the mutex */
+  hythread_tls_free (portLibrary->portGlobals->tls_key);
+  MUTEX_DESTROY (portLibrary->portGlobals->tls_mutex);
+}
+
+/**
+ * @internal
+ * @brief Per Thread Buffer Support
+ * 
+ * Get the per thread buffer for a thread. If the buffer has not been allocated do not allocate a new
+ * one, the function @ref hyport_tls_get is used for that purpose. This function is not exported outside 
+ * the port library as most applications will want a per thread buffer created to store their data.  This 
+ * function is used to access existing data in the per thread buffers.
+ *
+ * @param[in] portLibrary The port library.
+ *
+ * @return The per thread buffer, may be NULL.
+ */
+void *VMCALL
+hyport_tls_peek (struct HyPortLibrary *portLibrary)
+{
+  return hythread_tls_get (hythread_self (),
+                           portLibrary->portGlobals->tls_key);
+}

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/port_copyright.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/port_copyright.c?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/port_copyright.c (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/port_copyright.c Wed Mar  1 07:42:53 2006
@@ -0,0 +1,19 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* A copyright string included in each DLL and executable */
+
+const char hyCopyright[] =
+  "(c) Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable.";

Added: incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/portnls.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/portnls.h?rev=382065&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/portnls.h (added)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/shared/port/portnls.h Wed Mar  1 07:42:53 2006
@@ -0,0 +1,43 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if !defined(portnls_h)
+#define portnls_h
+#include "hyport.h"
+/* 0x504f5254 = PORT */
+#define HYNLS_PORT_NLS_FAILURE__PREFIX "PORT000"
+
+#define HYNLS_PORT_FILE_MEMORY_ALLOCATE_FAILURE__MODULE 0x504f5254
+#define HYNLS_PORT_FILE_MEMORY_ALLOCATE_FAILURE__ID 1
+#define HYNLS_PORT_FILE_MEMORY_ALLOCATE_FAILURE HYNLS_PORT_FILE_MEMORY_ALLOCATE_FAILURE__MODULE, HYNLS_PORT_FILE_MEMORY_ALLOCATE_FAILURE__ID
+
+#define HYNLS_PORT_SL_UNKOWN_ERROR__MODULE 0x504f5254
+#define HYNLS_PORT_SL_UNKOWN_ERROR__ID 2
+#define HYNLS_PORT_SL_UNKOWN_ERROR HYNLS_PORT_SL_UNKOWN_ERROR__MODULE, HYNLS_PORT_SL_UNKOWN_ERROR__ID
+
+#define HYNLS_PORT_ERROR_OPERATION_FAILED__MODULE 0x504f5254
+#define HYNLS_PORT_ERROR_OPERATION_FAILED__ID 17
+#define HYNLS_PORT_ERROR_OPERATION_FAILED HYNLS_PORT_ERROR_OPERATION_FAILED__MODULE, HYNLS_PORT_ERROR_OPERATION_FAILED__ID
+
+#define HYNLS_PORT_SL_UNABLE_TO_RESOLVE_REFERENCES__MODULE 0x504f5254
+#define HYNLS_PORT_SL_UNABLE_TO_RESOLVE_REFERENCES__ID 15
+#define HYNLS_PORT_SL_UNABLE_TO_RESOLVE_REFERENCES HYNLS_PORT_SL_UNABLE_TO_RESOLVE_REFERENCES__MODULE, HYNLS_PORT_SL_UNABLE_TO_RESOLVE_REFERENCES__ID
+
+#define HYNLS_PORT_SL_INTERNAL_ERROR__MODULE 0x504f5254
+#define HYNLS_PORT_SL_INTERNAL_ERROR__ID 16
+#define HYNLS_PORT_SL_INTERNAL_ERROR HYNLS_PORT_SL_INTERNAL_ERROR__MODULE, HYNLS_PORT_SL_INTERNAL_ERROR__ID
+
+#endif
+