summaryrefslogtreecommitdiffstats
path: root/include/systools/win32/retry_if_failed.hxx
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2021-03-02 15:00:56 +0300
committerXisco Fauli <xiscofauli@libreoffice.org>2021-03-09 17:00:51 +0100
commit316bebbbbd19cdccde05eba5f6098d301f032df2 (patch)
treeb7aa4b5c00164c50ef7815323f09a891b157d81c /include/systools/win32/retry_if_failed.hxx
parenttdf#127471 improve SVM FontScaling im/export (diff)
downloadcore-316bebbbbd19cdccde05eba5f6098d301f032df2.tar.gz
core-316bebbbbd19cdccde05eba5f6098d301f032df2.zip
tdf#116983 tdf#136175: retry if failed
Debugging the test case from the latter bug report shows that indeed the call to OleGetClipboard may fail first time, as jasonkres had suspected in the former bug. So follow the suggestion in tdf#116983, and retry the failing calls several times in case of failure. Many thanks to Telesto for preparing a clear bug report with reliable test case. Co-authored-by: jasonkres Change-Id: Ib3c497da830bc5faac586bcfe1eededa54bfa117 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111825 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> (cherry picked from commit cf1c835e8016f8f1eefea6d625a913c0ac343a63) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112075 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'include/systools/win32/retry_if_failed.hxx')
-rw-r--r--include/systools/win32/retry_if_failed.hxx40
1 files changed, 40 insertions, 0 deletions
diff --git a/include/systools/win32/retry_if_failed.hxx b/include/systools/win32/retry_if_failed.hxx
new file mode 100644
index 000000000000..11a7e5372037
--- /dev/null
+++ b/include/systools/win32/retry_if_failed.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <type_traits>
+#include <systools/win32/uwinapi.h>
+
+#pragma comment(lib, "Kernel32.lib") // for Sleep
+
+namespace sal::systools
+{
+// Some system calls (e.g., clipboard access functions) may fail first time, because the resource
+// may only be accessed by one process at a time. This function allows to retry failed call up to
+// specified number of times with a specified timeout (in ms), until the call succeeds or the limit
+// of attempts is exceeded.
+// Usage:
+// HRESULT hr = sal::systools::RetryIfFailed(10, 100, []{ return OleFlushClipboard(); });
+template <typename Func> HRESULT RetryIfFailed(unsigned times, unsigned msTimeout, Func func)
+{
+ HRESULT hr = E_FAIL;
+ for (unsigned i = 0; i < times; ++i)
+ {
+ hr = func();
+ if (SUCCEEDED(hr))
+ break;
+ if (i < times - 1)
+ Sleep(msTimeout);
+ }
+ return hr;
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */