mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-07 00:29:20 +00:00
atomic.hpp: allow raw notify_all by pointer
This commit is contained in:
parent
393f9d329d
commit
729757b1dd
2 changed files with 12 additions and 7 deletions
|
@ -1245,7 +1245,7 @@ SAFE_BUFFERS(void) atomic_wait_engine::wait(const void* data, u32 size, u128 old
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool NoAlert = false>
|
template <bool NoAlert = false>
|
||||||
static u32 alert_sema(u32 cond_id, u128 mask)
|
static u32 alert_sema(u32 cond_id, u32 size, u128 mask)
|
||||||
{
|
{
|
||||||
ensure(cond_id);
|
ensure(cond_id);
|
||||||
|
|
||||||
|
@ -1276,7 +1276,7 @@ static u32 alert_sema(u32 cond_id, u128 mask)
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (_new->wakeup(1))
|
else if (_new->wakeup(size ? 1 : 2))
|
||||||
{
|
{
|
||||||
ok = cond_id;
|
ok = cond_id;
|
||||||
{
|
{
|
||||||
|
@ -1313,7 +1313,7 @@ void atomic_wait_engine::set_notify_callback(void(*cb)(const void*, u64))
|
||||||
s_tls_notify_cb = cb;
|
s_tls_notify_cb = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void atomic_wait_engine::notify_one(const void* data, u32 /*size*/, u128 mask)
|
void atomic_wait_engine::notify_one(const void* data, u32 size, u128 mask)
|
||||||
{
|
{
|
||||||
const uptr iptr = reinterpret_cast<uptr>(data) & (~s_ref_mask >> 17);
|
const uptr iptr = reinterpret_cast<uptr>(data) & (~s_ref_mask >> 17);
|
||||||
|
|
||||||
|
@ -1324,7 +1324,7 @@ void atomic_wait_engine::notify_one(const void* data, u32 /*size*/, u128 mask)
|
||||||
|
|
||||||
root_info::slot_search(iptr, mask, [&](u32 cond_id)
|
root_info::slot_search(iptr, mask, [&](u32 cond_id)
|
||||||
{
|
{
|
||||||
if (alert_sema(cond_id, mask))
|
if (alert_sema(cond_id, size, mask))
|
||||||
{
|
{
|
||||||
if (s_tls_notify_cb)
|
if (s_tls_notify_cb)
|
||||||
s_tls_notify_cb(data, ++progress);
|
s_tls_notify_cb(data, ++progress);
|
||||||
|
@ -1338,7 +1338,7 @@ void atomic_wait_engine::notify_one(const void* data, u32 /*size*/, u128 mask)
|
||||||
s_tls_notify_cb(data, -1);
|
s_tls_notify_cb(data, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 /*size*/, u128 mask)
|
SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 size, u128 mask)
|
||||||
{
|
{
|
||||||
const uptr iptr = reinterpret_cast<uptr>(data) & (~s_ref_mask >> 17);
|
const uptr iptr = reinterpret_cast<uptr>(data) & (~s_ref_mask >> 17);
|
||||||
|
|
||||||
|
@ -1355,7 +1355,7 @@ SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 /*size*/
|
||||||
|
|
||||||
root_info::slot_search(iptr, mask, [&](u32 cond_id)
|
root_info::slot_search(iptr, mask, [&](u32 cond_id)
|
||||||
{
|
{
|
||||||
u32 res = alert_sema<true>(cond_id, mask);
|
u32 res = alert_sema<true>(cond_id, size, mask);
|
||||||
|
|
||||||
if (res && ~res <= UINT16_MAX)
|
if (res && ~res <= UINT16_MAX)
|
||||||
{
|
{
|
||||||
|
@ -1371,7 +1371,7 @@ SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 /*size*/
|
||||||
{
|
{
|
||||||
const u32 cond_id = *(std::end(cond_ids) - i - 1);
|
const u32 cond_id = *(std::end(cond_ids) - i - 1);
|
||||||
|
|
||||||
if (!s_cond_list[cond_id].wakeup(1))
|
if (!s_cond_list[cond_id].wakeup(size ? 1 : 2))
|
||||||
{
|
{
|
||||||
*(std::end(cond_ids) - i - 1) = ~cond_id;
|
*(std::end(cond_ids) - i - 1) = ~cond_id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,6 +319,11 @@ private:
|
||||||
public:
|
public:
|
||||||
static void set_wait_callback(bool(*cb)(const void* data, u64 attempts, u64 stamp0));
|
static void set_wait_callback(bool(*cb)(const void* data, u64 attempts, u64 stamp0));
|
||||||
static void set_notify_callback(void(*cb)(const void* data, u64 progress));
|
static void set_notify_callback(void(*cb)(const void* data, u64 progress));
|
||||||
|
|
||||||
|
static void notify_all(const void* data)
|
||||||
|
{
|
||||||
|
notify_all(data, 0, u128(-1));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <uint Max, typename... T>
|
template <uint Max, typename... T>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue