office-gobmx/include/systools/win32/retry_if_failed.hxx
Mike Kaganski eef43192d4 Improve unit test accuracy
I didn't take clock resolution into account when created the test,
and it failed for me occasionally because the value was slightly
less than expected.

The typical system tick resolution is documented at
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers

Change-Id: Ie48b10d15b14f9ac7d292a2cc9916bcbfff44b6f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111946
Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2021-03-04 09:50:48 +01:00

38 lines
1.3 KiB
C++

/* -*- 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>
std::enable_if_t<std::is_same_v<std::invoke_result_t<Func>, HRESULT>, HRESULT>
RetryIfFailed(unsigned times, unsigned msTimeout, Func func)
{
for (unsigned i = 0;; ++i)
{
if (HRESULT hr = func(); SUCCEEDED(hr) || i >= times)
return hr;
Sleep(msTimeout);
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */