atomic.hpp: allow raw notify_all by pointer

This commit is contained in:
Nekotekina 2021-03-23 20:58:42 +03:00
commit 729757b1dd
2 changed files with 12 additions and 7 deletions

View file

@ -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;
} }

View file

@ -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>