1
0
Fork 0
forked from suyu/suyu

kernel/thread: Make GetFreeThreadLocalSlot()'s loop indices size_t

Avoids using a u32 to compare against a range of size_t, which can be a
source of warnings. While we're at it, compress a std::tie into a
structured binding.
This commit is contained in:
Lioncash 2018-08-02 12:01:22 -04:00
parent fac0e42b2f
commit 6058c84b79

View file

@ -252,14 +252,14 @@ void Thread::ResumeFromWait() {
* slot: The index of the first free slot in the indicated page. * slot: The index of the first free slot in the indicated page.
* alloc_needed: Whether there's a need to allocate a new TLS page (All pages are full). * alloc_needed: Whether there's a need to allocate a new TLS page (All pages are full).
*/ */
static std::tuple<u32, u32, bool> GetFreeThreadLocalSlot( static std::tuple<std::size_t, std::size_t, bool> GetFreeThreadLocalSlot(
const std::vector<std::bitset<8>>& tls_slots) { const std::vector<std::bitset<8>>& tls_slots) {
// Iterate over all the allocated pages, and try to find one where not all slots are used. // Iterate over all the allocated pages, and try to find one where not all slots are used.
for (unsigned page = 0; page < tls_slots.size(); ++page) { for (std::size_t page = 0; page < tls_slots.size(); ++page) {
const auto& page_tls_slots = tls_slots[page]; const auto& page_tls_slots = tls_slots[page];
if (!page_tls_slots.all()) { if (!page_tls_slots.all()) {
// We found a page with at least one free slot, find which slot it is // We found a page with at least one free slot, find which slot it is
for (unsigned slot = 0; slot < page_tls_slots.size(); ++slot) { for (std::size_t slot = 0; slot < page_tls_slots.size(); ++slot) {
if (!page_tls_slots.test(slot)) { if (!page_tls_slots.test(slot)) {
return std::make_tuple(page, slot, false); return std::make_tuple(page, slot, false);
} }
@ -334,11 +334,8 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
// Find the next available TLS index, and mark it as used // Find the next available TLS index, and mark it as used
auto& tls_slots = owner_process->tls_slots; auto& tls_slots = owner_process->tls_slots;
bool needs_allocation = true;
u32 available_page; // Which allocated page has free space
u32 available_slot; // Which slot within the page is free
std::tie(available_page, available_slot, needs_allocation) = GetFreeThreadLocalSlot(tls_slots); auto [available_page, available_slot, needs_allocation] = GetFreeThreadLocalSlot(tls_slots);
if (needs_allocation) { if (needs_allocation) {
// There are no already-allocated pages with free slots, lets allocate a new one. // There are no already-allocated pages with free slots, lets allocate a new one.
@ -360,7 +357,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
owner_process->linear_heap_used += Memory::PAGE_SIZE; owner_process->linear_heap_used += Memory::PAGE_SIZE;
tls_slots.emplace_back(0); // The page is completely available at the start tls_slots.emplace_back(0); // The page is completely available at the start
available_page = static_cast<u32>(tls_slots.size() - 1); available_page = tls_slots.size() - 1;
available_slot = 0; // Use the first slot in the new page available_slot = 0; // Use the first slot in the new page
auto& vm_manager = owner_process->vm_manager; auto& vm_manager = owner_process->vm_manager;