/* * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/utilities/idlist.h" #include #include #include #include namespace NEO { class DeferrableDeletion; class Thread; class DeferredDeleter { public: DeferredDeleter(); virtual ~DeferredDeleter(); DeferredDeleter(const DeferredDeleter &) = delete; DeferredDeleter &operator=(const DeferredDeleter &) = delete; MOCKABLE_VIRTUAL void deferDeletion(DeferrableDeletion *deletion); MOCKABLE_VIRTUAL void addClient(); MOCKABLE_VIRTUAL void removeClient(); MOCKABLE_VIRTUAL void drain(bool blocking); protected: void stop(); void safeStop(); void ensureThread(); MOCKABLE_VIRTUAL void clearQueue(); MOCKABLE_VIRTUAL bool areElementsReleased(); MOCKABLE_VIRTUAL bool shouldStop(); static void *run(void *); std::atomic doWorkInBackground; std::atomic elementsToRelease; std::unique_ptr worker; int32_t numClients = 0; IDList queue; std::mutex queueMutex; std::mutex threadMutex; std::condition_variable condition; }; } // namespace NEO