You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/10/05 08:32:33 UTC

svn commit: r821695 - in /commons/sandbox/runtime/trunk/src: main/native/include/ main/native/os/unix/ main/native/shared/ main/native/test/ test/org/apache/commons/runtime/

Author: mturk
Date: Mon Oct  5 06:32:32 2009
New Revision: 821695

URL: http://svn.apache.org/viewvc?rev=821695&view=rev
Log:
Rewrite posix exceptions

Modified:
    commons/sandbox/runtime/trunk/src/main/native/include/acr.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_tlsd.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c
    commons/sandbox/runtime/trunk/src/main/native/os/unix/signals.c
    commons/sandbox/runtime/trunk/src/main/native/shared/memory.c
    commons/sandbox/runtime/trunk/src/main/native/shared/nbb.c
    commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
    commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr.h?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr.h Mon Oct  5 06:32:32 2009
@@ -173,6 +173,23 @@
 #include <io.h>
 #include <process.h>    /* getpid() */
 #include <sys/stat.h>
+#else
+/* Add POSIX specific includes
+ */
+#include <signal.h>
+#include <setjmp.h>
+#if HAVE_UCONTEXT_H
+#include <ucontext.h>
+#endif
+#if defined(SOLARIS22) && defined(HAS_NATIVE_THREADS)
+#include <thread.h>
+#define pthread_key_t       thread_key_t
+#define pthread_key_create  thr_key_create
+#define pthread_setspecific thr_setspecific
+#define pthread_getspecific thr_getspecific
+#else
+#include <pthread.h>
+#endif
 #endif
 
 /* JNI header */

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Mon Oct  5 06:32:32 2009
@@ -18,7 +18,6 @@
 #define _ACR_ERROR_H
 
 #include "acr.h"
-#include "acr_tlsd.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -65,54 +64,64 @@
     ACR_EX_LEN
 } acr_trowclass_e;
 
-#if defined(ACR_WANT_MEMPROTECT) && defined(DEBUG)
+#if defined(DEBUG)
 #ifdef _MSC_VER
-#define ACR_TRY             __try
-#define ACR_CATCH()         __except(EXCEPTION_EXECUTE_HANDLER)
-
-#else
-#include <signal.h>
-#include <setjmp.h>
-#if HAVE_UCONTEXT_H
-#include <ucontext.h>
-#endif
-typedef void (_seh_handler_t)(int);
-#if HAVE_SIGSETJMP
-#define SEH_SETJMP(E)        sigsetjmp((E), 1)
-#define SEH_DOJUMP(E, V)     siglongjmp((E), (V))
-#else
-#define SEH_SETJMP(E)        setjmp((E))
-#define SEH_DOJUMP(E, V)     longjmp((E), (V))
-#endif
-static void _seh_handler(int val)
-{
-    acr_thread_local_t *tlsd = ACR_TLSD();
-    if (tlsd && (val == SIGSEGV || val == SIGBUS)) {
-        SEH_DOJUMP(tlsd->seh_jump, val);
-    }
-}
-
-#define ACR_TRY                                                               \
-    int _seh_error = 0;                                                       \
+#define __TRY              { __try
+#define __EXCEPT          __except(EXCEPTION_EXECUTE_HANDLER)
+#define __ENDTRY           }
+
+#else
+/* Use the thread safe signals by catching the
+ * SIGSEGV and SIGBUS.
+ * This is as close as we can emulate the undocumented
+ * Microsoft SEH.
+ * Anyhow the code is usable only in ceratin situations where
+ * those signals are known to get rised. Thus we enable the SEH
+ * only in DEBUG mode. Proper guarding should be done in
+ * Java code by making sure the params are valid. However
+ * the things like invalid pointers or double memory free
+ * cannot be effectively handled because the OS usually doesn't
+ * rise a signal, but rather corrupts the memory causing
+ * failures at some later point.
+ */
+extern pthread_key_t seh_ctxt_key;
+typedef struct acr_seh_ctxt_t {
+        int         init;
+        const char *file;
+        int         line;
+        sigjmp_buf  jump;
+} acr_seh_ctxt_t;
+#define __TRY                                                                 \
     {                                                                         \
-    acr_thread_local_t *_tlsd = ACR_TLSD();                                   \
-    _seh_handler_t* _org_sigseg_handler = signal(SIGSEGV, _seh_handler);      \
-    _seh_handler_t* _org_sigbus_handler = signal(SIGBUS,  _seh_handler);      \
-    if (_tlsd && (_seh_error = SEH_SETJMP(_tlsd->seh_jump)))                  \
-            goto _seh_catch_block;
-
-#define ACR_CATCH()                                                           \
-_seh_catch_block:                                                             \
-    signal(SIGSEGV, _org_sigseg_handler);                                     \
-    signal(SIGBUS,  _org_sigbus_handler);                                     \
-    } if (_seh_error)
+        acr_seh_ctxt_t _seh_ctxt = { 0, __FILE__, __LINE__ };                 \
+        pthread_setspecific(seh_ctxt_key, &_seh_ctxt);                        \
+        for (;;) {                                                            \
+            if (_seh_ctxt.init)  {                                            \
+                do
+
+#define __EXCEPT                                                              \
+                while (0);                                                    \
+                break;                                                        \
+            } else {                                                          \
+                _seh_ctxt.init = 1;                                           \
+                if (sigsetjmp(_seh_ctxt.jump, 1) == 0) {                      \
+                    continue;                                                 \
+                } else
+
+#define __ENDTRY                                                              \
+            }                                                                 \
+            break;                                                            \
+        }                                                                     \
+        pthread_setspecific(seh_ctxt_key, NULL);                              \
+    }
 
 #endif
 #else
