PatchSet 5645 
Date: 2005/04/02 17:44:40
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixes for netbsd.

        * kaffe/kaffevm/systems/unix-jthreads/jthread.c,
        kaffe/kaffevm/systems/unix-jthreads/jthread.h:
        (jthread_is_blocking): Added to the API for compatibility with
        unix-pthreads.

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c,
        kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:
        (jthread_exit): Changed shutdown loop to take into account
        modifications to activeThreads list.
        (jthread_is_blocking): New jthread call.

        * kaffe/kaffevm/systems/unix-pthreads/lock-impl.c
        (clearBlockState): Set active to 0 when exiting.

        * kaffe/kaffevm/systems/unix-pthreads/syscalls.c
        (jthreadedRecvFrom): Fixed logic to avoid eating all CPU.

        * config/katomic.h (__atomic_val_bysize, __atomic_bool_bysize):
        If gcc is 2.95 then the syntax is also different.

Members: 
        ChangeLog:1.3815->1.3816 
        config/katomic.h:1.2->1.3 
        kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.130->1.131 
        kaffe/kaffevm/systems/unix-jthreads/jthread.h:1.67->1.68 
        kaffe/kaffevm/systems/unix-pthreads/lock-impl.c:1.21->1.22 
        kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.29->1.30 
        kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.80->1.81 
        kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.38->1.39 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3815 kaffe/ChangeLog:1.3816
--- kaffe/ChangeLog:1.3815      Sat Apr  2 16:38:21 2005
+++ kaffe/ChangeLog     Sat Apr  2 17:44:40 2005
@@ -1,3 +1,25 @@
+2005-04-02  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/systems/unix-jthreads/jthread.c,
+       kaffe/kaffevm/systems/unix-jthreads/jthread.h:
+       (jthread_is_blocking): Added to the API for compatibility with
+       unix-pthreads.
+
+       * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c,
+       kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:
+       (jthread_exit): Changed shutdown loop to take into account
+       modifications to activeThreads list.
+       (jthread_is_blocking): New jthread call.
+       
+       * kaffe/kaffevm/systems/unix-pthreads/lock-impl.c
+       (clearBlockState): Set active to 0 when exiting.
+
+       * kaffe/kaffevm/systems/unix-pthreads/syscalls.c
+       (jthreadedRecvFrom): Fixed logic to avoid eating all CPU.
+       
+       * config/katomic.h (__atomic_val_bysize, __atomic_bool_bysize): 
+       If gcc is 2.95 then the syntax is also different.
+
 2005-04-02  Dalibor Topic  <[EMAIL PROTECTED]>
 
        * libraries/javalib/Makefile.am.in: (compile-classes)
Index: kaffe/config/katomic.h
diff -u kaffe/config/katomic.h:1.2 kaffe/config/katomic.h:1.3
--- kaffe/config/katomic.h:1.2  Fri Apr  1 21:32:21 2005
+++ kaffe/config/katomic.h      Sat Apr  2 17:44:46 2005
@@ -28,7 +28,42 @@
    and following args.  */
    
    
-#if __GNUC__ == 2 
+#if defined(__GNUC__) && __GNUC__ == 2 
+
+#if __GNUC_MINOR__ == 95
+
+#define __atomic_val_bysize(pre, post, mem, args...)                         \
+  ({                                                                         \
+    __typeof (*mem) __result;                                                \
+    if (sizeof (*mem) == 1)                                                  \
+      __result = pre##_8_##post (mem, args);                                 \
+    else if (sizeof (*mem) == 2)                                             \
+      __result = pre##_16_##post (mem, args);                        \
+    else if (sizeof (*mem) == 4)                                             \
+      __result = pre##_32_##post (mem, args);                        \
+    else if (sizeof (*mem) == 8)                                             \
+      __result = pre##_64_##post (mem, args);                        \
+    else                                                                     \
+      abort ();                                                                
      \
+    __result;                                                                \
+  })
+#define __atomic_bool_bysize(pre, post, mem, args...)                        \
+  ({                                                                         \
+    int __result;                                                            \
+    if (sizeof (*mem) == 1)                                                  \
+      __result = pre##_8_##post (mem, args);                                 \
+    else if (sizeof (*mem) == 2)                                             \
+      __result = pre##_16_##post (mem, args);                        \
+    else if (sizeof (*mem) == 4)                                             \
+      __result = pre##_32_##post (mem, args);                        \
+    else if (sizeof (*mem) == 8)                                             \
+      __result = pre##_64_##post (mem, args);                        \
+    else                                                                     \
+      abort ();                                                                
      \
+    __result;                                                                \
+  })
+
+#else /* __GNUC_MINOR__ == 95 */
 
 #define __atomic_val_bysize(pre, post, mem, args...)                         \
   ({                                                                         \
@@ -61,7 +96,9 @@
     __result;                                                                \
   })
 
