Java-Gaming.org
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
Featured games (78)
games approved by the League of Dukes
Games in Showcase (416)
games submitted by our members
Games in WIP (306)
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 1115 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.

Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
 
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars and Titan!

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

The first screenshot will be displayed as a thumbnail.

The invasion has landed! On Mars! And you're there to beat 'em!
NegativeZero (10 views)
2013-06-19 03:31:52

NegativeZero (12 views)
2013-06-19 03:24:09

Jesse_Attard (17 views)
2013-06-18 22:03:02

HeroesGraveDev (59 views)
2013-06-15 23:35:23

Vermeer (59 views)
2013-06-14 20:08:06

davedes (58 views)
2013-06-14 16:03:55

alaslipknot (52 views)
2013-06-13 07:56:31

Roquen (73 views)
2013-06-12 04:12:32

alaslipknot (58 views)
2013-06-10 19:30:18

HeroesGraveDev (75 views)
2013-06-09 04:36:03
Smoothing Algorithm Question
by UprightPath
2013-05-28 02:58:26

Smoothing Algorithm Question
by UprightPath
2013-05-28 02:57:33

Complex number cookbook
by Roquen
2013-04-24 12:47:31

2D Dynamic Lighting
by Oskuro
2013-04-17 16:46:12

2D Dynamic Lighting
by Oskuro
2013-04-17 16:45:57

2D Dynamic Lighting
by Oskuro
2013-04-17 16:23:20

Noise (bandpassed white)
by Roquen
2013-04-05 17:36:01

Noise (bandpassed white)
by Roquen
2013-04-03 16:17:38
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!