@@ -305,26 +305,40 @@ public WorkRequestHandler build() {
305
305
* returns. If {@code in} reaches EOF, it also returns.
306
306
*/
307
307
public void processRequests () throws IOException {
308
- while (true ) {
309
- WorkRequest request = messageProcessor .readWorkRequest ();
310
- if (request == null ) {
311
- break ;
312
- }
313
- if (request .getCancel ()) {
314
- respondToCancelRequest (request );
315
- } else {
316
- startResponseThread (request );
308
+ try {
309
+ while (true ) {
310
+ WorkRequest request = messageProcessor .readWorkRequest ();
311
+ if (request == null ) {
312
+ break ;
313
+ }
314
+ if (request .getCancel ()) {
315
+ respondToCancelRequest (request );
316
+ } else {
317
+ startResponseThread (request );
318
+ }
317
319
}
320
+ } catch (InterruptedException e ) {
321
+ Thread .currentThread ().interrupt ();
322
+ stderr .println ("InterruptedException processing requests." );
318
323
}
319
324
}
320
325
321
326
/** Starts a thread for the given request. */
322
- void startResponseThread (WorkRequest request ) {
327
+ void startResponseThread (WorkRequest request ) throws InterruptedException {
323
328
Thread currentThread = Thread .currentThread ();
324
329
String threadName =
325
330
request .getRequestId () > 0
326
331
? "multiplex-request-" + request .getRequestId ()
327
332
: "singleplex-request" ;
333
+ // TODO(larsrc): See if this can be handled with a queue instead, without introducing more
334
+ // race conditions.
335
+ if (request .getRequestId () == 0 ) {
336
+ while (activeRequests .containsKey (request .getRequestId ())) {
337
+ // b/194051480: Previous singleplex requests can still be in activeRequests for a bit after
338
+ // the response has been sent. We need to wait for them to vanish.
339
+ Thread .sleep (1 );
340
+ }
341
+ }
328
342
Thread t =
329
343
new Thread (
330
344
() -> {
0 commit comments