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:
commit
f75ffd1bba
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
3
kicad-8.0.2.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7d26964384300a260b7975207a6ac28d393aeb270d1b837f9eadba95ab940465
|
||||
size 72713030
|
@ -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>
|
||||
|
||||
|
10
kicad.spec
10
kicad.spec
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user