Fix sched-add race condition

Wait until all tasks have set the handle and then unblock them all.
This commit is contained in:
Rodrigo Arias 2022-09-29 12:32:56 +02:00
parent 148598ec8e
commit fcba4ddc87

View File

@ -13,37 +13,42 @@
static int ncpus = -1; static int ncpus = -1;
static long nruns = 3L; static long nruns = 3L;
static long ntasks = 1000L; static long ntasks = 200L;
static atomic_int wait = 0; static atomic_int nhandles = 0;
static void **handle; static void **handle;
#pragma oss task #pragma oss task
static void static void
do_task(int t) do_task(int t)
{ {
if(atomic_load(&wait)) handle[t] = nanos6_get_current_blocking_context();
{ if (handle[t] == NULL)
handle[t] = nanos6_get_current_blocking_context(); abort();
nanos6_block_current_task(handle[t]);
} atomic_fetch_add(&nhandles, 1);
nanos6_block_current_task(handle[t]);
} }
static void static void
do_run(void) do_run(void)
{ {
memset(handle, 0, ntasks * sizeof(void *)); memset(handle, 0, ntasks * sizeof(void *));
atomic_fetch_add(&wait, 1); atomic_store(&nhandles, 0);
for(int t = 0; t < ntasks; t++) for(int t = 0; t < ntasks; t++)
do_task(t); do_task(t);
atomic_fetch_sub(&wait, 1); /* Wait for all tasks to fill the handle */
while (atomic_load(&nhandles) < ntasks);
/* Is ok if we call unblock before the block happens */
for(int t = 0; t < ntasks; t++) for(int t = 0; t < ntasks; t++)
{ {
if(handle[t]) if (handle[t] == NULL)
nanos6_unblock_task(handle[t]); abort();
nanos6_unblock_task(handle[t]);
} }
#pragma oss taskwait #pragma oss taskwait