[kaffe] CVS kaffe (guilhem): Fixlets for Darwin.

Kaffe CVS cvs-commits at kaffe.org
Sat Feb 5 13:21:23 PST 2005


PatchSet 5474 
Date: 2005/02/05 21:15:39
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixlets for Darwin.

        * kaffe/kaffevm/systems/unix-pthreads/signal.c
        (nullException): Better handling of stack overflows though we
        would need a stack switch here.

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
        (jthread_exit): Awake the first thread and exits there.

        * test/regression/SystemLoaderTest.java
        (l, k): Use another name to avoid conflicts with ArrayForName.

        * test/regression/WaitTest.java: Synchronize then start the thread
        to be sure the notification is sent after the first thread is
        going into wait.

Members: 
	kaffe/kaffevm/systems/unix-pthreads/signal.c:1.18->1.19 
	kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.69->1.70 
	test/regression/SystemLoaderTest.java:1.1->1.2 
	test/regression/WaitTest.java:1.1->1.2 

Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.18 kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.19
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.18	Sat Jan  1 09:03:50 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c	Sat Feb  5 21:15:39 2005
@@ -105,10 +105,17 @@
 #if defined(STACK_POINTER)
 	current_thread = jthread_current();
 	stackptr = (void *)STACK_POINTER(GET_SIGNAL_CONTEXT_POINTER(ctx));
+	/* Here we have a stupid heuristic which may not work rightfully
+	 * if kaffe allocates a big buffer using alloca (in that case we
+	 * will get an NPE). But it is better than the previous case which was
+	 * heating nearly all NPEs on Darwin.
+	 */
 #if defined(STACK_GROWS_UP)
-	if (current_thread != NULL && stackptr >= current_thread->stackMax)
+	if (current_thread != NULL && stackptr >= current_thread->stackMax &&
+	    stackptr <= (void *)((uintp)current_thread->stackMax+1024))
 #else
-	if (current_thread != NULL && stackptr <= current_thread->stackMin)
+	if (current_thread != NULL && stackptr <= current_thread->stackMin &&
+	    stackptr >= (void *)((uintp)current_thread->stackMax-1024))
 #endif
 	  stackOverflowHandler(EXCEPTIONFRAMEPTR);
 	else
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.69 kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.70
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.69	Sat Feb  5 19:42:12 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c	Sat Feb  5 21:15:40 2005
@@ -1068,6 +1068,7 @@
 	  if ( (cur != firstThread) && (firstThread->active == 0) ) {
 		/* if the firstThread has already been frozen, it's not in the cache list */
 		pthread_cancel( firstThread->tid);
+		repsem_post (&firstThread->sem);
 	  }
 
 	  unprotectThreadList(cur);
@@ -1102,6 +1103,11 @@
 	 * linux-threads "feature")
 	 */
 	repsem_wait( &cur->sem);
+
+	/* We put here a safe-guard in case the pthread_cancel has not managed
+	 * to do its job and that repsem_wait awakes.
+	 */
+	pthread_exit(NULL);
   }
   else {
 	/* flag that we soon will get a new cache entry (would be annoying to
Index: kaffe/test/regression/SystemLoaderTest.java
diff -u kaffe/test/regression/SystemLoaderTest.java:1.1 kaffe/test/regression/SystemLoaderTest.java:1.2
--- kaffe/test/regression/SystemLoaderTest.java:1.1	Wed Aug 30 19:38:13 2000
+++ kaffe/test/regression/SystemLoaderTest.java	Sat Feb  5 21:15:41 2005
@@ -2,22 +2,22 @@
  * Check that our system class loader doesn't initialize classes too early
  */
 
-class l {
+class SLTest_class1 {
 	static {
-		System.out.println("l.init invoked");
+		System.out.println("SLTest_class1.init invoked");
 	}
 }
 
-class k extends l {
+class SLTest_class2 extends SLTest_class1 {
 	static {
-		System.out.println("k.init invoked");
+		System.out.println("SLTest_class2.init invoked");
 	}
 }
 
 public class SystemLoaderTest extends ClassLoader {
 
     public static void main(String []av) throws Exception {
-	Class c = new SystemLoaderTest().loadClass("k");
+	Class c = new SystemLoaderTest().loadClass("SLTest_class2");
 	System.out.println("LOADED");
 	c.newInstance();
 	System.out.println("DONE");
@@ -26,8 +26,8 @@
 
 /* Expected Output:
 LOADED
-l.init invoked
-k.init invoked
+SLTest_class1.init invoked
+SLTest_class2.init invoked
 DONE
 */
 
Index: kaffe/test/regression/WaitTest.java
diff -u kaffe/test/regression/WaitTest.java:1.1 kaffe/test/regression/WaitTest.java:1.2
--- kaffe/test/regression/WaitTest.java:1.1	Fri Feb 21 09:51:11 2003
+++ kaffe/test/regression/WaitTest.java	Sat Feb  5 21:15:41 2005
@@ -45,11 +45,12 @@
 	    }
 	}
 
-	new Thread(new WaitTest(waiter)).start();
 	synchronized( waiter )
 	{
 	    final long time = 500;
 	    
+	    new Thread(new WaitTest(waiter)).start();
+
 	    start = System.currentTimeMillis();
 	    waiter.wait(Long.MAX_VALUE);
 	    end = System.currentTimeMillis();



More information about the kaffe mailing list