mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-09 20:29:10 +02:00
Add a RAII wrapper for enabling flush-to-zero
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
#include <xmmintrin.h>
|
||||||
#include <boost/process/environment.hpp>
|
#include <boost/process/environment.hpp>
|
||||||
|
|
||||||
namespace bp = boost::process;
|
namespace bp = boost::process;
|
||||||
@@ -46,3 +47,12 @@ bool set_realtime_priority(bool sched_fifo, int priority) {
|
|||||||
return sched_setscheduler(0, sched_fifo ? SCHED_FIFO : SCHED_OTHER,
|
return sched_setscheduler(0, sched_fifo ? SCHED_FIFO : SCHED_OTHER,
|
||||||
¶ms) == 0;
|
¶ms) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScopedFlushToZero::ScopedFlushToZero() {
|
||||||
|
old_ftz_mode = _MM_GET_FLUSH_ZERO_MODE();
|
||||||
|
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScopedFlushToZero::~ScopedFlushToZero() {
|
||||||
|
_MM_SET_FLUSH_ZERO_MODE(old_ftz_mode);
|
||||||
|
}
|
||||||
|
|||||||
@@ -83,3 +83,28 @@ std::optional<int> get_realtime_priority();
|
|||||||
* user does not have the privileges to set realtime priorities.
|
* user does not have the privileges to set realtime priorities.
|
||||||
*/
|
*/
|
||||||
bool set_realtime_priority(bool sched_fifo, int priority = 5);
|
bool set_realtime_priority(bool sched_fifo, int priority = 5);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A RAII wrapper that will temporarily enable the FTZ flag so that denormals
|
||||||
|
* are automatically flushed to zero, returning to whatever the flag was
|
||||||
|
* previously when it drops out of scope.
|
||||||
|
*/
|
||||||
|
class ScopedFlushToZero {
|
||||||
|
ScopedFlushToZero();
|
||||||
|
~ScopedFlushToZero();
|
||||||
|
|
||||||
|
ScopedFlushToZero(const ScopedFlushToZero&) = delete;
|
||||||
|
ScopedFlushToZero& operator=(const ScopedFlushToZero&) = delete;
|
||||||
|
|
||||||
|
ScopedFlushToZero(ScopedFlushToZero&&) = delete;
|
||||||
|
ScopedFlushToZero& operator=(ScopedFlushToZero&&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The previous FTZ mode. When we use this on the Wine side, this should
|
||||||
|
* always be disabled. But, we'll make sure to do it correctly anyhow so we
|
||||||
|
* don't accidentally end up disabling FTZ somewhere where it should be
|
||||||
|
* enabled.
|
||||||
|
*/
|
||||||
|
unsigned int old_ftz_mode;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user