summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cmake/mingw-w64.cmake3
-rw-r--r--coverity/build.sh12
-rw-r--r--filter-accela/ftnoir_filter_accela.cpp2
-rw-r--r--freetrackclient/fttypes.h6
-rw-r--r--options/bundle.hpp10
-rw-r--r--options/group.hpp4
-rw-r--r--options/value.hpp22
-rw-r--r--proto-ft/ftnoir_protocol_ft.cpp43
-rw-r--r--tracker-hatire/ftnoir_tracker_hat.h6
-rw-r--r--tracker-steamvr/steamvr.hpp2
-rw-r--r--x-plane-plugin/plugin.c20
11 files changed, 73 insertions, 57 deletions
diff --git a/cmake/mingw-w64.cmake b/cmake/mingw-w64.cmake
index 83501cdc..38567d54 100644
--- a/cmake/mingw-w64.cmake
+++ b/cmake/mingw-w64.cmake
@@ -16,7 +16,8 @@ unset(c)
unset(e)
# specify the cross compiler
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
- set(p D:/cygwin64/opt/bin/)
+ #set(p D:/cygwin64/opt/bin/)
+ set(p "C:/msys64/mingw32/bin/")
set(e .exe)
endif()
#set(c ${p}i686-w64-mingw32-)
diff --git a/coverity/build.sh b/coverity/build.sh
index 02cd5cad..3d662f8b 100644
--- a/coverity/build.sh
+++ b/coverity/build.sh
@@ -1,13 +1,13 @@
#!/bin/sh
-function cleanup() {
+cleanup() {
for i in cov-build ninja; do
taskkill -f -t -im "$i.exe" 2>/dev/null 1>&2
done
rm -f "$myfile"
}
-function signal() {
+signal() {
set +e
trap '' EXIT
echo "error: $1" 1>&2
@@ -15,7 +15,7 @@ function signal() {
exit 1
}
-export PATH="/d/dev/cov-analysis-win64-8.7.0/bin:/c/msys64/bin:/c/msys64/mingw32/bin:/usr/bin:$PATH"
+export PATH="/d/dev/cov-analysis-win64-8.7.0/bin:/c/msys64/mingw32/bin:/c/msys64/usr/bin:$PATH"
for k in HUP INT QUIT ILL BUS FPE SEGV PIPE; do
trap "signal 'got fatal signal SIG'$k" SIG"$k"
@@ -27,7 +27,7 @@ set -e
mydate="$(date --iso-8601=minutes)"
mydir="$(dirname -- "$0")"
-myfile="$mydir/opentrack-"$mydate".7z"
+myfile="opentrack-"$mydate".7z"
cd "$mydir"
for k in opencv aruco libovr-025 libovr-042 libovr-080; do
@@ -39,7 +39,7 @@ cd "./opentrack"
cmake .
ninja32 clean
cov-build --dir cov-int ninja
-rm -f "$myfile" || true
-7za -mx a "$myfile" cov-int
+rm -f "../$myfile" || true
+7za -mx a "../$myfile" cov-int
trap '' EXIT
exit 0
diff --git a/filter-accela/ftnoir_filter_accela.cpp b/filter-accela/ftnoir_filter_accela.cpp
index 38c32392..a4095774 100644
--- a/filter-accela/ftnoir_filter_accela.cpp
+++ b/filter-accela/ftnoir_filter_accela.cpp
@@ -32,7 +32,7 @@ static inline constexpr T signum(T x)
}
template<int N = 3, typename F>
-OTR_NEVER_INLINE
+never_inline
static void do_deltas(const double* deltas, double* output, double alpha, double& smoothed, F&& fun)
{
double norm[N];
diff --git a/freetrackclient/fttypes.h b/freetrackclient/fttypes.h
index 4989a570..033d183e 100644
--- a/freetrackclient/fttypes.h
+++ b/freetrackclient/fttypes.h
@@ -59,6 +59,10 @@ typedef struct FTData__ {
typedef struct FTHeap__ {
FTData data;
int32_t GameID;
- unsigned char table[8];
+ union
+ {
+ unsigned char table[8];
+ int32_t table_ints[2];
+ };
int32_t GameID2;
} FTHeap;
diff --git a/options/bundle.hpp b/options/bundle.hpp
index 00f2aed6..b6189ba6 100644
--- a/options/bundle.hpp
+++ b/options/bundle.hpp
@@ -64,12 +64,12 @@ signals:
void saving() const;
void changed() const;
public:
- OTR_NEVER_INLINE bundle(const QString& group_name);
- OTR_NEVER_INLINE ~bundle() override;
+ never_inline bundle(const QString& group_name);
+ never_inline ~bundle() override;
QString name() const { return group_name; }
- OTR_NEVER_INLINE void store_kv(const QString& name, const QVariant& datum);
- OTR_NEVER_INLINE bool contains(const QString& name) const;
- OTR_NEVER_INLINE bool is_modified() const;
+ never_inline void store_kv(const QString& name, const QVariant& datum);
+ never_inline bool contains(const QString& name) const;
+ never_inline bool is_modified() const;
template<typename t>
t get(const QString& name) const
diff --git a/options/group.hpp b/options/group.hpp
index b0e13a6a..dd070dfd 100644
--- a/options/group.hpp
+++ b/options/group.hpp
@@ -50,7 +50,7 @@ public:
static void mark_ini_modified();
template<typename t>
- OTR_NEVER_INLINE
+ never_inline
t get(const QString& k) const
{
auto value = kvs.find(k);
@@ -60,7 +60,7 @@ public:
}
template<typename F>
- OTR_NEVER_INLINE
+ never_inline
static auto with_settings_object(F&& fun)
{
saver_ saver { *cur_settings_object(), cur_ini_mtx };
diff --git a/options/value.hpp b/options/value.hpp
index ebb2096c..ba482cf7 100644
--- a/options/value.hpp
+++ b/options/value.hpp
@@ -48,7 +48,7 @@ class value final : public base_value
return val1.value<element_type>() == val2.value<element_type>();
}
- OTR_NEVER_INLINE
+ never_inline
t get() const
{
if (!b->contains(self_name) || b->get<QVariant>(self_name).type() == QVariant::Invalid)
@@ -60,7 +60,7 @@ class value final : public base_value
}
public:
- OTR_NEVER_INLINE
+ never_inline
t operator=(const t& datum)
{
if (datum != get())
@@ -71,7 +71,7 @@ public:
static constexpr const Qt::ConnectionType DIRECT_CONNTYPE = Qt::DirectConnection;
static constexpr const Qt::ConnectionType SAFE_CONNTYPE = Qt::QueuedConnection;
- OTR_NEVER_INLINE
+ never_inline
value(bundle b, const QString& name, t def) :
base_value(b, name, &is_equal, std::type_index(typeid(element_type))),
def(def)
@@ -81,46 +81,46 @@ public:
DIRECT_CONNTYPE);
}
- OTR_NEVER_INLINE
+ never_inline
value(bundle b, const char* name, t def) : value(b, QString(name), def)
{
}
- OTR_NEVER_INLINE
+ never_inline
t default_value() const
{
return def;
}
- OTR_NEVER_INLINE
+ never_inline
void set_to_default() override
{
*this = def;
}
- OTR_NEVER_INLINE
+ never_inline
operator t() const { return std::forward<t>(get()); }
- OTR_NEVER_INLINE
+ never_inline
void reload() override
{
*this = static_cast<t>(*this);
}
- OTR_NEVER_INLINE
+ never_inline
void bundle_value_changed() const override
{
emit valueChanged(traits::to_storage(get()));
}
- OTR_NEVER_INLINE
+ never_inline
t operator()() const
{
return get();
}
template<typename u>
- OTR_NEVER_INLINE
+ never_inline
u to() const
{
return static_cast<u>(std::forward<t>(get()));
diff --git a/proto-ft/ftnoir_protocol_ft.cpp b/proto-ft/ftnoir_protocol_ft.cpp
index 16a8fbe1..8e5996d8 100644
--- a/proto-ft/ftnoir_protocol_ft.cpp
+++ b/proto-ft/ftnoir_protocol_ft.cpp
@@ -7,7 +7,6 @@
*/
#include "compat/ndebug-guard.hpp"
-#include <cassert>
#include "ftnoir_protocol_ft.h"
#include "csv/csv.h"
@@ -43,8 +42,9 @@ freetrack::~freetrack()
}
static_assert(sizeof(LONG) == sizeof(std::int32_t), "");
+static_assert(sizeof(LONG) == 4u, "");
-inline void store(float volatile& place, const float value)
+never_inline void store(float volatile& place, const float value)
{
union
{
@@ -60,17 +60,12 @@ inline void store(float volatile& place, const float value)
(void)InterlockedExchange((LONG volatile*)&place, value_.i32);
}
-inline void store(std::int32_t volatile& place, std::int32_t value)
+never_inline void store(std::int32_t volatile& place, std::int32_t value)
{
(void)InterlockedExchange((LONG volatile*) &place, value);
}
-inline void store(std::uint8_t volatile& place, std::uint8_t value)
-{
- (void)InterlockedExchange8((char volatile*) &place, char(value));
-}
-
-inline std::int32_t load(std::int32_t volatile& place)
+never_inline std::int32_t load(std::int32_t volatile& place)
{
return InterlockedCompareExchange((volatile LONG*) &place, 0, 0);
}
@@ -103,12 +98,30 @@ void freetrack::pose(const double* headpose)
if (intGameID != id)
{
QString gamename;
- unsigned char table[8] {};
+ union {
+ unsigned char table[8] alignas(alignof(std::int32_t));
+ std::int32_t ints[2];
+ } t;
+
+ t.ints[0] = 0; t.ints[1] = 0;
+
+ (void)CSV::getGameData(id, t.table, gamename);
- (void)CSV::getGameData(id, (unsigned char*)table, gamename);
+ {
+ const std::uintptr_t addr = (std::uintptr_t)(void*)&pMemData->table[0];
+ const std::uintptr_t addr_ = addr & (sizeof(LONG)-1);
- for (unsigned k = 0; k < 8; k++)
- store(pMemData->table[k], table[k]);
+ // the data `happens' to be aligned by virtue of element ordering
+ // inside FTHeap. there's no deeper reason behind it.
+
+ if (addr != addr_)
+ assert("!unaligned access");
+
+ static_assert(sizeof(char[8])/sizeof(LONG) == 2, "");
+
+ for (unsigned k = 0; k < 2; k++)
+ store(*(std::int32_t volatile*)&pMemData->table_ints[k], t.ints[k]);
+ }
store(ft->GameID2, id);
store(data->DataID, 0);
@@ -220,8 +233,8 @@ bool freetrack::correct()
store(pMemData->GameID2, 0);
- for (int i = 0; i < 8; i++)
- store(pMemData->table[i], 0);
+ for (unsigned k = 0; k < 2; k++)
+ store(*(std::int32_t volatile*)&pMemData->table_ints[k], 0);
// more games need the dummy executable than previously thought
if (use_npclient)
diff --git a/tracker-hatire/ftnoir_tracker_hat.h b/tracker-hatire/ftnoir_tracker_hat.h
index 47f66812..fa8b8448 100644
--- a/tracker-hatire/ftnoir_tracker_hat.h
+++ b/tracker-hatire/ftnoir_tracker_hat.h
@@ -8,12 +8,10 @@
#include <atomic>
#include <QObject>
-#include <QPalette>
-#include <QtGui>
#include <QByteArray>
#include <QMessageBox>
-#include <QtSerialPort/QSerialPort>
-#include <QtSerialPort/QSerialPortInfo>
+#include <QSerialPort>
+#include <QSerialPortInfo>
#include <QSettings>
class hatire : public QObject, public ITracker
diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp
index af8fdbc8..0592dec9 100644
--- a/tracker-steamvr/steamvr.hpp
+++ b/tracker-steamvr/steamvr.hpp
@@ -51,7 +51,7 @@ struct device_list final
void refresh_device_list();
const QList<device_spec>& devices() const { return device_specs; }
- static OTR_NEVER_INLINE maybe_pose get_pose(int k);
+ static never_inline maybe_pose get_pose(int k);
static QString strerror(error_t error);
static constexpr int max_devices = int(vr::k_unMaxTrackedDeviceCount);
diff --git a/x-plane-plugin/plugin.c b/x-plane-plugin/plugin.c
index 3795024c..abf34b5f 100644
--- a/x-plane-plugin/plugin.c
+++ b/x-plane-plugin/plugin.c
@@ -68,12 +68,12 @@ static void reinit_offset() {
}
#ifdef __GNUC__
-# define OT_UNUSED(varname) varname __attribute__((__unused__))
+# define unused(varname) varname __attribute__((__unused__))
#else
-# define OT_UNUSED(varname) varname
+# define unused(varname) varname
#endif
-PortableLockedShm* PortableLockedShm_init(const char *shmName, const char *OT_UNUSED(mutexName), int mapSize)
+PortableLockedShm* PortableLockedShm_init(const char *shmName, const char *unused(mutexName), int mapSize)
{
PortableLockedShm* self = malloc(sizeof(PortableLockedShm));
char shm_filename[NAME_MAX];
@@ -107,10 +107,10 @@ void PortableLockedShm_unlock(PortableLockedShm* self)
}
float write_head_position(
- float OT_UNUSED(inElapsedSinceLastCall),
- float OT_UNUSED(inElapsedTimeSinceLastFlightLoop),
- int OT_UNUSED(inCounter),
- void * OT_UNUSED(inRefcon) )
+ float unused(inElapsedSinceLastCall),
+ float unused(inElapsedTimeSinceLastFlightLoop),
+ int unused(inCounter),
+ void * unused(inRefcon) )
{
if (lck_posix != NULL && shm_posix != NULL) {
if(data_last == NULL){
@@ -235,9 +235,9 @@ PLUGIN_API OTR_COMPAT_EXPORT void XPluginDisable ( void ) {
}
PLUGIN_API OTR_COMPAT_EXPORT void XPluginReceiveMessage(
- XPLMPluginID OT_UNUSED(inFromWho),
- int OT_UNUSED(inMessage),
- void * OT_UNUSED(inParam))
+ XPLMPluginID unused(inFromWho),
+ int unused(inMessage),
+ void * unused(inParam))
{
if (inMessage == XPLM_MSG_AIRPORT_LOADED)
reinit_offset();