-#else
+#endif /* __GNUC_MINOR__ == 95 */
+
+#else /* __GNUC__ */
   
 #define __atomic_val_bysize(pre, post, mem, ...)                             \
   ({                                                                         \
Index: kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c
diff -u kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.130 
kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.131
--- kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.130   Sun Mar 20 
20:30:43 2005
+++ kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c Sat Apr  2 17:44:45 2005
@@ -3387,6 +3387,13 @@
        intsRestore();
 }
 
+int jthread_is_blocking(int fd)
+{
+       assert(fd < FD_SETSIZE);
+
+       return blockingFD[fd];
+}
+
 jlong jthread_get_usage(jthread_t jt)
 {
        jlong retval;
Index: kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.h
diff -u kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.h:1.67 
kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.h:1.68
--- kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.h:1.67    Sun Mar 20 
20:30:43 2005
+++ kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.h Sat Apr  2 17:44:45 2005
@@ -337,6 +337,8 @@
 
 void jthread_set_blocking(int fd, int blocking);
 
+int jthread_is_blocking(int fd);
+
 /* restore an fd, i.e., put it in blocking state without async I/O */
 #define JTHREAD_RESTORE_FD
 void jthreadRestoreFD(int fd);
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/lock-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/lock-impl.c:1.21 
kaffe/kaffe/kaffevm/systems/unix-pthreads/lock-impl.c:1.22
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/lock-impl.c:1.21  Sat Apr  2 
15:33:36 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/lock-impl.c       Sat Apr  2 
17:44:46 2005
@@ -77,7 +77,11 @@
    * This is needed for Darwin's pthreads.
    */
   if (cur->status == THREAD_KILL && ((cur->blockState & BS_THREAD) == 0))
+  {
+    /* Mark the thread as inactive now to acknowledge the shutdown. */
+    cur->active = 0;
     pthread_exit(NULL);
+  }
 
   pthread_sigmask(SIG_SETMASK, old_mask, NULL);
   /* Here the state is not SS_PENDING_SUSPEND so releasing the signal will
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.29 
kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.30
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.29   Thu Feb 10 
21:48:35 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c        Sat Apr  2 
17:44:46 2005
@@ -586,6 +586,7 @@
        int r;
        jlong deadline = 0;
        int poll_timeout;
+       int blocking = jthread_is_blocking(fd);
 
        jthread_set_blocking(fd, 0);
        SET_DEADLINE(deadline, timeout)
@@ -597,12 +598,12 @@
                }
                IGNORE_EINTR(r)
                poll_timeout = deadline - currentTime();
-               if (poll_timeout > 0) {
+               if (poll_timeout > 0 || timeout == NOTIMEOUT) {
                        waitForTimeout(fd, poll_timeout);
                }
                BREAK_IF_LATE(deadline, timeout)
        }
-       jthread_set_blocking(fd, 1);
+       jthread_set_blocking(fd, blocking);
        SET_RETURN_OUT(r, out, r)
        return (r);
 }
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.80 
kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.81
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.80        Sat Apr 
 2 15:33:36 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c     Sat Apr  2 
17:44:46 2005
@@ -1060,10 +1060,11 @@
                repsem_post(&t->sem);
          }
 
-         for ( t=activeThreads; t != NULL; t = t->next ){
+         t = activeThreads;
+         while (t != NULL) {
                /* We must not kill the current thread and the main thread
                 */
-               if ( t != cur && t != firstThread) {
+               if ( t != cur && t != firstThread && t->active) {
                  /* Mark the thread as to be killed. */
                  t->status = THREAD_KILL;
                  /* Send an interrupt event to the remote thread to wake up.
@@ -1074,7 +1075,10 @@
                  unprotectThreadList(cur);
                  pthread_join(t->tid, NULL);
                  protectThreadList(cur);
-               }
+
+                 t = activeThreads;
+               } else
+                 t = t->next;
          }
 
 #if defined(KAFFE_VMDEBUG)
@@ -1550,6 +1554,20 @@
   protectThreadList(cur);
   jthread_walkLiveThreads (func, private);
   unprotectThreadList(cur);
+}
+
+int
+jthread_is_blocking (int fd)
+{
+  int r;
+ 
+  r = fcntl(fd, F_GETFL, 0);
+  if (r < 0) {
+    perror("fcntl(F_GETFL)");
+    return 0;
+  }
+                 
+  return (r & O_NONBLOCK) != 0;
 }
 
 void
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-internal.h
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.38 
kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.39
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.38    Sun Mar 
20 20:30:44 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-internal.h Sat Apr  2 
17:44:46 2005
@@ -336,6 +336,11 @@
  */
 void jthread_set_blocking (int fd, int blocking);
 
+/**
+ * Check the blocking state of a file descriptor
+ */
+int jthread_is_blocking (int fd);
+
 void jthread_suspend(UNUSED jthread_t jt, UNUSED void *suspender);
 
 void jthread_resume(UNUSED jthread_t jt, UNUSED void *suspender);

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to