/*
 *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/base/bufferqueue.h"

#include <algorithm>

namespace rtc {

BufferQueue::BufferQueue(size_t capacity, size_t default_size)
    : capacity_(capacity), default_size_(default_size) {
}

BufferQueue::~BufferQueue() {
  CritScope cs(&crit_);

  for (Buffer* buffer : queue_) {
    delete buffer;
  }
  for (Buffer* buffer : free_list_) {
    delete buffer;
  }
}

size_t BufferQueue::size() const {
  CritScope cs(&crit_);
  return queue_.size();
}

void BufferQueue::Clear() {
  CritScope cs(&crit_);
  while (!queue_.empty()) {
    free_list_.push_back(queue_.front());
    queue_.pop_front();
  }
}

bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) {
  CritScope cs(&crit_);
  if (queue_.empty()) {
    return false;
  }

  bool was_writable = queue_.size() < capacity_;
  Buffer* packet = queue_.front();
  queue_.pop_front();

  bytes = std::min(bytes, packet->size());
  memcpy(buffer, packet->data(), bytes);
  if (bytes_read) {
    *bytes_read = bytes;
  }
  free_list_.push_back(packet);
  if (!was_writable) {
    NotifyWritableForTest();
  }
  return true;
}

bool BufferQueue::WriteBack(const void* buffer, size_t bytes,
                            size_t* bytes_written) {
  CritScope cs(&crit_);
  if (queue_.size() == capacity_) {
    return false;
  }

  bool was_readable = !queue_.empty();
  Buffer* packet;
  if (!free_list_.empty()) {
    packet = free_list_.back();
    free_list_.pop_back();
  } else {
    packet = new Buffer(bytes, default_size_);
  }

  packet->SetData(static_cast<const uint8_t*>(buffer), bytes);
  if (bytes_written) {
    *bytes_written = bytes;
  }
  queue_.push_back(packet);
  if (!was_readable) {
    NotifyReadableForTest();
  }
  return true;
}

}  // namespace rtc
