Java-Gaming.org    
Featured games (79)
games approved by the League of Dukes
Games in Showcase (476)
Games in Android Showcase (106)
games submitted by our members
Games in WIP (533)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Selector Deadlock on selector.close() ?  (Read 1368 times)
0 Members and 1 Guest are viewing this topic.
Offline bt_dan

Senior Newbie





« Posted 2003-09-19 22:38:43 »

What does this paragraph straight from http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/Selector.html javadocs on NIO mean regarding how to interrupt a select using close()?:
Quote
A thread blocked in one of the select() or select(long) methods may be interrupted by some other thread in one of three ways:

By invoking the selector's wakeup method,

By invoking the selector's close method, or

By invoking the blocked thread's interrupt method, in which case its interrupt status will be set and the selector's wakeup method will be invoked.

The close method synchronizes on the selector and all three key sets in the same order as in a selection operation.



The first part says that selector.close() will interupt the select(), but then it says that close() locks on the same keys as select(), meaning that it will wait forever until the select() is complete before closing.  So which should it be.  What I am seeing is that close() does not interrupt the select, but waits for select to finish.  Is this a bug, or by design?

Then down below in the close() method it states:
Quote
If a thread is currently blocked in one of this selector's selection methods then it is interrupted as if by invoking the selector's wakeup method.

Any uncancelled keys still associated with this selector are invalidated, their channels are deregistered, and any other resources associated with this selector are released.



However, this is not the case.  Simple example:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
import java.nio.channels.Selector;

public class SelectorDeadlock implements Runnable
{
     
      Thread _thisThread = null;
      Selector _selector = null;
     
      public SelectorDeadlock( )
      {
           
      }
     
     
      public static void main(String[] args)
      {
            SelectorDeadlock sd = null;
            try
            {
                  sd = new SelectorDeadlock( );
                  sd.start();
                  // wait 3 seconds
                 Thread.currentThread().sleep( 3000 );
                  // now try to close and see the deadlock
                 sd.closeSelector();
            }catch( Exception e )
            {
                  sd.stop();
                  e.printStackTrace();
            }
           
      }
     
      public void start( )throws Exception
      {
            if ( _selector == null )
            {
                  _selector = Selector.open();
            }
            if ( _thisThread == null )
            {
                  _thisThread = new Thread( this, "SelectorDeadlock" );
                  _thisThread.start();
            }
           
      }
     
      protected void stop()
      {
            if ( _thisThread != null )
            {
                  Thread threadTemp = _thisThread;
                  _thisThread = null;

                  threadTemp.interrupt(  );        
            }
      }
     
      public void closeSelector( )throws Exception
      {
            if ( _selector != null )
            {
                  System.out.println("Attempting to close selector");
                  _selector.close();
                  System.out.println("Selector has been successfully closed");
            }
      }
     
      /* (non-Javadoc)
       * @see java.lang.Runnable#run()
       */

      public void run()
      {
            while ( _thisThread != null )
            {
                  try
                  {
                        _selector.select();
                  }catch( Exception e )
                  {
                        e.printStackTrace();
                  }
            }

      }

}


This is on windows running 1.4.2beta and 1.4.2_01

Any feedback.  I just checked java bug report and didnt see this anywhere.  It seems too obvious to be wrong.
Offline Herkules

Senior Member




Friendly fire isn't friendly!


« Reply #1 - Posted 2003-09-19 22:57:43 »

No solution, but I struggled with the same problem.
At least close() doesn't seem to interrupt an active select().


HARDCODE    --     DRTS/FlyingGuns/JPilot/JXInput  --    skype me: joerg.plewe
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

pw (22 views)
2014-07-24 01:59:36

Riven (20 views)
2014-07-23 21:16:32

Riven (17 views)
2014-07-23 21:07:15

Riven (20 views)
2014-07-23 20:56:16

ctomni231 (48 views)
2014-07-18 06:55:21

Zero Volt (44 views)
2014-07-17 23:47:54

danieldean (35 views)
2014-07-17 23:41:23

MustardPeter (38 views)
2014-07-16 23:30:00

Cero (53 views)
2014-07-16 00:42:17

Riven (52 views)
2014-07-14 18:02:53
HotSpot Options
by dleskov
2014-07-08 03:59:08

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:58:24

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:47:22

How do I start Java Game Development?
by ra4king
2014-05-17 11:13:37

HotSpot Options
by Roquen
2014-05-15 09:59:54

HotSpot Options
by Roquen
2014-05-06 15:03:10

Escape Analysis
by Roquen
2014-04-29 22:16:43

Experimental Toys
by Roquen
2014-04-28 13:24:22
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!