// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_BASE_MESSAGE_QUEUE_H_
#define COBALT_BASE_MESSAGE_QUEUE_H_

#include <queue>
#include "base/callback.h"
#include "base/logging.h"
#include "base/synchronization/lock.h"

namespace base {

// A thread safe in-order message queue.  In some situations this can be
// preferred versus PostTask()ing directly to a MessageLoop since the data
// stored within the queued Closures can be destroyed on demand, and also the
// queue messages can be processed at a time of the user's choosing.
class MessageQueue {
 public:
  ~MessageQueue() {
    // Leave no message behind!
    ProcessAll();
  }

  // Add a message to the end of the queue.
  void AddMessage(const base::Closure& message) {
    base::AutoLock lock(mutex_);
    DCHECK(!message.is_null());
    queue_.push(message);
  }

  // Execute all messages in the MessageQueue until the queue is empty and then
  // return.
  void ProcessAll() {
    base::AutoLock lock(mutex_);

    while (!queue_.empty()) {
      queue_.front().Run();
      queue_.pop();
    }
  }

 private:
  base::Lock mutex_;
  std::queue<base::Closure> queue_;
};

}  // namespace base

#endif  // COBALT_BASE_MESSAGE_QUEUE_H_
