* Merged twisti branch to default. This merge introduces C++ wrapper
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Thu, 7 Aug 2008 21:43:02 +0000 (17:43 -0400)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Thu, 7 Aug 2008 21:43:02 +0000 (17:43 -0400)
classes for Java object access.

configure.ac
src/threads/posix/thread-posix.cpp
src/threads/posix/thread-posix.hpp
src/vm/signal.c
src/vm/signallocal.h
src/vmcore/os.hpp
src/vmcore/suck.c

index e50b39d1230f3c0c956084eaa74a946b8674d83f..3853a5853b4d12ec92d784c5e5b42ba6ae155242 100644 (file)
@@ -37,13 +37,13 @@ AC_PREFIX_DEFAULT(/usr/local/cacao)
 
 dnl Set optimization and debugging for all architectures and systems.
 if test x"$CFLAGS" = "x"; then
-    OPT_CFLAGS="-O0 -g"
+    OPT_CFLAGS="-g -O0"
 else
     OPT_CFLAGS=$CFLAGS
 fi
 
 if test x"$CXXFLAGS" = "x"; then
-    OPT_CXXFLAGS="-O0 -g"
+    OPT_CXXFLAGS="-g -O0"
 else
     OPT_CXXFLAGS=$CXXFLAGS
 fi
@@ -56,7 +56,7 @@ alpha | alphaev56 | alphapca56 )
     JAVA_ARCH="alpha"
     ;;
 
-arm | armv4 | armv4tl | armv5b | armv5l | armv5tejl )
+arm | armv4 | armv4tl | armv5b | armv5l | armv5tel | armv5tejl )
     ARCH_DIR="arm"
     ARCH_FLAGS="-D__ARM__"
     JAVA_ARCH="arm"
@@ -70,7 +70,7 @@ hppa2.0 )
 
 i386 | i486 | i586 | i686 )
     ARCH_DIR="i386"
-    ARCH_FLAGS="-D__I386__"
+    ARCH_FLAGS="-m32 -D__I386__"
     JAVA_ARCH="i386"
     ;;
 
@@ -89,13 +89,13 @@ mips | mipsel )
 
 powerpc )
     ARCH_DIR="powerpc"
-    ARCH_FLAGS="-D__POWERPC__"
+    ARCH_FLAGS="-m32 -D__POWERPC__"
     JAVA_ARCH="ppc"
     ;;
 
 powerpc64 )
     ARCH_DIR="powerpc64"
-    ARCH_FLAGS="-D__POWERPC64__"
+    ARCH_FLAGS="-m64 -D__POWERPC64__"
     JAVA_ARCH="ppc64"
     ;;
 
index 2e0ac45b590658415a9649d8b69149c60831755d..6db5dfdab5e7d79f6b3ade281e7675469e8ce54c 100644 (file)
@@ -109,10 +109,10 @@ extern "C" {
    from Boehm-GC. */
 
 /*
-   This is a very simple semaphore implementation for darwin. It
+   This is a very simple semaphore implementation for Darwin. It
    is implemented in terms of pthreads calls so it isn't async signal
    safe. This isn't a problem because signals aren't used to
-   suspend threads on darwin.
+   suspend threads on Darwin.
 */
    
 static int sem_init(sem_t *sem, int pshared, int value)
@@ -120,12 +120,9 @@ static int sem_init(sem_t *sem, int pshared, int value)
        if (pshared)
                assert(0);
 
-       sem->value = value;
-    
        sem->mutex = new Mutex();
-
-       if (pthread_cond_init(&sem->cond, NULL) < 0)
-               return -1;
+       sem->cond  = new Condition();
+       sem->value = value;
 
        return 0;
 }
