Add worker_sync_p function.

This commit is contained in:
Patrick Pelissier committed 2018-03-26 22:13:50 +02:00
1 parent e59308a9a3
commit 6cccbfc73a
2 files changed
+16 -4

No files matched your search

+5
View File
@@ -4190,6 +4190,11 @@ If no worker is available, the work order 'func(data)' will be handled
by the caller. Otherwise the work order 'func(data)' will be handled
by an asynchronous worker.
#### bool worker\_sync\_p(worker\_block\_t syncBlock)
Test if all work orders registered to this synchronization point are
finished (true) or not (false).
#### void worker\_sync(worker\_block\_t syncBlock)
Wait for all work orders registered to this synchronization point to be
+11 -4
View File
@@ -309,15 +309,22 @@ worker_spawn_function(worker_t g, worker_sync_t block, std::function<void(void *
}
#endif
/* Test if all work orders are finished */
static inline bool
worker_sync_p(worker_sync_t block)
{
/* If the number of spawns is greated than the number
of terminated spawns, some spawns are still working.
So wait for terminaison */
return (atomic_load(&block->num_spawn) == atomic_load (&block->num_terminated_spawn));
}
/* Wait for all work orders to be finished */
static inline void
worker_sync(worker_sync_t block)
{
//printf ("Waiting for thread terminasion.\n");
/* If the number of spawns is greated than the number
of terminated spawns, some spawns are still working.
So wait for terminaison */
while (atomic_load(&block->num_spawn) != atomic_load (&block->num_terminated_spawn));
while (!worker_sync_p(block)) ;
}
/* Flush any work order in the queue if some remains.*/