Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4038896

win32 application hanging in JDK1.1.1 but not JDK1.1

XMLWordPrintable

    • b01
    • x86
    • windows_nt
    • Not verified

      Oracle's WebForms applications is hanging on JDK1.1.1 but not JDK1.1
      The problem occurs on Win95 and WinNT using the latest build (3/12) of
      the JDK. Oracle has set up a test machine in my office to demonstrate, since
      the application is quite large and complex.

      To reproduce:

      run appletviewer /home/richie/orcl/x.html
      click on "All Widgets"
      (wait for the new window to appear)
      click "Exit" in the Main window.

      The application will appear to hang.

      After looking at the problem further and with the help of Jonathan, it
      appears that setDefaultFocus() is actually going into an endless loop.
      This is only caused if List.removeNotify() calls getSelectedIndexes(), which is
      happening in another thread (AWT-EventQueue).

      I added some debugging output to some of the code in question and it shows
      setDefaultFocus() appearing to get into an endless loop. What is strange to me
      is this ONLY occurs if List.removeNotify() calls getSelectedIndexes from another
      thread(probably really further down at the native method isSelected in awt_List.cpp).
      One question is why does removeNotify() needs to know which items are
      selected if it is in the process of removing that component?

      The stack trace shows the following at the time of the hang/loop.


      Full thread dump:
          "AWT-Finalizer" (TID:0xf75b30, sys_thread_t:0x888eb0, Win32ID:0x98, state:S)
              java.lang.Object.wait(Object.java:315)
              sun.awt.AWTFinalizer.run(AWTFinalizer.java:48)
          "Screen Updater" (TID:0xf5f540, sys_thread_t:0x85c8b0, Win32ID:0x7c, state:S
              java.lang.Object.wait(Object.java:315)
              sun.awt.ScreenUpdater.nextEntry(ScreenUpdater.java:78)
              sun.awt.ScreenUpdater.run(ScreenUpdater.java:98)
          "AWT-Windows" (TID:0xf5daf0, sys_thread_t:0x86ad10, Win32ID:0x8f, state:R) p
              sun.awt.windows.WWindowPeer.setDefaultFocus(WWindowPeer.java:120)
              sun.awt.windows.WToolkit.run(WToolkit.java:103)
              java.lang.Thread.run(Thread.java:474)
          "AWT-EventQueue-0" (TID:0xf5da28, sys_thread_t:0x869e70, Win32ID:0x5c, state

              sun.awt.windows.WListPeer.getSelectedIndexes(WListPeer.java:52)
              java.awt.List.removeNotify(List.java:116)
              java.awt.Container.remove(Container.java:314)
              java.awt.Container.remove(Container.java:351)
              oracle.forms.uiClient.v1_4.ui.UICommon.onDestroy(UICommon.java:1360)
              oracle.forms.uiClient.v1_4.ui.TListItem.onDestroy(TListItem.java:246)
              oracle.forms.uiClient.v1_4.engine.Runform.onDestroyHandler(Runform.java:
              oracle.forms.uiClient.v1_4.engine.Runform.processSet(Runform.java:1624)
              oracle.forms.uiClient.v1_4.engine.Runform.onMessage(Runform.java:1494)
              oracle.forms.uiClient.v1_4.ui.CheckboxItem.itemStateChanged(CheckboxItem

              java.awt.Checkbox.processItemEvent(Checkbox.java:288)
              java.awt.Checkbox.processEvent(Checkbox.java:269)
              java.awt.Component.dispatchEventImpl(Component.java:1442)
              java.awt.Component.dispatchEvent(Component.java:1382)
              java.awt.EventDispatchThread.run(EventDispatchThread.java:63)
          "thread applet-oracle.forms.uiClient.v1_4.engine.Runform" (TID:0xf5cc60, sys
      0x868ef0, Win32ID:0xa5, state:S) prio=4
              java.lang.Object.wait(Object.java:315)
              sun.applet.AppletPanel.getNextEvent(AppletPanel.java:204)
              sun.applet.AppletPanel.run(AppletPanel.java:230)
              java.lang.Thread.run(Thread.java:474)
          "Finalizer thread" (TID:0xf500d0, sys_thread_t:0x852bf0, Win32ID:0x9a, state
      2
          "main" (TID:0xf500a8, sys_thread_t:0x85c720, Win32ID:0xa1, state:S) prio=5
      Monitor Cache Dump:
          sun.awt.AWTFinalizer@F75B30/1012AA0: <unowned>
              Waiters: 1
          sun.applet.AppletViewerPanel@F5C928/FB6B20: <unowned>
              Waiters: 1
          java.lang.Object@F53AE0/F9CD58: owner "AWT-EventQueue-0" (0x869e70, 2 entrie
          java.awt.List@F6A4E0/1012180: owner "AWT-EventQueue-0" (0x869e70, 1 entry)
          sun.awt.ScreenUpdater@F5F540/FBFCE8: <unowned>
              Waiters: 1
          oracle.forms.uiClient.v1_4.ui.DrawnPanel@F6C8F8/FC0C30: owner "AWT-Windows"
       1 entry)
          oracle.forms.uiClient.v1_4.ui.TListItem@F6A580/1012008: owner "AWT-EventQueu
      9e70, 2 entries)
          java.lang.Boolean@F60118/FC1D80: owner "AWT-EventQueue-0" (0x869e70, 1 entry
      Registered Monitor Dump:
          Thread queue lock: <unowned>
              Waiters: 1
          Name and type hash table lock: <unowned>
          String intern lock: <unowned>
          JNI pinning lock: <unowned>
          JNI global reference lock: <unowned>
          BinClass lock: <unowned>
          Class loading lock: <unowned>
          Java stack lock: <unowned>
          Code rewrite lock: <unowned>
          Heap lock: <unowned>
          Has finalization queue lock: <unowned>
          Finalize me queue lock: <unowned>
              Waiters: 1
          Monitor cache expansion lock: <unowned>
          Monitor registry: <unowned>


      This is what happens after the exit button is clicked in our code, using the debugging statements
      I placed in the build:

      Thread[AWT-Windows,5,main]: setDefaultFocus(): start

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): START

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): after getComponentCount: 2

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 0

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): START

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): after getComponentCount: 1

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 0

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): START

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): after getComponentCount: 1

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 0

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): START

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): after getComponentCount: 9

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 0

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 1

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 2

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 3

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 4

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 5

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 6

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 7

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 8

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container: return

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container: return

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container: return

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): getContainerElement + 1

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): START

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): after getComponentCount: 0

      Thread[AWT-Windows,5,main]: setDefaultFocus(CONT): instance of Container: return

      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      Thread[AWT-EventQueue-0,5,main]: removeNotify(): start
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start

      Thread[AWT-EventQueue-0,5,main]: GETSELECTEDINDEXES: start
      Thread[AWT-EventQueue-0,5,main]: GETSELECTEDINDEXES: len: 5
      Thread[AWT-EventQueue-0,5,main]: GETSELECTEDINDEXES: loop start0
      IsItemSelected 0 start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      WWindowPeer_getContainerElement: Start
      WWindowPeer_getContainerElement: in monitor
      WWindowPeer_getContainerElement: Return
      [this repeats]

      Notice removeNotify() never ends and gets hung up in the native method call to isItemSelected().

            jlockesunw Jonathan Locke (Inactive)
            rschiavisunw Richard Schiavi (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: