Finally remove fxm from IdManager

This commit is contained in:
Nekotekina 2019-09-26 21:55:03 +03:00
parent c065a21b74
commit 465b16e786
4 changed files with 1 additions and 146 deletions

View File

@ -122,7 +122,7 @@ static_assert(sizeof(sys_config_padmanager_data_t) == 26);
/*
* Global (fxm-managed) sys_config state
* Global sys_config state
*/
class lv2_config

View File

@ -6,7 +6,6 @@ shared_mutex id_manager::g_mutex;
thread_local DECLARE(idm::g_id);
DECLARE(idm::g_map);
DECLARE(fxm::g_vec);
id_manager::id_map::pointer idm::allocate_id(const id_manager::id_key& info, u32 base, u32 step, u32 count)
{
@ -68,19 +67,3 @@ void idm::clear()
map.clear();
}
}
void fxm::init()
{
// Allocate
g_vec.resize(id_manager::typeinfo::get_count());
fxm::clear();
}
void fxm::clear()
{
// Call recorded finalization functions for all IDs
for (auto& val : g_vec)
{
val.reset();
}
}

View File

@ -588,132 +588,6 @@ public:
}
};
// Object manager for emulated process. One unique object per type, or zero.
class fxm
{
// Type Index -> Object. Use global since only one process is supported atm.
static std::vector<std::shared_ptr<void>> g_vec;
template <typename T>
static inline u32 get_type()
{
return id_manager::typeinfo::get_index<T>();
}
public:
// Initialize object manager
static void init();
// Remove all objects
static void clear();
// Create the object (returns nullptr if it already exists)
template <typename T, typename Make = T, typename... Args>
static std::enable_if_t<std::is_constructible<Make, Args...>::value, std::shared_ptr<T>> make(Args&&... args)
{
std::shared_ptr<T> ptr;
{
std::lock_guard lock(id_manager::g_mutex);
auto& cur = g_vec[get_type<T>()];
if (!cur)
{
ptr = std::make_shared<Make>(std::forward<Args>(args)...);
cur = ptr;
}
else
{
return nullptr;
}
}
return ptr;
}
// Emplace the object returned by provider() and return it if no object exists
template <typename T, typename F, typename... Args>
static auto import(F&& provider, Args&&... args) -> decltype(static_cast<std::shared_ptr<T>>(provider(std::forward<Args>(args)...)))
{
std::shared_ptr<T> ptr;
{
std::lock_guard lock(id_manager::g_mutex);
auto& cur = g_vec[get_type<T>()];
if (!cur)
{
ptr = provider(std::forward<Args>(args)...);
if (ptr)
{
cur = ptr;
}
}
if (!ptr)
{
return nullptr;
}
}
return ptr;
}
// Unsafe version of check(), can be used in some cases
template <typename T>
static inline T* check_unlocked()
{
return static_cast<T*>(g_vec[get_type<T>()].get());
}
// Check whether the object exists
template <typename T>
static inline T* check()
{
reader_lock lock(id_manager::g_mutex);
return check_unlocked<T>();
}
// Get the object (returns nullptr if it doesn't exist)
template <typename T>
static inline std::shared_ptr<T> get()
{
reader_lock lock(id_manager::g_mutex);
auto& ptr = g_vec[get_type<T>()];
return {ptr, static_cast<T*>(ptr.get())};
}
// Delete the object
template <typename T>
static inline bool remove()
{
std::shared_ptr<void> ptr;
{
std::lock_guard lock(id_manager::g_mutex);
ptr = std::move(g_vec[get_type<T>()]);
}
return ptr.operator bool();
}
// Delete the object and return it
template <typename T>
static inline std::shared_ptr<T> withdraw()
{
std::shared_ptr<void> ptr;
{
std::lock_guard lock(id_manager::g_mutex);
ptr = std::move(g_vec[get_type<T>()]);
}
return {ptr, static_cast<T*>(ptr.get())};
}
};
#include "util/fixed_typemap.hpp"
extern stx::manual_fixed_typemap<void> g_fixed_typemap;

View File

@ -322,7 +322,6 @@ void Emulator::Init()
}
idm::init();
fxm::init();
g_fxo->reset();
// Reset defaults, cache them
@ -1791,7 +1790,6 @@ void Emulator::Stop(bool restart)
lv2_obj::cleanup();
idm::clear();
fxm::clear();
g_fxo->reset();
LOG_NOTICE(GENERAL, "Objects cleared...");