Frank Mehnert Frank.Mehnert at
Thu Mar 13 07:48:45 PST 1997

Hi kaffe programmers,

while working on Chorus port of kaffe I havn't understand the working of
buildStackTrace yet. My port works with native threads on a single
processor. In exceptions I get different outputs between kaffe/Solaris and
kaffe/Chorus (kaffe 0.8.2/interpreter). Look at the following short
program (from the test package of kaffe):

=== listing === listing ===
public class T3 extends Thread {
  String name;
  long counter, delay;

  public T3 ( String name, long delay, int priority ) {;

  public void run () {
    while (true) {
      if ( (++counter % 100) == 0 ){
	System.out.println( name + " : " + counter);
	try { Thread.sleep( delay ); }
	catch ( Exception x ) { x.printStackTrace(); }

  public static void main ( String[] args ) {
    T3 a, b, c;
    a = new T3( "A", 500, Thread.NORM_PRIORITY);
    b = new T3( "  B", 200, Thread.MIN_PRIORITY);
    c = new T3( "    C", 100, Thread.MIN_PRIORITY);
    try { sleep(3000); }
    catch ( Exception e ) { e.printStackTrace(); }
    System.out.println("killing threads...");
    try { sleep(1000); }
    catch ( Exception e ) { e.printStackTrace(); }
=== listing === listing ===

This program creates three threads and kills them dirty after a while.
With kaffe/Solaris I get the output

   at java/lang/Throwable.<init>(line unknown, pc 5)
   at java/lang/Error.<init>(line unknown, pc 1)
   at java/lang/LinkageError.<init>(line unknown, pc 1)
   at java/lang/IncompatibleClassChangeError.<init>(line unknown, pc 1)
   at java/lang/NoSuchMethodError.<init>(line unknown, pc 1)
   at java/lang/Thread.destroy(line unknown, pc 4)

but with kaffe/Chorus I get

   at java/lang/Throwable.<init>(line unknown, pc 0x5)
   at java/lang/Error.<init>(line unknown, pc 0x1)
   at java/lang/LinkageError.<init>(line unknown, pc 0x1)
   at java/lang/IncompatibleClassChangeError.<init>(line unknown, pc 0x1)
   at java/lang/NoSuchMethodError.<init>(line unknown, pc 0x1)
   at java/lang/Thread.destroy(line unknown, pc 0x4)
   at T3.main(38)

If I create four threads, I get four times Then I think
in several times this buildStackTrace dont work correctly (seg fault),
possibly because the stack may be different from kaffe with internal

The main reason, I think, is that I not playing with the cjbuf. In
kaffe/kaffevm/thread.c there are the lines

	#if defined(INTERPRETER)
	    TCTX(currentThread)->exceptPtr = (void*)cjbuf;
	    cjbuf = 0;
	    lastThread = currentThread;
	    currentThread = threadQhead[i];
	    THREADSWITCH(TCTX(currentThread), TCTX(lastThread));
	#if defined(INTERPRETER)
	    cjbuf = (vmException*)TCTX(lastThread)->exceptPtr;

Because native threads, I can't do something like that.

(Sorry for the long question, I hope you will understand my problem.)
Thanks in advance (also for the previos answers!)


PS: Tim, NullPointerExceptions become seg faults because you havn't
    set HAVE_NULLPOINTER_TRAP in kaffe.def. This you made for
    performance reasons, isn't it so?

Frank Mehnert
email: Frank.Mehnert at

More information about the kaffe mailing list