summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/emualloc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/emualloc.cpp')
-rw-r--r--src/emu/emualloc.cpp29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/emu/emualloc.cpp b/src/emu/emualloc.cpp
index f424bca39cb..a43faae522c 100644
--- a/src/emu/emualloc.cpp
+++ b/src/emu/emualloc.cpp
@@ -38,6 +38,7 @@ UINT64 resource_pool::s_id = 0;
resource_pool::resource_pool(int hash_size)
: m_hash_size(hash_size),
+ m_listlock(osd_lock_alloc()),
m_hash(hash_size),
m_ordered_head(nullptr),
m_ordered_tail(nullptr)
@@ -55,6 +56,8 @@ resource_pool::resource_pool(int hash_size)
resource_pool::~resource_pool()
{
clear();
+ if (m_listlock != nullptr)
+ osd_lock_free(m_listlock);
}
@@ -64,7 +67,7 @@ resource_pool::~resource_pool()
void resource_pool::add(resource_pool_item &item, size_t size, const char *type)
{
- std::lock_guard<std::mutex> lock(m_listlock);
+ osd_lock_acquire(m_listlock);
// insert into hash table
int hashval = reinterpret_cast<FPTR>(item.m_ptr) % m_hash_size;
@@ -104,6 +107,8 @@ void resource_pool::add(resource_pool_item &item, size_t size, const char *type)
item.m_ordered_prev = nullptr;
m_ordered_head = &item;
}
+
+ osd_lock_release(m_listlock);
}
@@ -119,7 +124,7 @@ void resource_pool::remove(void *ptr)
return;
// search for the item
- std::lock_guard<std::mutex> lock(m_listlock);
+ osd_lock_acquire(m_listlock);
int hashval = reinterpret_cast<FPTR>(ptr) % m_hash_size;
for (resource_pool_item **scanptr = &m_hash[hashval]; *scanptr != nullptr; scanptr = &(*scanptr)->m_next)
@@ -147,6 +152,8 @@ void resource_pool::remove(void *ptr)
global_free(deleteme);
break;
}
+
+ osd_lock_release(m_listlock);
}
@@ -158,7 +165,7 @@ void resource_pool::remove(void *ptr)
resource_pool_item *resource_pool::find(void *ptr)
{
// search for the item
- std::lock_guard<std::mutex> lock(m_listlock);
+ osd_lock_acquire(m_listlock);
int hashval = reinterpret_cast<FPTR>(ptr) % m_hash_size;
resource_pool_item *item;
@@ -166,6 +173,8 @@ resource_pool_item *resource_pool::find(void *ptr)
if (item->m_ptr == ptr)
break;
+ osd_lock_release(m_listlock);
+
return item;
}
@@ -181,7 +190,7 @@ bool resource_pool::contains(void *_ptrstart, void *_ptrend)
UINT8 *ptrend = reinterpret_cast<UINT8 *>(_ptrend);
// search for the item
- std::lock_guard<std::mutex> lock(m_listlock);
+ osd_lock_acquire(m_listlock);
resource_pool_item *item = nullptr;
for (item = m_ordered_head; item != nullptr; item = item->m_ordered_next)
@@ -189,9 +198,13 @@ bool resource_pool::contains(void *_ptrstart, void *_ptrend)
UINT8 *objstart = reinterpret_cast<UINT8 *>(item->m_ptr);
UINT8 *objend = objstart + item->m_size;
if (ptrstart >= objstart && ptrend <= objend)
- return true;
+ goto found;
}
- return false;
+
+found:
+ osd_lock_release(m_listlock);
+
+ return (item != nullptr);
}
@@ -201,8 +214,12 @@ bool resource_pool::contains(void *_ptrstart, void *_ptrend)
void resource_pool::clear()
{
+ osd_lock_acquire(m_listlock);
+
// important: delete from earliest to latest; this allows objects to clean up after
// themselves if they wish
while (m_ordered_head != nullptr)
remove(m_ordered_head->m_ptr);
+
+ osd_lock_release(m_listlock);
}