parent
3d87472bf5
commit
ab9403a9e7
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=511845
4 changed files with 261 additions and 19 deletions
|
@ -2,9 +2,8 @@
|
|||
|
||||
PORTNAME= rpcs3
|
||||
DISTVERSIONPREFIX= v
|
||||
DISTVERSION= 0.0.7-8674 # git rev-list --count HEAD
|
||||
DISTVERSIONSUFFIX= -gcb66d0569
|
||||
PORTREVISION= 1
|
||||
DISTVERSION= 0.0.7-8690 # git rev-list --count HEAD
|
||||
DISTVERSIONSUFFIX= -g27af75fe7
|
||||
CATEGORIES= emulators
|
||||
|
||||
MAINTAINER= jbeich@FreeBSD.org
|
||||
|
@ -51,6 +50,7 @@ LLD_UNSAFE= yes # XXX ports/219089
|
|||
# XXX Remove after FreeBSD 11.2/12.0 reach EOL i.e., around 2020-02-01
|
||||
.if !exists(/usr/include/c++/v1/charconv) && exists(/usr/lib/libc++.so)
|
||||
EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-f9ad6358563b
|
||||
EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-4504ac2d1248
|
||||
EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-revert-5bd17a44c972
|
||||
.endif
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
TIMESTAMP = 1568045762
|
||||
SHA256 (RPCS3-rpcs3-v0.0.7-8674-gcb66d0569_GH0.tar.gz) = d5d370cabced09dfcf3a65e420e2782661a98bce30d9458fe9077880a4030fef
|
||||
SIZE (RPCS3-rpcs3-v0.0.7-8674-gcb66d0569_GH0.tar.gz) = 5578023
|
||||
TIMESTAMP = 1568233855
|
||||
SHA256 (RPCS3-rpcs3-v0.0.7-8690-g27af75fe7_GH0.tar.gz) = b61ee696f3f555efaee90fef8fe49a1280d146a8029d53b76f848383c39dac50
|
||||
SIZE (RPCS3-rpcs3-v0.0.7-8690-g27af75fe7_GH0.tar.gz) = 5573156
|
||||
SHA256 (RPCS3-hidapi-hidapi-0.8.0-rc1-27-g9220f5e_GH0.tar.gz) = 3120e0b701943f452760e45f9fc1ac50bab356ad4c807b4cac4598041c5ca1a5
|
||||
SIZE (RPCS3-hidapi-hidapi-0.8.0-rc1-27-g9220f5e_GH0.tar.gz) = 105400
|
||||
SHA256 (RPCS3-llvm-b860b5e8f4ee_GH0.tar.gz) = c151972a0c8ceac568c24b61e63d2ecbdac0f125185e23fc2238e0a14048256e
|
||||
|
|
218
emulators/rpcs3/files/extra-patch-revert-4504ac2d1248
Normal file
218
emulators/rpcs3/files/extra-patch-revert-4504ac2d1248
Normal file
|
@ -0,0 +1,218 @@
|
|||
rpcs3/util/atomic.cpp:95:3: error: use of undeclared identifier 'fallback_wait'
|
||||
fallback_wait(data, size, old_value, timeout);
|
||||
^
|
||||
rpcs3/util/atomic.cpp:219:4: error: use of undeclared identifier 'fallback_notify_one'
|
||||
fallback_notify_one(data);
|
||||
^
|
||||
rpcs3/util/atomic.cpp:307:5: error: use of undeclared identifier 'fallback_notify_all'
|
||||
fallback_notify_all(data);
|
||||
^
|
||||
|
||||
--- rpcs3/util/atomic.cpp.orig 2019-09-10 16:25:39 UTC
|
||||
+++ rpcs3/util/atomic.cpp
|
||||
@@ -15,14 +15,11 @@
|
||||
// Pointer mask without bits used as hash, assuming signed 48-bit pointers
|
||||
static constexpr u64 s_pointer_mask = 0xffff'ffff'ffff & ~(s_hashtable_size - 1);
|
||||
|
||||
-// Max number of waiters is 32767
|
||||
-static constexpr u64 s_waiter_mask = 0x7fff'0000'0000'0000;
|
||||
-
|
||||
-//
|
||||
-static constexpr u64 s_collision_bit = 0x8000'0000'0000'0000;
|
||||
+// Max number of waiters is 65535
|
||||
+static constexpr u64 s_waiter_mask = 0xffff'0000'0000'0000;
|
||||
|
||||
// Implementation detail (remaining bits out of 32 available for futex)
|
||||
-static constexpr u64 s_signal_mask = 0xffffffff & ~(s_waiter_mask | s_pointer_mask | s_collision_bit);
|
||||
+static constexpr u64 s_signal_mask = 0xffffffff & ~(s_waiter_mask | s_pointer_mask);
|
||||
|
||||
// Callback for wait() function, returns false if wait should return
|
||||
static thread_local bool(*s_tls_wait_cb)(const void* data) = [](const void*)
|
||||
@@ -182,8 +179,6 @@
|
||||
|
||||
u32 new_value = 0;
|
||||
|
||||
- bool fallback = false;
|
||||
-
|
||||
const auto [_, ok] = entry.fetch_op([&](u64& value)
|
||||
{
|
||||
if ((value & s_waiter_mask) == s_waiter_mask || (value & s_signal_mask) == s_signal_mask)
|
||||
@@ -196,17 +191,11 @@
|
||||
{
|
||||
// Store pointer bits
|
||||
value |= (iptr & s_pointer_mask);
|
||||
- fallback = false;
|
||||
-
|
||||
-#ifdef _WIN32
|
||||
- value += s_signal_mask & -s_signal_mask;
|
||||
-#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
- // Set collision bit
|
||||
- value |= s_collision_bit;
|
||||
- fallback = true;
|
||||
+ // Set pointer bits to all ones (collision, TODO)
|
||||
+ value |= s_pointer_mask;
|
||||
}
|
||||
|
||||
// Add waiter
|
||||
@@ -220,11 +209,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
- if (fallback)
|
||||
- {
|
||||
- fallback_wait(data, size, old_value, timeout);
|
||||
- }
|
||||
- else if (ptr_cmp(data, size, old_value) && s_tls_wait_cb(data))
|
||||
+ if (ptr_cmp(data, size, old_value) && s_tls_wait_cb(data))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LARGE_INTEGER qw;
|
||||
@@ -260,13 +245,6 @@
|
||||
{
|
||||
value -= s_waiter_mask & -s_waiter_mask;
|
||||
|
||||
-#ifdef _WIN32
|
||||
- if (!fallback)
|
||||
- {
|
||||
- value -= s_signal_mask & -s_signal_mask;
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
if ((value & s_waiter_mask) == 0)
|
||||
{
|
||||
// Reset on last waiter
|
||||
@@ -279,7 +257,7 @@
|
||||
return false;
|
||||
});
|
||||
|
||||
- if (ok || fallback)
|
||||
+ if (ok)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -306,20 +284,15 @@
|
||||
|
||||
atomic_t<u64>& entry = s_hashtable[iptr % s_hashtable_size];
|
||||
|
||||
+ bool fallback = false;
|
||||
+
|
||||
const auto [prev, ok] = entry.fetch_op([&](u64& value)
|
||||
{
|
||||
if (value & s_waiter_mask && (value & s_pointer_mask) == (iptr & s_pointer_mask))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
- if ((value & s_signal_mask) == 0)
|
||||
- {
|
||||
- // No relevant waiters, do nothing
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- // Try to decrement if possible
|
||||
+ // Try to decrement if no collision
|
||||
value -= s_waiter_mask & -s_waiter_mask;
|
||||
- value -= s_signal_mask & -s_signal_mask;
|
||||
|
||||
if ((value & s_waiter_mask) == 0)
|
||||
{
|
||||
@@ -337,22 +310,30 @@
|
||||
|
||||
if ((value & s_signal_mask) == s_signal_mask)
|
||||
{
|
||||
- // Signal will overflow, fallback to notify_all
|
||||
- notify_all(data);
|
||||
+ // Signal will overflow, fallback
|
||||
+ fallback = true;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
+
|
||||
return true;
|
||||
}
|
||||
- else if (value & s_waiter_mask && value & s_collision_bit)
|
||||
+
|
||||
+ if (value & s_waiter_mask && (value & s_pointer_mask) == s_pointer_mask)
|
||||
{
|
||||
- fallback_notify_one(data);
|
||||
- return false;
|
||||
+ // Collision, notify everything
|
||||
+ fallback = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
+ if (fallback)
|
||||
+ {
|
||||
+ notify_all(data);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (ok)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
@@ -375,32 +356,11 @@
|
||||
{
|
||||
if (value & s_waiter_mask)
|
||||
{
|
||||
- if ((value & s_pointer_mask) == (iptr & s_pointer_mask))
|
||||
+ if ((value & s_pointer_mask) == s_pointer_mask || (value & s_pointer_mask) == (iptr & s_pointer_mask))
|
||||
{
|
||||
- if ((value & s_signal_mask) == 0)
|
||||
- {
|
||||
- // No relevant waiters, do nothing
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- const u64 count = (value & s_signal_mask) / (s_signal_mask & -s_signal_mask);
|
||||
- value -= (s_waiter_mask & -s_waiter_mask) * count;
|
||||
- value -= (s_signal_mask & -s_signal_mask) * count;
|
||||
-
|
||||
- if ((value & s_waiter_mask) == 0)
|
||||
- {
|
||||
- // Reset on last waiter
|
||||
- value = 0;
|
||||
- }
|
||||
-
|
||||
+ value = 0;
|
||||
return true;
|
||||
}
|
||||
-
|
||||
- if (value & s_collision_bit)
|
||||
- {
|
||||
- fallback_notify_all(data);
|
||||
- return false;
|
||||
- }
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -411,7 +371,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
- for (u64 count = old & s_signal_mask; count; count -= s_signal_mask & -s_signal_mask)
|
||||
+ for (u64 count = old & s_waiter_mask; count; count -= s_waiter_mask & -s_waiter_mask)
|
||||
{
|
||||
NtReleaseKeyedEvent(nullptr, &entry, false, nullptr);
|
||||
}
|
||||
@@ -426,17 +386,11 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
- if ((value & s_pointer_mask) == (iptr & s_pointer_mask))
|
||||
+ if ((value & s_pointer_mask) == s_pointer_mask || (value & s_pointer_mask) == (iptr & s_pointer_mask))
|
||||
{
|
||||
value += s_signal_mask & -s_signal_mask;
|
||||
return true;
|
||||
}
|
||||
-
|
||||
- if (value & s_collision_bit)
|
||||
- {
|
||||
- fallback_notify_all(data);
|
||||
- return false;
|
||||
- }
|
||||
}
|
||||
|
||||
return false;
|
|
@ -25,7 +25,7 @@ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is
|
|||
ptls->mapped().cond.notify_one();
|
||||
~~~~^ ~~~~~~
|
||||
|
||||
--- rpcs3/util/atomic.cpp.orig 2019-08-04 18:16:19 UTC
|
||||
--- rpcs3/util/atomic.cpp.orig 2019-09-10 16:25:39 UTC
|
||||
+++ rpcs3/util/atomic.cpp
|
||||
@@ -2,10 +2,6 @@
|
||||
|
||||
|
@ -38,7 +38,7 @@ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is
|
|||
// Should be at least 65536, currently 2097152.
|
||||
static constexpr std::uintptr_t s_hashtable_size = 1u << 21;
|
||||
|
||||
@@ -31,113 +27,6 @@ static inline bool ptr_cmp(const void* data, std::size_t size, u64 old_value)
|
||||
@@ -40,134 +36,8 @@ static inline bool ptr_cmp(const void* data, std::size
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -77,22 +77,41 @@ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is
|
|||
- return s_waiter_maps[std::hash<const void*>()(ptr) % std::size(s_waiter_maps)];
|
||||
- }
|
||||
-
|
||||
- void fallback_wait(const void* data, std::size_t size, u64 old_value)
|
||||
- void fallback_wait(const void* data, std::size_t size, u64 old_value, u64 timeout)
|
||||
- {
|
||||
- auto& wmap = get_fallback_map(data);
|
||||
-
|
||||
- if (!timeout)
|
||||
- {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- // Update node key
|
||||
- s_tls_waiter.key() = data;
|
||||
-
|
||||
- if (std::unique_lock lock(wmap.mutex); ptr_cmp(data, size, old_value))
|
||||
- if (std::unique_lock lock(wmap.mutex); ptr_cmp(data, size, old_value) && s_tls_wait_cb(data))
|
||||
- {
|
||||
- // Add node to the waiter list
|
||||
- std::condition_variable& cond = wmap.list.insert(std::move(s_tls_waiter))->second.cond;
|
||||
- const auto iter = wmap.list.insert(std::move(s_tls_waiter));
|
||||
-
|
||||
- // Wait until the node is returned to its TLS location
|
||||
- if (timeout + 1)
|
||||
- {
|
||||
- if (!iter->second.cond.wait_for(lock, std::chrono::nanoseconds(timeout), [&]
|
||||
- {
|
||||
- return 1 && s_tls_waiter;
|
||||
- }))
|
||||
- {
|
||||
- // Put it back
|
||||
- s_tls_waiter = wmap.list.extract(iter);
|
||||
- }
|
||||
-
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- while (!s_tls_waiter)
|
||||
- {
|
||||
- cond.wait(lock);
|
||||
- iter->second.cond.wait(lock);
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
|
@ -132,9 +151,9 @@ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is
|
|||
-
|
||||
-#if !defined(_WIN32) && !defined(__linux__)
|
||||
-
|
||||
-void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value)
|
||||
-{
|
||||
- fallback_wait(data, size, old_value);
|
||||
void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout)
|
||||
{
|
||||
- fallback_wait(data, size, old_value, timeout);
|
||||
-}
|
||||
-
|
||||
-void atomic_storage_futex::notify_one(const void* data)
|
||||
|
@ -149,12 +168,17 @@ rpcs3/util/atomic.cpp:94:7: error: member reference base type 'unsigned long' is
|
|||
-
|
||||
-#else
|
||||
-
|
||||
void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
@@ -337,5 +226,3 @@ void atomic_storage_futex::notify_all(const void* data)
|
||||
-void atomic_storage_futex::wait(const void* data, std::size_t size, u64 old_value, u64 timeout)
|
||||
-{
|
||||
if (!timeout)
|
||||
{
|
||||
return;
|
||||
@@ -402,8 +272,6 @@ void atomic_storage_futex::notify_all(const void* data
|
||||
}
|
||||
#endif
|
||||
}
|
||||
-
|
||||
-#endif
|
||||
|
||||
void atomic_storage_futex::set_wait_callback(bool(*cb)(const void* data))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue