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 The Apache Directory Project (dev@directory.apache.org)
17 * @version $Rev: 327113 $, $Date: 2005-10-21 15:59:15 +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 notifyIdleSession( session, currentTime );
75 }
76 }
77 }
78 }
79 }
80 }
81
82 private void notifyIdleSession( VmPipeSession session, long currentTime )
83 {
84 SessionConfig config = session.getConfig();
85
86 notifyIdleSession0(
87 session, currentTime,
88 config.getIdleTimeInMillis( IdleStatus.BOTH_IDLE ),
89 IdleStatus.BOTH_IDLE,
90 Math.max( session.getLastIoTime(), session.getLastIdleTime( IdleStatus.BOTH_IDLE ) ) );
91 notifyIdleSession0(
92 session, currentTime,
93 config.getIdleTimeInMillis( IdleStatus.READER_IDLE ),
94 IdleStatus.READER_IDLE,
95 Math.max( session.getLastReadTime(), session.getLastIdleTime( IdleStatus.READER_IDLE ) ) );
96 notifyIdleSession0(
97 session, currentTime,
98 config.getIdleTimeInMillis( IdleStatus.WRITER_IDLE ),
99 IdleStatus.WRITER_IDLE,
100 Math.max( session.getLastWriteTime(), session.getLastIdleTime( IdleStatus.WRITER_IDLE ) ) );
101 }
102
103 private void notifyIdleSession0( VmPipeSession session, long currentTime,
104 long idleTime, IdleStatus status,
105 long lastIoTime )
106 {
107 if( idleTime > 0 && lastIoTime != 0
108 && ( currentTime - lastIoTime ) >= idleTime )
109 {
110 session.increaseIdleCount( status );
111 session.getManagerFilterChain().sessionIdle( session, status );
112 }
113 }
114
115 }