| Index: components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java
|
| diff --git a/components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java b/components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a919d9875a04fbe940ceba1ae12adaa72a5722f9
|
| --- /dev/null
|
| +++ b/components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java
|
| @@ -0,0 +1,66 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.net.urlconnection;
|
| +
|
| +import java.util.concurrent.BlockingQueue;
|
| +
|
| +/**
|
| + * A package protected MessageLoop class for use in
|
| + * {@link CronetHttpURLConnection}
|
| + */
|
| +final class MessageLoop {
|
| + private final BlockingQueue<Message> mQueue;
|
| +
|
| + public MessageLoop(BlockingQueue<Message> queue) {
|
| + mQueue = queue;
|
| + }
|
| +
|
| + /**
|
| + * Runs the message loop. Be sure to call {@link MessageLoop#quit()} to end
|
| + * the loop.
|
| + */
|
| + public void loop() {
|
| + while (true) {
|
| + try {
|
| + Message msg = mQueue.take(); // Blocks if the queue is empty.
|
| + if (msg.mTask != null) {
|
| + msg.mTask.run();
|
| + } else {
|
| + // Quits the message loop.
|
| + break;
|
| + }
|
| + } catch (InterruptedException e) {
|
| + e.printStackTrace();
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Quits the loop. This causes the {@link MessageLoop#loop()} to terminate
|
| + * after processing all currently enqueued messages.
|
| + */
|
| + public void quit() {
|
| + try {
|
| + mQueue.put(new Message(null));
|
| + } catch (InterruptedException e) {
|
| + e.printStackTrace();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Message class that represents a task to run.
|
| + */
|
| + static class Message {
|
| + private final Runnable mTask;
|
| +
|
| + /**
|
| + * Constructs a Message with a given task.
|
| + * @param task If null, it is a quit signal to the message loop.
|
| + */
|
| + public Message(Runnable task) {
|
| + mTask = task;
|
| + }
|
| + }
|
| +}
|
|
|