blob: aed68c1ee12f07b0b96fcd2596442a5a7156e0ab [file] [log] [blame]
#include "thread.h"
#include <cstdint>
#include <cstdlib>
#define TEST_NAME "Event Group"
#include "tests.hh"
#include <atomic>
#include <event.h>
#include <thread_pool.h>
using thread_pool::async;
namespace
{
std::atomic<uint32_t> counter{2};
void barrier()
{
int c = --counter;
debug_log("Thread {} waiting for barrier {}", thread_id_get(), c);
while (counter > 0)
{
counter.wait(c);
c = counter.load();
}
counter.notify_all();
}
} // namespace
void test_eventgroup()
{
EventGroup *group;
Timeout t{1};
int ret = eventgroup_create(&t, MALLOC_CAPABILITY, &group);
TEST(ret == 0, "Failed to create event group: {}", ret);
t = 0;
uint32_t bits;
ret = eventgroup_set(&t, group, &bits, 1);
TEST(ret == 0, "Failed to set event group bits: {}", ret);
TEST(bits == 1, "Bits should be 1, but is {}", bits);
eventgroup_get(group, &bits);
TEST(bits == 1, "Fetched bits ({}) not the same as set bits (1)", bits);
async([=]() {
Timeout t{2};
uint32_t bits;
int ret = eventgroup_set(&t, group, &bits, 0b10);
debug_log("eventgroup_set returned {}", ret);
barrier();
TEST(ret == 0, "Failed to set event group bits: {}", ret);
TEST(bits == 0,
"Bits should be 0 (all cleared by clearOnExit), but is {}",
bits);
});
t = 4;
ret = eventgroup_wait(&t, group, &bits, 0b11, true, true);
debug_log("eventgroup_wait returned {}", ret);
TEST(ret == 0, "Failed to wait for event group: {}", ret);
barrier();
TEST(bits == 0b11, "Bits should be 0b11, but is {}", bits);
eventgroup_get(group, &bits);
TEST(bits == 0,
"Fetched bits {} after clearOnExit should have set them to 0",
bits);
ret = eventgroup_set(&t, group, &bits, 0b1100);
TEST(ret == 0, "Failed to set bits for event group: {}", ret);
TEST(bits == 0b1100, "Bits should be 0b1100, but is {}", bits);
ret = eventgroup_clear(&t, group, &bits, 0b100);
TEST(ret == 0, "Failed to clear event group bits: {}", ret);
TEST(bits == 0b1000, "Bits should be 0b1000, but is {}", bits);
}