// Copyright 2021 The Dawn Authors
//
// 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.

#include "dawn/native/CallbackTaskManager.h"

#include <utility>

namespace dawn::native {

CallbackTaskManager::CallbackTaskManager() = default;

CallbackTaskManager::~CallbackTaskManager() = default;

bool CallbackTaskManager::IsEmpty() {
    std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);
    return mCallbackTaskQueue.empty();
}

std::vector<std::unique_ptr<CallbackTask>> CallbackTaskManager::AcquireCallbackTasks() {
    std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);

    std::vector<std::unique_ptr<CallbackTask>> allTasks;
    allTasks.swap(mCallbackTaskQueue);
    return allTasks;
}

void CallbackTaskManager::AddCallbackTask(std::unique_ptr<CallbackTask> callbackTask) {
    std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);
    mCallbackTaskQueue.push_back(std::move(callbackTask));
}

}  // namespace dawn::native
