rpcsx/rpcs3/Emu/IdManager.cpp

39 lines
989 B
C++
Raw Normal View History

2020-12-05 13:08:24 +01:00
#include "stdafx.h"
#include "IdManager.h"
#include "Utilities/Thread.h"
2017-01-25 18:50:30 +01:00
shared_mutex id_manager::g_mutex;
2016-05-13 16:01:48 +02:00
2017-01-25 18:50:30 +01:00
thread_local DECLARE(idm::g_id);
2016-05-13 16:01:48 +02:00
2021-03-30 18:37:51 +02:00
idm::map_data* idm::allocate_id(std::vector<map_data>& vec, u32 type_id, u32 base, u32 step, u32 count, std::pair<u32, u32> invl_range)
{
if (vec.size() < count)
{
// Try to emplace back
const u32 _next = base + step * ::size32(vec);
2019-12-13 03:00:31 +01:00
g_id = _next;
2021-03-30 18:37:51 +02:00
vec.emplace_back(id_manager::id_key(_next, type_id), nullptr);
2019-12-13 03:00:31 +01:00
return &vec.back();
2017-01-25 18:50:30 +01:00
}
// Check all IDs starting from "next id" (TODO)
for (u32 i = 0, next = base; i < count; i++, next += step)
2017-01-25 18:50:30 +01:00
{
const auto ptr = &vec[i];
// Look for free ID
if (!ptr->second)
{
// Incremenet ID invalidation counter
const u32 id = next | ((ptr->first + (1u << invl_range.first)) & (invl_range.second ? (((1u << invl_range.second) - 1) << invl_range.first) : 0));
g_id = id;
2021-03-30 18:37:51 +02:00
ptr->first = id_manager::id_key(id, type_id);
return ptr;
}
}
// Out of IDs
2017-01-26 02:03:03 +01:00
return nullptr;
}