-#define ACR_TRY
-#define ACR_CATCH() if (0)
+#define __TRY       {
+#define __EXCEPT    if (0)
+#define __ENDTRY    }
 
-#endif /* HAVE_MEMPROTECT */
+#endif /* DEBUG */
 
 #define ACR_THROW_IO_IF_ERR(S)                                              \
     if ((S) && IS_VALID_HANDLE(_E)) {                                       \
@@ -1337,7 +1346,8 @@
                 || (s) == ERROR_BAD_NETPATH \
                 || (s) == ERROR_BAD_NET_NAME \
                 || (s) == ERROR_BAD_PATHNAME \
-                || (s) == ERROR_INVALID_DRIVE)
+                || (s) == ERROR_INVALID_DRIVE \
+                || (s) == ERROR_DIRECTORY)
 #define ACR_STATUS_IS_ENOSPC(s)         ((s) == ACR_ENOSPC \
                 || (s) == ERROR_DISK_FULL)
 #define ACR_STATUS_IS_ENOMEM(s)         ((s) == ACR_ENOMEM \

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_tlsd.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_tlsd.h?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_tlsd.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_tlsd.h Mon Oct  5 06:32:32 2009
@@ -52,25 +52,6 @@
     JNIEnv         *env;
     unsigned int    id;
     int             jvm_attached;
-#if defined(DEBUG)
-#if defined(WIN32)
-    /* SEH requires no special TLSD data
-     * on Windows
-     */
-#else
-#if HAVE_UCONTEXT_H
-    /* TODO: Use setcontext instead jump
-     * However it just might be an overhead.
-     */
-    ucontext_t  seh_uctx;
-#endif
-#if HAVE_SIGSETJMP
-    sigjmp_buf  seh_jump;
-#else
-    jmp_buf     seh_jump;
-#endif /* HAVE_SIGSETJMP    */
-#endif /* WIN32             */
-#endif /* DEBUG             */
 };
 
 /**

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c Mon Oct  5 06:32:32 2009
@@ -21,16 +21,6 @@
 #include "acr_tlsd.h"
 #include "acr_vm.h"
 
-#if defined(SOLARIS22) && defined(HAS_NATIVE_THREADS)
-#include <thread.h>
-#define pthread_key_t       thread_key_t
-#define pthread_key_create  thr_key_create
-#define pthread_setspecific thr_setspecific
-#define pthread_getspecific thr_getspecific
-#else
-#include <pthread.h>
-#endif
-
 /**
  * Posix main
  *

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/signals.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/signals.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/signals.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/signals.c Mon Oct  5 06:32:32 2009
@@ -31,9 +31,122 @@
  * signals befre calling init.
  */
 static struct sigaction *_signalset[ACR_NUMSIG];
+
+#if defined(DEBUG)
+pthread_key_t seh_ctxt_key;
+static void seh_sig_handler(int sig)
+{
+    acr_seh_ctxt_t *ctxt = (acr_seh_ctxt_t *)pthread_getspecific(seh_ctxt_key);
+    if (sig == SIGSEGV || sig == SIGBUS) {
+        if (ctxt && ctxt->init) {
+            fprintf(stderr, "[error] Executing SEH handler for signal: %d (%s)\n",
+                    sig, ACR_SignalDescription(sig));
+            fprintf(stderr, "        Line: %d - %s\n", ctxt->line, ctxt->file);
+            fflush(stderr);
+            siglongjmp(ctxt->jump, 1);
+        }
+        else if (_signalset[sig]->sa_handler != SIG_DFL &&
+                 _signalset[sig]->sa_handler != SIG_IGN &&
+                 _signalset[sig]->sa_handler != SIG_ERR) {
+            /* This should invoke JVM crash report
+             */
+            (*_signalset[sig]->sa_handler)(sig);
+        }
+        else {
+            /* Not inside JVM.
+             * Print some warning and abort
+             */
+            fprintf(stderr, "[error] Cannot find default handler for signal '%s'\n",
+                    ACR_SignalDescription(sig));
+            fputs("        Aborting ...\n", stderr);
+            fflush(stderr);
+            abort();
+        }
+    }
+}
+
+/*
+ * 1. Signals SIGKILL, SIGSTOP cannot be blocked.
+ * 2. Signals SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU are not blocked because
+ *    dealing with these signals is dangerous.
+ * 3. Signals SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGTRAP, SIGIOT, SIGEMT,
+ *    SIGBUS, SIGSYS, SIGSTKFLT are not blocked because these are synchronous
+ *    signals, which may require immediate intervention, otherwise the
+ *    process may starve.
+ */
+static int sig_blocked[] = {
+#ifdef SIGHUP
+    SIGHUP,
+#endif
+#ifdef SIGINT
+    SIGINT,
+#endif
+#ifdef SIGQUIT
+    SIGQUIT,
+#endif
+#ifdef SIGPIPE
+    SIGPIPE,
+#endif
+#ifdef SIGALRM
+    SIGALRM,
+#endif
+#ifdef SIGTERM
+    SIGTERM,
+#endif
+#ifdef SIGUSR1
+    SIGUSR1,
+#endif
+#ifdef SIGUSR2
+    SIGUSR2,
+#endif
+#ifdef SIGCHLD
+    SIGCHLD,
+#endif
+#ifdef SIGCLD
+    SIGCLD,
+#endif
+#ifdef SIGURG
+    SIGURG,
+#endif
+#ifdef SIGIO
+    SIGIO,
+#endif
+#ifdef SIGPOLL
+    SIGPOLL,
+#endif
+#ifdef SIGXCPU
+    SIGXCPU,
+#endif
+#ifdef SIGXFSZ
+    SIGXFSZ,
+#endif
+#ifdef SIGVTALRM
+    SIGVTALRM,
+#endif
+#ifdef SIGPROF
+    SIGPROF,
+#endif
+#ifdef SIGPWR
+    SIGPWR,
+#endif
+#ifdef SIGLOST
+    SIGLOST,
+#endif
+#ifdef SIGWINCH
+    SIGWINCH,
+#endif
+    -1
+};
+
+#endif
+
+static int initialized = 0;
 int acr_SignalsInit()
 {
     int i, rc = 0;
+
+    if (initialized++)
+        return 0;
     for (i = 0; i < ACR_NUMSIG; i++) {
         _signalset[i] = s_calloc(struct sigaction, 1);
         if (_signalset[i] == NULL)
@@ -61,6 +174,31 @@
             _signalset[i]->sa_handler = SIG_ERR;
         }
     }
