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>
|
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
|
# symbol libraries from version 8.0.0
|
||||||
%define compatversion 8.0.0
|
%define compatversion 8.0.0
|
||||||
Name: kicad
|
Name: kicad
|
||||||
Version: 8.0.1
|
Version: 8.0.2
|
||||||
%define file_version 8.0.1
|
%define file_version 8.0.2
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: EDA software suite for the creation of schematics and PCB
|
Summary: EDA software suite for the creation of schematics and PCB
|
||||||
License: AGPL-3.0-or-later AND GPL-3.0-or-later
|
License: AGPL-3.0-or-later AND GPL-3.0-or-later
|
||||||
Group: Productivity/Scientific/Electronics
|
Group: Productivity/Scientific/Electronics
|
||||||
URL: https://www.kicad.org
|
URL: https://www.kicad.org
|
||||||
Source: https://gitlab.com/kicad/code/kicad/-/archive/%{file_version}/kicad-%{file_version}.tar.bz2
|
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: cmake >= 3.16
|
||||||
BuildRequires: fdupes
|
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