diff --git a/configure.py b/configure.py index bbe7c96ce6..38665fe27a 100755 --- a/configure.py +++ b/configure.py @@ -420,7 +420,7 @@ modes = { 'description': 'a mode with optimizations and no debug checks, used for production builds', }, 'dev': { - 'cxxflags': '-DDEVEL -DSEASTAR_ENABLE_ALLOC_FAILURE_INJECTION -DSCYLLA_ENABLE_ERROR_INJECTION', + 'cxxflags': '-DDEVEL -DSEASTAR_ENABLE_ALLOC_FAILURE_INJECTION -DSCYLLA_ENABLE_ERROR_INJECTION -DSCYLLA_ENABLE_PREEMPTION_SOURCE', 'cxx_ld_flags': '', 'stack-usage-threshold': 1024*21, 'optimization-level': '2', diff --git a/utils/preempt.hh b/utils/preempt.hh index 066a5734d1..513cd01295 100644 --- a/utils/preempt.hh +++ b/utils/preempt.hh @@ -11,6 +11,7 @@ #include #include #include +#include #include "seastarx.hh" @@ -41,3 +42,36 @@ preemption_check always_preempt() { return true; }; } + +struct basic_preemption_source { + bool should_preempt() { + return seastar::need_preempt(); + } + void thread_yield() { + seastar::thread::yield(); + } +}; + +struct custom_preemption_source { + struct impl { + virtual bool should_preempt() = 0; + virtual void thread_yield() = 0; + virtual ~impl() = default; + }; + std::unique_ptr _impl; + bool should_preempt() { + return _impl ? _impl->should_preempt() : seastar::need_preempt(); + } + void thread_yield() { + _impl ? _impl->thread_yield() : seastar::thread::yield(); + } + custom_preemption_source() = default; + custom_preemption_source(std::unique_ptr i) : _impl(std::move(i)) {} +}; + +#ifdef SCYLLA_ENABLE_PREEMPTION_SOURCE +using preemption_source = custom_preemption_source; +#else +using preemption_source = basic_preemption_source; +#endif +