+#if defined(DEBUG)
+    {
+        struct sigaction act;
+
+        if (pthread_key_create(&seh_ctxt_key, NULL))
+            return ACR_GET_OS_ERROR();
+        act.sa_handler = seh_sig_handler;
+        sigemptyset(&act.sa_mask);
+        act.sa_flags = 0;
+#ifdef SA_INTERRUPT
+        act.sa_flags |= SA_INTERRUPT;
+#endif
+        for (i = 0; sig_blocked[i] > 0; i++) {
+            /* Block most signals during SIGSEGV handling
+             */
+            sigaddset(&act.sa_mask, sig_blocked[i]);
+        }
+        /* Handle SIGSEGV signal
+         */
+        sigaction(SIGSEGV, &act, (struct sigaction *)NULL);
+#if defined(HPUX11) || defined(DARWIN)
+        sigaction(SIGBUS,  &act, (struct sigaction *)NULL);
+#endif
+    }
+#endif
     return rc;
 }
 

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/memory.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/memory.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/memory.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/memory.c Mon Oct  5 06:32:32 2009
@@ -18,7 +18,6 @@
 #include "acr_private.h"
 #include "acr_arch.h"
 #include "acr_memory.h"
-#define  ACR_WANT_MEMPROTECT
 #include "acr_error.h"
 #include "acr_pointer.h"
 #include "acr_vm.h"
@@ -479,12 +478,16 @@
         return NULL;
     }
     /* Copy the original content */
