summaryrefslogtreecommitdiffhomepage
path: root/proto-ft/ftnoir_protocol_ft.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-12-26 22:17:20 +0100
committerStanislaw Halik <sthalik@misaki.pl>2017-12-26 22:17:20 +0100
commit3467e2bec9babc944ccdbebbbecfa246efa382e3 (patch)
tree0ce0e831f8f9459dd7a4311ea6bc785c7502f043 /proto-ft/ftnoir_protocol_ft.cpp
parent11bed3b2b78187edb1f5d44fe658eb36c62e676e (diff)
proto/freetrack: cleanup
Diffstat (limited to 'proto-ft/ftnoir_protocol_ft.cpp')
-rw-r--r--proto-ft/ftnoir_protocol_ft.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/proto-ft/ftnoir_protocol_ft.cpp b/proto-ft/ftnoir_protocol_ft.cpp
index 08f6efb3..f119f502 100644
--- a/proto-ft/ftnoir_protocol_ft.cpp
+++ b/proto-ft/ftnoir_protocol_ft.cpp
@@ -16,6 +16,14 @@
#include <atomic>
#include <cmath>
#include <windows.h>
+#include <intrin.h>
+
+static int page_size()
+{
+ SYSTEM_INFO system_info;
+ GetSystemInfo(&system_info);
+ return system_info.dwPageSize;
+}
freetrack::freetrack()
{
@@ -51,12 +59,15 @@ never_inline void store(float volatile& place, const float value)
(void)InterlockedExchange((LONG volatile*)&place, value_.i32);
}
-never_inline void store(std::int32_t volatile& place, std::int32_t value)
+template<typename t, typename u>
+force_inline
+std::enable_if_t<std::is_integral_v<t> && sizeof(t) == 4>
+store(t volatile& place, u value)
{
(void)InterlockedExchange((LONG volatile*) &place, value);
}
-never_inline std::int32_t load(std::int32_t volatile& place)
+force_inline std::int32_t load(std::int32_t volatile& place)
{
return InterlockedCompareExchange((volatile LONG*) &place, 0, 0);
}
@@ -103,19 +114,24 @@ void freetrack::pose(const double* headpose)
const std::uintptr_t addr_ = addr & ~(sizeof(LONG)-1u);
static_assert(sizeof(LONG) == 4, "");
+ static_assert(sizeof(int) == 4, "");
+
+ // memory mappings are page-aligned due to TLB
+ if (std::intptr_t(pMemData) & page_size() - 1)
+ assert(!"proto/freetrack: memory mapping not page aligned");
- // the data `happens' to be aligned by virtue of element ordering
+ // 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");
+ assert(!"proto/freetrack: unaligned access");
// no unaligned atomic access for `char'
for (unsigned k = 0; k < 2; k++)
- store(*(std::int32_t volatile*)&pMemData->table_ints[k], t.ints[k]);
+ store(pMemData->table_ints[k], t.ints[k]);
}
store(ft->GameID2, id);
- store((std::int32_t volatile&) data->DataID, 0);
+ store(data->DataID, 0);
intGameID = id;
@@ -160,7 +176,7 @@ void freetrack::set_protocols(bool ft, bool npclient)
module_status freetrack::initialize()
{
if (!shm.success())
- return error("Can't load freetrack memory mapping");
+ return error(_("Can't load freetrack memory mapping"));
bool use_ft = false, use_npclient = false;