Niche, isn't it ?
#pragma once
#include <atomic>
#include <concepts>
template<typename Callable>
-a -a requires requires( Callable callable ) { { callable() } -> std::same_as<void>; }
-a -a -a -a || requires( Callable callable ) { { callable() } -> std::convertible_to<bool>; }
void xcall_once( std::atomic_int &flag, Callable callable )
{
-a -a using namespace std;
-a -a for( int ref = flag.load( memory_order_acquire ); )
-a -a {
-a -a -a -a if( ref > 0 )
-a -a -a -a -a -a return;
-a -a -a -a if( ref < 0 )
-a -a -a -a {
-a -a -a -a -a -a flag.wait( ref, memory_order_relaxed );
-a -a -a -a -a -a ref = flag.load( memory_order_acquire );
-a -a -a -a -a -a continue;
-a -a -a -a }
-a -a -a -a if( flag.compare_exchange_strong( ref, -1,
memory_order_relaxed, memory_order_relaxed ) )
-a -a -a -a -a -a break;
-a -a }
-a -a bool succ = true;
-a -a if constexpr( requires( Callable callable ) { { callable() } -> same_as<void>; } )
-a -a -a -a callable();
-a -a else
-a -a -a -a succ = (bool)callable();
-a -a flag.store( (int)succ, memory_order_release );
-a -a flag.notify_all();
}
| Sysop: | Amessyroom |
|---|---|
| Location: | Fayetteville, NC |
| Users: | 54 |
| Nodes: | 6 (0 / 6) |
| Uptime: | 14:03:53 |
| Calls: | 742 |
| Files: | 1,218 |
| D/L today: |
3 files (2,681K bytes) |
| Messages: | 183,733 |
| Posted today: | 1 |