diff options
Diffstat (limited to 'src/emu/emualloc.cpp')
-rw-r--r-- | src/emu/emualloc.cpp | 29 |
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); } |