1 | /* |
2 | * @(#) $Id: VmPipeIdleStatusChecker.java 165129 2005-04-28 11:28:41Z trustin $ |
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: 165129 $, $Date: 2005-04-28 20:28:41 +0900 $ |
18 | */ |
19 | class VmPipeIdleStatusChecker |
20 | { |
21 | static final VmPipeIdleStatusChecker INSTANCE = new VmPipeIdleStatusChecker(); |
22 | |
23 | private final Map sessions = new IdentityHashMap(); // will use as a set |
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 | } |