1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
/*
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include <atomic>
#include <condition_variable>
#include <cstdint>
#include <map>
#include <mutex>
#include <queue>
#include <set>
namespace NEO {
class DrmMemoryManager;
class BufferObject;
class Thread;
enum class GemCloseWorkerMode {
gemCloseWorkerInactive,
gemCloseWorkerActive
};
class DrmGemCloseWorker : NEO::NonCopyableAndNonMovableClass {
public:
DrmGemCloseWorker(DrmMemoryManager &memoryManager);
MOCKABLE_VIRTUAL ~DrmGemCloseWorker();
void push(BufferObject *allocation);
MOCKABLE_VIRTUAL void close(bool blocking);
bool isEmpty();
protected:
void close(BufferObject *workItem);
void closeThread();
void processQueue(std::queue<BufferObject *> &inputQueue);
static void *worker(void *arg);
std::atomic<bool> active{true};
std::unique_ptr<Thread> thread;
std::queue<BufferObject *> queue;
std::atomic<uint32_t> workCount{0};
DrmMemoryManager &memoryManager;
std::mutex closeWorkerMutex;
std::condition_variable condition;
std::atomic<bool> workerDone{false};
};
static_assert(NEO::NonCopyableAndNonMovable<DrmGemCloseWorker>);
} // namespace NEO
|