Sorry, should go here.
Am 11.12.2025 um 15:43 schrieb Bonita Montero:
Niche, isn't it ?
#pragma once
#include <atomic>
#include <concepts>
template<typename Callable>
ÿ ÿ requires requires( Callable callable ) { { callable() } -> std::same_as<void>; }
ÿ ÿ ÿ ÿ || requires( Callable callable ) { { callable() } -> std::convertible_to<bool>; }
void xcall_once( std::atomic_int &flag, Callable callable )
{
ÿ ÿ using namespace std;
ÿ ÿ for( int ref = flag.load( memory_order_acquire ); )
ÿ ÿ {
ÿ ÿ ÿ ÿ if( ref > 0 )
ÿ ÿ ÿ ÿ ÿ ÿ return;
ÿ ÿ ÿ ÿ if( ref < 0 )
ÿ ÿ ÿ ÿ {
ÿ ÿ ÿ ÿ ÿ ÿ flag.wait( ref, memory_order_relaxed );
ÿ ÿ ÿ ÿ ÿ ÿ ref = flag.load( memory_order_acquire );
ÿ ÿ ÿ ÿ ÿ ÿ continue;
ÿ ÿ ÿ ÿ }
ÿ ÿ ÿ ÿ if( flag.compare_exchange_strong( ref, -1,
memory_order_relaxed, memory_order_relaxed ) )
ÿ ÿ ÿ ÿ ÿ ÿ break;
ÿ ÿ }
ÿ ÿ bool succ = true;
ÿ ÿ if constexpr( requires( Callable callable ) { { callable() } -> same_as<void>; } )
ÿ ÿ ÿ ÿ callable();
ÿ ÿ else
ÿ ÿ ÿ ÿ succ = (bool)callable();
ÿ ÿ flag.store( (int)succ, memory_order_release );
ÿ ÿ flag.notify_all();
}
--- PyGate Linux v1.5.2
* Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)