Merge pull request #4466 from Kreijstal/ccache

ccache fix infinite hang
This commit is contained in:
Christoph Reiter 2024-03-27 13:06:42 +01:00 committed by GitHub
commit daa79cf1d4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 127 additions and 3 deletions

View File

@ -0,0 +1,120 @@
From 3b61a866621036b669a0a9e891702e1b0fd17bb0 Mon Sep 17 00:00:00 2001
From: Kreijstal <rainb@tfwno.gf>
Date: Sun, 17 Mar 2024 23:17:09 +0100
Subject: [PATCH] Stop msys2 from hanging forever, Problem: MSYS2 symlinks
error if location does not exist, otherwise they work as symlinks just
'fine'.
---
src/ccache/util/LockFile.cpp | 34 +++++++++++++++++++++++++++++++---
unittest/test_Util.cpp | 5 ++---
2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/src/ccache/util/LockFile.cpp b/src/ccache/util/LockFile.cpp
index 43b62cd1..d2f2a48b 100644
--- a/src/util/LockFile.cpp
+++ b/src/util/LockFile.cpp
@@ -43,7 +43,9 @@ const uint32_t k_max_sleep_time_ms = 50;
#ifndef _WIN32
const util::Duration k_staleness_limit(2);
#endif
-
+#ifdef __CYGWIN__
+# include <fcntl.h>
+#endif
namespace fs = util::filesystem;
using pstr = util::PathString;
@@ -236,16 +238,31 @@ LockFile::do_acquire(const bool blocking)
const auto now = TimePoint::now();
const auto my_content =
FMT("{}-{}.{}", content_prefix, now.sec(), now.nsec_decimal_part());
-
+# ifdef __CYGWIN__
+ // Cygwin-specific file-based lock
+ int fd = open(m_lock_file.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0666);
+ if (fd != -1) {
+ // Lock file successfully created, write the content and close the file
+ write(fd, my_content.c_str(), my_content.size());
+ close(fd); // Lock acquired
+ return true;
+ }
+# else
if (fs::create_symlink(my_content, m_lock_file)) {
// We got the lock.
return true;
}
+# endif
int saved_errno = errno;
if (saved_errno == ENOENT) {
// Directory doesn't exist?
+# ifdef __CYGWIN__
+ if (!fs::exists(m_lock_file.parent_path())
+ && fs::create_directories(m_lock_file.parent_path())) {
+# else
if (fs::create_directories(m_lock_file.parent_path())) {
+# endif
// OK. Retry.
continue;
}
@@ -262,7 +279,17 @@ LockFile::do_acquire(const bool blocking)
// Directory doesn't exist or isn't writable?
return false;
}
-
+# ifdef __CYGWIN__
+ // Cygwin-specific code to read the content of the lock file
+ std::ifstream lock_file(m_lock_file);
+ if (!lock_file.is_open()) {
+ // Handle error: the lock file couldn't be opened
+ return false;
+ }
+ std::string content;
+ lock_file >> content;
+ lock_file.close();
+# else
auto content_path = fs::read_symlink(m_lock_file);
if (!content_path) {
if (content_path.error() == std::errc::no_such_file_or_directory) {
@@ -278,6 +305,7 @@ LockFile::do_acquire(const bool blocking)
}
auto content = content_path->string();
+# endif
if (content == my_content) {
// Lost NFS reply?
LOG("Symlinking {} failed but we got the lock anyway", m_lock_file);
diff --git a/unittest/test_Util.cpp b/unittest/test_Util.cpp
index e670464b..6120a82a 100644
--- a/unittest/test_Util.cpp
+++ b/unittest/test_Util.cpp
@@ -102,7 +102,7 @@ TEST_CASE("Util::make_relative_path")
const std::string cwd = util::actual_cwd();
const std::string actual_cwd = FMT("{}/d", cwd);
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__CYGWIN__)
const std::string apparent_cwd = actual_cwd;
#else
const std::string apparent_cwd = FMT("{}/s", cwd);
@@ -114,7 +114,6 @@ TEST_CASE("Util::make_relative_path")
#endif
REQUIRE(fs::current_path("d"));
util::setenv("PWD", apparent_cwd);
-
SUBCASE("No base directory")
{
CHECK(make_relative_path("", "/a", "/a", "/a/x") == "/a/x");
@@ -198,7 +197,7 @@ TEST_CASE("Util::normalize_abstract_absolute_path")
TEST_CASE("Util::normalize_concrete_absolute_path")
{
-#ifndef _WIN32
+#if !defined(_WIN32) && !defined(__CYGWIN__)
TestContext test_context;
util::write_file("file", "");
--
2.44.0

View File

@ -3,7 +3,7 @@
pkgname=ccache
pkgver=4.9.1
pkgrel=1
pkgrel=2
pkgdesc="A compiler cache (mingw-w64)"
arch=('i686' 'x86_64')
url="https://ccache.samba.org/"
@ -20,16 +20,20 @@ depends=("gcc-libs" "zlib" "libzstd")
options=('staticlibs' 'strip')
install="${pkgname}.install"
source=(https://github.com/ccache/ccache/releases/download/v${pkgver}/ccache-${pkgver}.tar.xz{,.asc}
"0001-fix-blake3-segfault.patch")
"0001-fix-blake3-segfault.patch"
"0002-Stop-msys2-from-hanging-forever-Problem-MSYS2-symlin.patch")
validpgpkeys=("5A939A71A46792CF57866A51996DDA075594ADB8") #Joel Rosdahl <joel@rosdahl.net>
sha256sums=('4c03bc840699127d16c3f0e6112e3f40ce6a230d5873daa78c60a59c7ef59d25'
'SKIP'
'0d9e9f9dd4ff87a010e017091ab503945c40b46766aaee520bca09633ab00927')
'0d9e9f9dd4ff87a010e017091ab503945c40b46766aaee520bca09633ab00927'
'05723222a62159fdeae0a720bbccab1a873ee931dc6a1c7327ec1317f041bba3')
prepare() {
cd "${pkgname}-${pkgver}"
patch -Np1 -i "${srcdir}/0001-fix-blake3-segfault.patch"
# https://github.com/ccache/ccache/pull/1416
patch -Np1 -i "${srcdir}/0002-Stop-msys2-from-hanging-forever-Problem-MSYS2-symlin.patch"
}
build() {