Accepting request 1172212 from electronics

OBS-URL: https://build.opensuse.org/request/show/1172212
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kicad?expand=0&rev=64
This commit is contained in:
Dominique Leuenberger 2024-05-07 16:02:48 +00:00 committed by Git OBS Bridge
commit f75ffd1bba
7 changed files with 15 additions and 236 deletions

View File

@ -1,133 +0,0 @@
From 1c459e9a67151a6f028ac3a108b338e850126bfb Mon Sep 17 00:00:00 2001
From: StefanBruens <stefan.bruens@rwth-aachen.de>
Date: Wed, 13 Mar 2024 21:43:12 +0000
Subject: [PATCH] Fix triangulationValid check race for zone fill
The m_triangulationValid flag is used in several places without holding
the mutex, thus it should only ever be set when the triangulation is
guaranteed to be valid.
This can either be done by protecting both data and flag by the same
mutex, or updating the flag only after the triangulation has finished.
Also fix the case when the triangulation actually fails, the flag should
not be set in this case.
While at it, simplify the recalculation check. Only if both the
triangulation is valid, and the data hash is unchanged the recalculation
can be skipped - this is typically the case when two threads try to
update the cache concurrently, the second one will block at the mutex,
and will see the valid data after the first thread has finished.
Fixes #17180
---
libs/kimath/include/geometry/shape_poly_set.h | 3 +-
libs/kimath/src/geometry/shape_poly_set.cpp | 38 +++++++++----------
2 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/libs/kimath/include/geometry/shape_poly_set.h b/libs/kimath/include/geometry/shape_poly_set.h
index ac5b2325744..e3d1ac18f35 100644
--- a/libs/kimath/include/geometry/shape_poly_set.h
+++ b/libs/kimath/include/geometry/shape_poly_set.h
@@ -28,6 +28,7 @@
#ifndef __SHAPE_POLY_SET_H
#define __SHAPE_POLY_SET_H
+#include <atomic>
#include <cstdio>
#include <deque> // for deque
#include <iosfwd> // for string, stringstream
@@ -1538,7 +1539,7 @@ protected:
std::vector<POLYGON> m_polys;
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>> m_triangulatedPolys;
- bool m_triangulationValid = false;
+ std::atomic<bool> m_triangulationValid = false;
std::mutex m_triangulationMutex;
private:
diff --git a/libs/kimath/src/geometry/shape_poly_set.cpp b/libs/kimath/src/geometry/shape_poly_set.cpp
index dacc1e8a07c..da379ad309a 100644
--- a/libs/kimath/src/geometry/shape_poly_set.cpp
+++ b/libs/kimath/src/geometry/shape_poly_set.cpp
@@ -2883,7 +2883,7 @@ SHAPE_POLY_SET &SHAPE_POLY_SET::operator=( const SHAPE_POLY_SET& aOther )
}
m_hash = aOther.m_hash;
- m_triangulationValid = aOther.m_triangulationValid;
+ m_triangulationValid = aOther.m_triangulationValid.load();
return *this;
}
@@ -2985,25 +2985,16 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>>* aHintData )
{
std::unique_lock<std::mutex> lock( m_triangulationMutex );
- bool recalculate = !m_hash.IsValid();
- MD5_HASH hash;
-
- if( !m_triangulationValid )
- recalculate = true;
- if( !recalculate )
+ if( m_triangulationValid && m_hash.IsValid() )
{
- hash = checksum();
-
- if( m_hash != hash )
- {
- m_hash = hash;
- recalculate = true;
- }
+ if( m_hash == checksum() )
+ return;
}
- if( !recalculate )
- return;
+ // Invalidate, in case anything goes wrong below
+ m_triangulationValid = false;
+ m_hash.SetValid( false );
auto triangulate =
[]( SHAPE_POLY_SET& polySet, int forOutline,
@@ -3054,7 +3045,6 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
};
m_triangulatedPolys.clear();
- m_triangulationValid = true;
if( aPartition )
{
@@ -3081,6 +3071,12 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
{
wxLogTrace( TRIANGULATE_TRACE, "Failed to triangulate partitioned polygon %d", ii );
}
+ else
+ {
+ m_hash = checksum();
+ // Set valid flag only after everything has been updated
+ m_triangulationValid = true;
+ }
}
}
else
@@ -3095,9 +3091,13 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
{
wxLogTrace( TRIANGULATE_TRACE, "Failed to triangulate polygon" );
}
+ else
+ {
+ m_hash = checksum();
+ // Set valid flag only after everything has been updated
+ m_triangulationValid = true;
+ }
}
-
- m_hash = checksum();
}
--
GitLab

View File

