1
2
3
4 package org.apache.mina.protocol.vmpipe;
5
6 import java.util.IdentityHashMap;
7 import java.util.Iterator;
8 import java.util.Map;
9
10 import org.apache.mina.common.IdleStatus;
11 import org.apache.mina.common.SessionConfig;
12
13 /***
14 * Dectects idle sessions and fires <tt>sessionIdle</tt> events to them.
15 *
16 * @author Trustin Lee (trustin@apache.org)
17 * @version $Rev: 210062 $, $Date: 2005-07-11 12:52:38 +0900 $
18 */
19 class VmPipeIdleStatusChecker
20 {
21 static final VmPipeIdleStatusChecker INSTANCE = new VmPipeIdleStatusChecker();
22
23 private final Map sessions = new IdentityHashMap();
24
25 private final Worker worker = new Worker();
26
27 private VmPipeIdleStatusChecker()
28 {
29 worker.start();
30 }
31
32 void addSession( VmPipeSession session )
33 {
34 synchronized( sessions )
35 {
36 sessions.put( session, session );
37 }
38 }
39
40 private class Worker extends Thread
41 {
42 private Worker()
43 {
44 super( "VmPipeIdleStatusChecker" );
45 setDaemon( true );
46 }
47
48 public void run()
49 {
50 for( ;; )
51 {
52 try
53 {
54 Thread.sleep( 1000 );
55 }
56 catch( InterruptedException e )
57 {
58 }
59
60 long currentTime = System.currentTimeMillis();
61
62 synchronized( sessions )
63 {
64 Iterator it = sessions.keySet().iterator();
65 while( it.hasNext() )
66 {
67 VmPipeSession session = ( VmPipeSession ) it.next();
68 if( !session.isConnected() )
69 {
70 it.remove();
71 }
72 else
73 {
74 long idleTime;
75 SessionConfig config = session.getConfig();
76
77 if( !session.isIdle( IdleStatus.BOTH_IDLE ) )
78 {
79 idleTime = config
80 .getIdleTimeInMillis( IdleStatus.BOTH_IDLE );
81 session.setIdle( IdleStatus.BOTH_IDLE,
82 idleTime > 0L
83 && ( currentTime - session.getLastIoTime() ) > idleTime );
84 if( session.isIdle( IdleStatus.BOTH_IDLE ) )
85 session.getManagerFilterChain()
86 .sessionIdle( session,
87 IdleStatus.BOTH_IDLE );
88 }
89
90 if( !session.isIdle( IdleStatus.READER_IDLE ) )
91 {
92 idleTime = config
93 .getIdleTimeInMillis( IdleStatus.READER_IDLE );
94 session.setIdle( IdleStatus.READER_IDLE,
95 idleTime > 0L
96 && ( currentTime - session.getLastReadTime() ) > idleTime );
97 if( session.isIdle( IdleStatus.READER_IDLE ) )
98 session.getManagerFilterChain()
99 .sessionIdle( session,
100 IdleStatus.READER_IDLE );
101 }
102
103 if( !session.isIdle( IdleStatus.WRITER_IDLE ) )
104 {
105 idleTime = config
106 .getIdleTimeInMillis( IdleStatus.WRITER_IDLE );
107 session.setIdle( IdleStatus.WRITER_IDLE,
108 idleTime > 0L
109 && ( currentTime - session.getLastWriteTime() ) > idleTime );
110 if( session.isIdle( IdleStatus.WRITER_IDLE ) )
111 session.getManagerFilterChain()
112 .sessionIdle( session,
113 IdleStatus.WRITER_IDLE );
114 }
115 }
116 }
117 }
118 }
119 }
120 }
121 }