[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Mac OS X 10.5 Leopard SWT symptom/bug?

In short, I am seeing different behaviour from an eclipse launched java 
app than a command line application... and the challenge is that 
-XstartOnFirstThread behaviour has changed in leopard in a way that 
classloaders (like Hibernate which use 
Thread.currentThread().getContextClassLoader() break.

Cross post from Jens post to see if others see this issue as well.

/dan


This pure SWT application seems to work:
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;


public class HelloWorld {
  private Display display;
  private Shell shell;

  public HelloWorld() {
   getClassLoader("before instantiation of first swt object");
    setUpDisplay();
    getClassLoader("after instantiation of swt objects");
    createLabel();
    createMenuBar();
    revealDisplay();
    
  }

  private void setUpDisplay() {
    display = new Display();
    shell = new Shell(display);
    shell.setSize(200, 100);
    shell.setText("SWTGreeter");
  }

  private void createMenuBar() {
    Menu menu = new Menu(shell, SWT.BAR);
    shell.setMenuBar(menu);
    MenuItem fileMenuItem = new MenuItem(menu, SWT.CASCADE);
    fileMenuItem.setText("File");
    MenuItem editMenuItem = new MenuItem(menu, SWT.CASCADE);
    editMenuItem.setText("Edit");
  }

  private void createLabel() {
    Label label = new Label(shell, SWT.CENTER);
    label.setText("Hello SWT");
    label.setBounds(shell.getClientArea());
  }

  private void revealDisplay() {
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
  
  private void getClassLoader(String loc) {
     ClassLoader cl = Thread.currentThread().getContextClassLoader();
     System.out.println(loc+": classloader resolvable? "+(cl!=null));
  }

  public static void main(String[] args) {
     ClassLoader cl = Thread.currentThread().getContextClassLoader();
     System.out.println("classloader from static main resolvable? " + 
(cl != null));
     new HelloWorld();
    
  }
}

responding when run within eclipse:
classloader from static main resolvable? false
before instantiation of first swt object: classloader resolvable? false
after instantiation of swt objects: classloader resolvable? false
Invalid memory access of location 00000000 eip=0045c2ab

knowing of course that SWT is an older version:
org.eclipse.swt.carbon.macosx_3.3.2.v3347a.jar

and responding when run at the commandline:
Montana:~/Documents/workspace/swt_test$ ./run.sh
launching HelloWorld with 
./bin:./libswt/org.eclipse.swt_3.3.2.v3347.jar:./libswt/org.eclipse.swt.c
arbon.macosx_3.3.2.v3347a.jar SWT from eclipse/Resources/MacOSX...
java -cp 
./bin:./libswt/org.eclipse.swt_3.3.2.v3347.jar:./libswt/org.eclipse.swt.c
arbon.macosx_3.3.2.v3347a.jar HelloWorld
classloader from static main resolvable? true
before instantiation of first swt object: classloader resolvable? true
./run.sh: line 5:  3743 Segmentation fault      java -cp $CLASSPATH 
HelloWorld

now try with latest swt daily (11/17)

launching HelloWorld with ./bin:./swt-3/swt.jar
java -cp ./bin:./swt-3/swt.jar HelloWorld
classloader from static main resolvable? true
before instantiation of first swt object: classloader resolvable? true
./run.sh: line 11:  3745 Segmentation fault      java -cp $CLASSPATH 
HelloWorld

launching with startOnFirstThread
java -XstartOnFirstThread -cp ./bin:./swt-3/swt.jar HelloWorld
classloader from static main resolvable? false
before instantiation of first swt object: classloader resolvable? false
after instantiation of swt objects: classloader resolvable? false
Invalid memory access of location 00000000 eip=0045c2ab
./run.sh: line 14:  3748 Bus error               java 
-XstartOnFirstThread -cp $CLASSPATH HelloWorld

In summary:
when SWT works (the third launch), the root classloader doesn't.