-    ACR_TRY {
+    __TRY
+    {
         memcpy(dp, sp + so, ss);
         po = ACR_NewBasicPointer(_E, dp, ss, memory_pointer_cleanup);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
     if (!po) {
         /* Destroy the the memory we failed to attach
          * to the new Pointer object.
@@ -520,11 +523,15 @@
     }
 
     /* Do a memcpy */
-    ACR_TRY {
+    __TRY
+    {
         memcpy(d + dn, s + sn, cs);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, move0)(ACR_JNISTDARGS, jobject src,
@@ -553,11 +560,15 @@
     }
 
     /* Do a memmove */
-    ACR_TRY {
+    __TRY
+    {
         memmove(d + dn, s + sn, cs);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, clear0)(ACR_JNISTDARGS, jobject dst,
@@ -581,11 +592,15 @@
         return;
     }
     /* Do a memset */
-    ACR_TRY {
+    __TRY
+    {
         memset(d + dn, 0, cs);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, set0)(ACR_JNISTDARGS, jobject dst,
@@ -609,11 +624,15 @@
         return;
     }
     /* Do a memset */
-    ACR_TRY {
+    __TRY
+    {
         memset(d + dn, c, cs);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_JNI_EXPORT_DECLARE(jbyteArray, Memory, array0)(ACR_JNISTDARGS, jobject ptr,

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/nbb.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/nbb.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/nbb.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/nbb.c Mon Oct  5 06:32:32 2009
@@ -24,8 +24,6 @@
 #include "acr_arch.h"
 #include "acr_clazz.h"
 #include "acr_pointer.h"
-
-#define  ACR_WANT_MEMPROTECT
 #include "acr_error.h"
 
 /**
@@ -414,14 +412,18 @@
          * Make sure you call Native.enableExceptionHandler() to
          * throw an exception instead.
          */
-        ACR_TRY {
+        __TRY
+        {
             x_free(mem);
-        } ACR_CATCH() {
+        }
+        __EXCEPT
+        {
             /* XXX: Unstable.
              * On linux this works only if MALLOC_CHECK_=1 envvar is set
              */
             ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
         }
+        __ENDTRY
     }
     else {
         ACR_ThrowException(_E, THROW_FMARK, ACR_EX_ENULL,
@@ -464,11 +466,15 @@
         return;
     }
     if ((m = (*_E)->GetDirectBufferAddress(_E, bb))) {
-        ACR_TRY {
+        __TRY
+        {
             memset(m, c, (size_t)count);
-        } ACR_CATCH() {
+        }
+        __EXCEPT
+        {
             ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
         }
+        __ENDTRY
     }
     else {
         ACR_ThrowException(_E, THROW_FMARK, ACR_EX_ENULL,
@@ -513,12 +519,16 @@
     }
     if ((s = (*_E)->GetDirectBufferAddress(_E, srcb))) {
         if ((d = (*_E)->GetDirectBufferAddress(_E, dstb))) {
-            ACR_TRY {
+            __TRY
+            {
                 memcpy((char *)d + (size_t)dsto, (char *)s + (size_t)srco,
                        (size_t)count);
-            } ACR_CATCH() {
+            }
+            __EXCEPT
+            {
                 ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
             }
+            __ENDTRY
         }
         else {
             ACR_ThrowException(_E, THROW_FMARK, ACR_EX_ENULL,
@@ -530,4 +540,3 @@
                            ACR_EISNULL);
     }
 }
-

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Mon Oct  5 06:32:32 2009
@@ -21,7 +21,6 @@
 
 #include "acr.h"
 #include "acr_private.h"
-#define  ACR_WANT_MEMPROTECT
 #include "acr_error.h"
 #include "acr_clazz.h"
 #include "acr_pointer.h"
@@ -180,44 +179,59 @@
     jint rv = 0;
     UNREFERENCED_O;
 
-    ACR_TRY {
+    __TRY
+    {
         rv = *(N2P(a, char *));
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
     return rv;
 }
 
 ACR_PTR_EXPORT_DECLARE(void, poke0)(ACR_JNISTDARGS, jniptr a, jint v)
 {
     UNREFERENCED_O;
-    ACR_TRY {
+    __TRY
+    {
         *(N2P(a, char *)) = (char)(v & 0xFF);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_PTR_EXPORT_DECLARE(void, copy0)(ACR_JNISTDARGS, jniptr s,
                                     jniptr d, jniptr l)
 {
     UNREFERENCED_O;
-    ACR_TRY {
+    __TRY
+    {
         memcpy(N2P(d, void *), N2P(s, const void *), (size_t)l);
-    } ACR_CATCH() {
+    }
+    __EXCEPT {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_PTR_EXPORT_DECLARE(void, move0)(ACR_JNISTDARGS, jniptr s,
                                     jniptr d, jniptr l)
 {
     UNREFERENCED_O;
-    ACR_TRY {
+    __TRY
+    {
         memmove(N2P(d, void *), N2P(s, const void *), (size_t)l);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_PTR_EXPORT_DECLARE(int, memcmp0)(ACR_JNISTDARGS, jniptr a,
@@ -225,14 +239,18 @@
 {
     int rv;
     UNREFERENCED_O;
-    ACR_TRY {
+    __TRY
+    {
         rv = memcmp(N2P(a, void *), N2P(b, const void *), (size_t)n);
         if (rv)
             rv = rv > 0 ? 1 : -1;
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, ACR_EFAULT);
         rv = -1;
     }
+    __ENDTRY
     return rv;
 }
 

Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Mon Oct  5 06:32:32 2009
@@ -17,7 +17,6 @@
 #include "acr.h"
 #include "acr_private.h"
 #include "acr_arch.h"
-#define  ACR_WANT_MEMPROTECT
 #include "acr_error.h"
 #include "acr_string.h"
 #include "acr_memory.h"
@@ -444,12 +443,16 @@
 
 ACR_JNI_EXPORT_DECLARE(void, TestPrivate, test030)(ACR_JNISTDARGS, int d)
 {
-    ACR_TRY {
+    __TRY
+    {
         void *p = NULL;
         memset(p, 1, 100);
-    } ACR_CATCH() {
+    }
+    __EXCEPT
+    {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
     }
+    __ENDTRY
 }
 
 ACR_JNI_EXPORT_DECLARE(jobjectArray, TestPrivate, test031)(ACR_JNISTDARGS, jstring s)

Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=821695&r1=821694&r2=821695&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Mon Oct  5 06:32:32 2009
@@ -899,24 +899,26 @@
 
     // Some platforms become pretty unstable even on sucessful
     // handling of the SIGSEGV. The point is that this only
-    // helps in determining the cause of the fault,so that
+    // helps in determining the cause of the fault, so that
     // process can exit.
-    /*
+
     public void testMempotect()
         throws Throwable
     {
 
         if (Native.HAS_MAINTAINER_MODE) {
-            try {
-                test030(0);
-                fail("Exception not thrown");
-            } catch (Throwable t) {
-                assertSame("Wrong Exception class",
-                    java.lang.RuntimeException.class, t.getClass());
+            for (int i = 0; i < 10; i++) {
+                try {
+                    test030(0);
+                    fail("Exception not thrown");
+                } catch (Throwable t) {
+                    assertSame("Wrong Exception class",
+                        java.lang.RuntimeException.class, t.getClass());
+                }
             }
         }
     }
-    */
+
 
     public void testMszAnsi()
         throws Throwable