@ -1,53 +0,0 @@
From 81cb6d0c3fb92dd15f0a0e0d2d32337be1617399 Mon Sep 17 00:00:00 2001
From: Seth Hillbrand <seth@kipro-pcb.com>
Date: Wed, 13 Mar 2024 10:33:43 -0700
Subject: [PATCH] Fix race condition in zone fill
When checking collisions, the SHAPE_POLY_SET::Collide() routine is not
const because it will regenerate the triangulation cache if it is out of
date (using a const_cast, grrr). This sidesteps the issue by assigning
a mutex to the triangulation caching
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17180
---
libs/kimath/include/geometry/shape_poly_set.h | 4 +++-
libs/kimath/src/geometry/shape_poly_set.cpp | 1 +
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/libs/kimath/include/geometry/shape_poly_set.h b/libs/kimath/include/geometry/shape_poly_set.h
index 9ba7b5407b0..ac5b2325744 100644
--- a/libs/kimath/include/geometry/shape_poly_set.h
+++ b/libs/kimath/include/geometry/shape_poly_set.h
@@ -32,6 +32,7 @@
#include <deque> // for deque
#include <iosfwd> // for string, stringstream
#include <memory>
+#include <mutex>
#include <set> // for set
#include <stdexcept> // for out_of_range
#include <stdlib.h> // for abs
@@ -1537,7 +1538,8 @@ protected:
std::vector<POLYGON> m_polys;
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>> m_triangulatedPolys;
- bool m_triangulationValid = false;
+ bool m_triangulationValid = false;
+ std::mutex m_triangulationMutex;
private:
MD5_HASH m_hash;
diff --git a/libs/kimath/src/geometry/shape_poly_set.cpp b/libs/kimath/src/geometry/shape_poly_set.cpp
index 407c43b9c6e..dacc1e8a07c 100644
--- a/libs/kimath/src/geometry/shape_poly_set.cpp
+++ b/libs/kimath/src/geometry/shape_poly_set.cpp
@@ -2984,6 +2984,7 @@ static SHAPE_POLY_SET partitionPolyIntoRegularCellGrid( const SHAPE_POLY_SET& aP
void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>>* aHintData )
{
+ std::unique_lock<std::mutex> lock( m_triangulationMutex );
bool recalculate = !m_hash.IsValid();
MD5_HASH hash;
--
GitLab

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7ea3f18650ce1b5359c685d10245efd95f87fa42ee52a1585bbc22d957617928
size 72453098

3
kicad-8.0.2.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7d26964384300a260b7975207a6ac28d393aeb270d1b837f9eadba95ab940465
size 72713030

View File

@ -1,3 +1,13 @@
-------------------------------------------------------------------
Mon May 6 13:48:13 UTC 2024 - Stefan Brüns <stefan.bruens@rwth-aachen.de>
- update to 8.0.2:
See https://www.kicad.org/blog/2024/04/KiCad-8.0.2-Release/ for details
- Drop upstream patches:
* fix_zone_fill_race.patch
* 0001-Fix-triangulationValid-check-race-for-zone-fill.patch
* libgit2-1.8.0-compatibility.patch
-------------------------------------------------------------------
Wed Mar 27 16:40:26 UTC 2024 - Stefan Brüns <stefan.bruens@rwth-aachen.de>

View File

@ -20,20 +20,14 @@
# symbol libraries from version 8.0.0
%define compatversion 8.0.0
Name: kicad
Version: 8.0.1
%define file_version 8.0.1
Version: 8.0.2
%define file_version 8.0.2
Release: 0
Summary: EDA software suite for the creation of schematics and PCB
License: AGPL-3.0-or-later AND GPL-3.0-or-later
Group: Productivity/Scientific/Electronics
URL: https://www.kicad.org
Source: https://gitlab.com/kicad/code/kicad/-/archive/%{file_version}/kicad-%{file_version}.tar.bz2
# PATCH-FIX-UPSTREAM
Patch1: https://gitlab.com/kicad/code/kicad/-/commit/81cb6d0c3fb92dd15f0a0e0d2d32337be1617399.patch#/fix_zone_fill_race.patch
# PATCH-FIX-UPSTREAM
Patch2: https://gitlab.com/kicad/code/kicad/-/commit/1c459e9a67151a6f028ac3a108b338e850126bfb.patch#/0001-Fix-triangulationValid-check-race-for-zone-fill.patch
# PATCH-FIX-UPSTREAM
Patch3: https://gitlab.com/kicad/code/kicad/-/merge_requests/1882.patch#/libgit2-1.8.0-compatibility.patch
BuildRequires: cmake >= 3.16
BuildRequires: fdupes

View File

@ -1,39 +0,0 @@
From 0b2de7b7072b4b7d2fc577170024cd5326396681 Mon Sep 17 00:00:00 2001
From: Huang Rui <vowstar@gmail.com>
Date: Fri, 22 Mar 2024 18:18:40 +0800
Subject: [PATCH] libgit2-1.8.0 compatibility: adjusted parent pointer type
- Adjusted parent pointer type in git_commit_create call for compatibility
with libgit2 1.8.0 and above.
- Included preprocessor checks to maintain support for versions older than
1.8.0.
- Ensures consistent function behavior across different libgit2 versions.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17536
Signed-off-by: Huang Rui <vowstar@gmail.com>
---
kicad/project_tree_pane.cpp | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/kicad/project_tree_pane.cpp b/kicad/project_tree_pane.cpp
index 6ac4b04034c..99ad026bc9c 100644
--- a/kicad/project_tree_pane.cpp
+++ b/kicad/project_tree_pane.cpp
@@ -2233,7 +2233,14 @@ void PROJECT_TREE_PANE::onGitCommit( wxCommandEvent& aEvent )
}
git_oid oid;
+ // Check if the libgit2 library version is 1.8.0 or higher
+#if ( LIBGIT2_VER_MAJOR > 1 ) || ( LIBGIT2_VER_MAJOR == 1 && LIBGIT2_VER_MINOR >= 8 )
+ // For libgit2 version 1.8.0 and above
+ git_commit* const parents[1] = { parent };
+#else
+ // For libgit2 versions older than 1.8.0
const git_commit* parents[1] = { parent };
+#endif
if( git_commit_create( &oid, repo, "HEAD", author, author, nullptr, commit_msg.mb_str(), tree,
1, parents ) != 0 )
--
GitLab