Mercurial Hosting > luan
comparison src/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java @ 953:7db4a488fc82
simplify SelectorManager
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 12 Oct 2016 22:16:36 -0600 |
parents | 669769bcdf5c |
children | 6f49b8dfffe6 |
comparison
equal
deleted
inserted
replaced
952:669769bcdf5c | 953:7db4a488fc82 |
---|---|
62 * ProxyConnect. The connection may change for an SCEP as it is upgraded | 62 * ProxyConnect. The connection may change for an SCEP as it is upgraded |
63 * from HTTP to proxy connect or websocket. | 63 * from HTTP to proxy connect or websocket. |
64 */ | 64 */ |
65 private volatile AsyncConnection _connection; | 65 private volatile AsyncConnection _connection; |
66 | 66 |
67 private static final int STATE_NEEDS_DISPATCH=-1; | 67 private static final int STATE_NEEDS_DISPATCH = -1; |
68 private static final int STATE_UNDISPATCHED=0; | 68 private static final int STATE_UNDISPATCHED = 0; |
69 private static final int STATE_DISPATCHED=1; | 69 private static final int STATE_DISPATCHED = 1; |
70 private int _state; | 70 private int _state; |
71 | 71 |
72 private boolean _onIdle; | 72 private boolean _onIdle; |
73 | 73 |
74 /** true if the last write operation succeed and wrote all offered bytes */ | 74 /** true if the last write operation succeed and wrote all offered bytes */ |
124 return _connection; | 124 return _connection; |
125 } | 125 } |
126 | 126 |
127 public void setConnection(Connection connection) | 127 public void setConnection(Connection connection) |
128 { | 128 { |
129 _connection=(AsyncConnection)connection; | 129 _connection = (AsyncConnection)connection; |
130 } | 130 } |
131 | 131 |
132 /* ------------------------------------------------------------ */ | 132 /* ------------------------------------------------------------ */ |
133 /** Called by selectSet to schedule handling | 133 /** Called by selectSet to schedule handling |
134 * | 134 * |
135 */ | 135 */ |
136 public void schedule() | 136 public synchronized void schedule() |
137 { | 137 { |
138 synchronized (this) | 138 // If there is no key, then do nothing |
139 { | 139 if (_key == null || !_key.isValid()) |
140 // If there is no key, then do nothing | 140 { |
141 if (_key == null || !_key.isValid()) | 141 _readBlocked=false; |
142 { | 142 _writeBlocked=false; |
143 this.notifyAll(); | |
144 return; | |
145 } | |
146 | |
147 // If there are threads dispatched reading and writing | |
148 if (_readBlocked || _writeBlocked) | |
149 { | |
150 // assert _dispatched; | |
151 if (_readBlocked && _key.isReadable()) | |
143 _readBlocked=false; | 152 _readBlocked=false; |
153 if (_writeBlocked && _key.isWritable()) | |
144 _writeBlocked=false; | 154 _writeBlocked=false; |
145 this.notifyAll(); | 155 |
146 return; | 156 // wake them up is as good as a dispatched. |
147 } | 157 this.notifyAll(); |
148 | 158 |
149 // If there are threads dispatched reading and writing | 159 // we are not interested in further selecting |
150 if (_readBlocked || _writeBlocked) | 160 _key.interestOps(0); |
151 { | 161 if (_state<STATE_DISPATCHED) |
152 // assert _dispatched; | 162 updateKey(); |
153 if (_readBlocked && _key.isReadable()) | 163 return; |
154 _readBlocked=false; | 164 } |
155 if (_writeBlocked && _key.isWritable()) | 165 |
156 _writeBlocked=false; | 166 // Remove writeable op |
157 | 167 if ((_key.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE && (_key.interestOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) |
158 // wake them up is as good as a dispatched. | 168 { |
159 this.notifyAll(); | |
160 | |
161 // we are not interested in further selecting | |
162 _key.interestOps(0); | |
163 if (_state<STATE_DISPATCHED) | |
164 updateKey(); | |
165 return; | |
166 } | |
167 | |
168 // Remove writeable op | 169 // Remove writeable op |
169 if ((_key.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE && (_key.interestOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) | 170 _interestOps = _key.interestOps() & ~SelectionKey.OP_WRITE; |
170 { | 171 _key.interestOps(_interestOps); |
171 // Remove writeable op | 172 _writable = true; // Once writable is in ops, only removed with dispatch. |
172 _interestOps = _key.interestOps() & ~SelectionKey.OP_WRITE; | 173 } |
173 _key.interestOps(_interestOps); | 174 |
174 _writable = true; // Once writable is in ops, only removed with dispatch. | 175 // If dispatched, then deregister interest |
175 } | 176 if (_state>=STATE_DISPATCHED) |
176 | 177 _key.interestOps(0); |
177 // If dispatched, then deregister interest | 178 else |
178 if (_state>=STATE_DISPATCHED) | 179 { |
179 _key.interestOps(0); | 180 // other wise do the dispatch |
180 else | 181 dispatch(); |
181 { | |
182 // other wise do the dispatch | |
183 dispatch(); | |
184 } | |
185 } | 182 } |
186 } | 183 } |
187 | 184 |
188 public synchronized void dispatch() | 185 public synchronized void dispatch() |
189 { | 186 { |
214 */ | 211 */ |
215 protected synchronized void undispatch() | 212 protected synchronized void undispatch() |
216 { | 213 { |
217 _state = STATE_UNDISPATCHED; | 214 _state = STATE_UNDISPATCHED; |
218 updateKey(); | 215 updateKey(); |
219 // return true; | |
220 } | 216 } |
221 | 217 |
222 public void setCheckForIdle(boolean check) | 218 public void setCheckForIdle(boolean check) |
223 { | 219 { |
224 if (check) | 220 if (check) |
439 } | 435 } |
440 } | 436 } |
441 return true; | 437 return true; |
442 } | 438 } |
443 | 439 |
444 /* ------------------------------------------------------------ */ | |
445 public boolean hasProgressed() | 440 public boolean hasProgressed() |
446 { | 441 { |
447 return false; | 442 return false; |
448 } | 443 } |
449 | 444 |
471 { | 466 { |
472 current_ops = ((_key!=null && _key.isValid())?_key.interestOps():-1); | 467 current_ops = ((_key!=null && _key.isValid())?_key.interestOps():-1); |
473 } | 468 } |
474 catch(Exception e) | 469 catch(Exception e) |
475 { | 470 { |
476 _key=null; | 471 _key = null; |
477 LOG.trace("",e); | 472 LOG.trace("",e); |
478 } | 473 } |
479 } | 474 } |
480 changed=_interestOps!=current_ops; | 475 changed=_interestOps!=current_ops; |
481 } | 476 } |
507 } | 502 } |
508 else | 503 else |
509 { | 504 { |
510 try | 505 try |
511 { | 506 { |
512 _key = _selectSet.getSelector().register((SelectableChannel)getChannel(),_interestOps,this); | 507 _key = _selectSet.getSelector().register(sc,_interestOps,this); |
513 } | 508 } |
514 catch (Exception e) | 509 catch (Exception e) |
515 { | 510 { |
516 LOG.trace("",e); | 511 LOG.trace("",e); |
517 if (_key!=null && _key.isValid()) | 512 if (_key!=null && _key.isValid()) |
536 else | 531 else |
537 { | 532 { |
538 if (_key!=null && _key.isValid()) | 533 if (_key!=null && _key.isValid()) |
539 _key.interestOps(0); | 534 _key.interestOps(0); |
540 else | 535 else |
541 _key=null; | 536 _key = null; |
542 } | 537 } |
543 } | 538 } |
544 else | 539 else |
545 { | 540 { |
546 if (_key!=null && _key.isValid()) | 541 if (_key!=null && _key.isValid()) |