@@ -133,14 +130,8 @@ static int sem_init(sem_t *sem, int pshared, int value)
 static int sem_post(sem_t *sem)
 {
        sem->mutex->lock();
-
        sem->value++;
-
-       if (pthread_cond_signal(&sem->cond) < 0) {
-               sem->mutex->unlock();
-               return -1;
-       }
-
+       sem->cond->signal();
        sem->mutex->unlock();
 
        return 0;
@@ -151,12 +142,10 @@ static int sem_wait(sem_t *sem)
        sem->mutex->lock();
 
        while (sem->value == 0) {
-#error We cannot call pthread_cond_wait on a Mutex-class pointer.
-               pthread_cond_wait(&sem->cond, &sem->mutex);
+               sem->cond->wait(sem->mutex);
        }
 
        sem->value--;
-
        sem->mutex->unlock();
 
        return 0;
@@ -164,9 +153,7 @@ static int sem_wait(sem_t *sem)
 
 static int sem_destroy(sem_t *sem)
 {
-       if (pthread_cond_destroy(&sem->cond) < 0)
-               return -1;
-
+       delete sem->cond;
        delete sem->mutex;
 
        return 0;
@@ -1531,7 +1518,7 @@ void threads_thread_interrupt(threadobject *t)
 
        /* Interrupt blocking system call using a signal. */
 
-       pthread_kill(t->tid, Signal_THREAD_INTERRUPT);
+       pthread_kill(t->tid, Signal_INTERRUPT_SYSTEM_CALL);
 
        t->waitcond->signal();
 
index 452322305d57c84602319868e8ac87db6b64b788..e1e412ecb8402ac1eb945ea55d0ab61bb3250954 100644 (file)
@@ -69,8 +69,8 @@ typedef struct threadobject threadobject;
 # include <mach/mach.h>
 
 typedef struct {
-       mutex_t mutex;
-       pthread_cond_t cond;
+       Mutex* mutex;
+       Condition* cond;
        int value;
 } sem_t;
 
index 0efc5c6138cdfe17e70170b976d24d472d6e411e..fe2ded0407914f833090cd2b6e4695b6db82118e 100644 (file)
@@ -191,7 +191,7 @@ bool signal_init(void)
 #if defined(ENABLE_THREADS)
        /* SIGHUP handler for threads_thread_interrupt */
 
-       signal_register_signal(Signal_THREAD_INTERRUPT, (functionptr) signal_handler_sighup, 0);
+       signal_register_signal(Signal_INTERRUPT_SYSTEM_CALL, (functionptr) signal_handler_sighup, 0);
 #endif
 
 #if defined(ENABLE_THREADS) && defined(ENABLE_GC_CACAO)
@@ -339,6 +339,9 @@ void signal_thread_handler(int sig)
                }
                break;
        }
+#else
+       default:
+               vm_abort("signal_thread_handler: Unknown signal %d", sig);
 #endif
        }
 }
index 35a80d1051627011339a8515b26af35d657efb12..799e4bfcb1da6243c18c24d4c891e3e8325c2426 100644 (file)
@@ -39,7 +39,13 @@ extern "C" {
 
 // Signal defines.
 
-#define Signal_THREAD_INTERRUPT    SIGHUP
+#if defined(__LINUX__)
+// See openjdk/jdk/src/solaris/native/java/net/linux_close.c (sigWakeup)
+// See openjdk/jdk/src/solaris/native/sun/nio/ch/NativeThread.c (INTERRUPT_SIGNAL)
+# define Signal_INTERRUPT_SYSTEM_CALL    (__SIGRTMAX - 2)
+#else
+# define Signal_INTERRUPT_SYSTEM_CALL    SIGHUP
+#endif
 
 
 /* function prototypes ********************************************************/
index a519728dd79661cf24ad4519d617bc0b5c1f2875..613af9f12128e659ee590871ef8990f9e5b94521 100644 (file)
@@ -420,8 +420,8 @@ inline static void *system_realloc(void *ptr, size_t size)
 #endif
 }
 
-#if defined(__LINUX__)
 inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *))
+/*
 #elif defined(__SOLARIS__)
 inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **))
 #elif defined(__IRIX__)
@@ -429,9 +429,14 @@ inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(
 #else
 inline int os::scandir(const char *dir, struct dirent ***namelist, int(*filter)(struct dirent *), int(*compar)(const void *, const void *))
 #endif
+*/
 {
 #if defined(HAVE_SCANDIR)
+# if defined(__LINUX__)
        return ::scandir(dir, namelist, filter, compar);
+# else
+       return ::scandir(dir, namelist, (int (*)(struct dirent*)) filter, compar);
+# endif
 #else
 # error scandir not available
 #endif
index 6a7d4e92ea325dfad3eeb08b2e4b06a3d75b9fa2..b3c05cfe497614d6634e8479dfdb12e329822b4d 100644 (file)
@@ -81,11 +81,7 @@ bool suck_init(void)
 
 *******************************************************************************/
 
-#if defined(__LINUX__)
 static int scandir_filter(const struct dirent *a)
-#else
-static int scandir_filter(struct dirent *a)
-#endif
 {
        s4 namlen;