Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/1a4340d7d218edd01cd5bd09b2cfe011711e0125
>---------------------------------------------------------------
commit 1a4340d7d218edd01cd5bd09b2cfe011711e0125
Author: Alex Alabuzhev <
alab...@gmail.com>
Date: Tue Feb 10 02:39:07 2026 +0000
Clarify synchronisation logic
>---------------------------------------------------------------
1a4340d7d218edd01cd5bd09b2cfe011711e0125
far/changelog | 5 +++++
far/platform.cpp | 29 +++++++++++++++++++----------
far/vbuild.m4 | 2 +-
3 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/far/changelog b/far/changelog
index 8bd2dae89..9d6e028b4 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+drkns 2026-02-10 02:33:01+00:00 - build 6644
+
+1. Clarify synchronisation logic.
+
--------------------------------------------------------------------------------
drkns 2026-02-07 19:42:24+00:00 - build 6643
diff --git a/far/platform.cpp b/far/platform.cpp
index 6e0459454..fb76e35b9 100644
--- a/far/platform.cpp
+++ b/far/platform.cpp
@@ -122,15 +122,20 @@ namespace os
{
switch (const auto Result = WaitForSingleObject(Handle, Timeout? *Timeout / 1ms : INFINITE))
{
+ case WAIT_ABANDONED:
+ LOGWARNING(L"WaitForSingleObject(): WAIT_ABANDONED for handle {}"sv, Handle);
+ [[fallthrough]];
case WAIT_OBJECT_0:
return true;
case WAIT_TIMEOUT:
return false;
+ case WAIT_FAILED:
+ throw far_fatal_exception(far::format(L"WaitForSingleobject failed: {}"sv, last_error()));
+
default:
- // Abandoned or error
- throw far_fatal_exception(far::format(L"WaitForSingleobject returned {}"sv, Result));
+ std::unreachable();
}
}
@@ -143,18 +148,22 @@ namespace os
const auto Result = WaitForMultipleObjects(static_cast<DWORD>(Handles.size()), Handles.data(), WaitAll, Timeout? *Timeout / 1ms : INFINITE);
if (in_closed_range<size_t>(WAIT_OBJECT_0, Result, WAIT_OBJECT_0 + Handles.size() - 1))
- {
return Result - WAIT_OBJECT_0;
- }
- else if (Result == WAIT_TIMEOUT)
- {
+
+ if (Result == WAIT_TIMEOUT)
return {};
- }
- else
+
+ if (in_closed_range<size_t>(WAIT_ABANDONED, Result, WAIT_ABANDONED + Handles.size() - 1))
{
- // Abandoned or error
- throw far_fatal_exception(far::format(L"WaitForMultipleObjects returned {}"sv, Result));
+ const auto HandleIndex = Result - WAIT_ABANDONED;
+ LOGWARNING(L"WaitForMultipleObjects(): WAIT_ABANDONED for handle {} ({}/{})"sv, Handles[HandleIndex], HandleIndex, Handles.size());
+ return HandleIndex;
}
+
+ if (Result == WAIT_FAILED)
+ throw far_fatal_exception(far::format(L"WaitForMultipleObjects failed: {}"sv, last_error()));
+
+ std::unreachable();
}
void handle_implementation::wait(HANDLE const Handle)
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index 9e97342c5..c458223ef 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-6643
+6644